问题描述
我正在尝试构建多播套接字组中的多个用户可以聊天的群聊应用程序。我通过 AES 加密消息然后通过 RSA 加密 AES 密钥来执行加密。
但是在接收方,当我尝试通过 RSA 解密获取 AES 密钥时,我在行 (cipher.dofinal(text)) 处遇到了解密错误。我无法理解错误。我什至以字节为单位检查了每个键的大小,但没有数学错误。请指导我完成它
import java.net.*;
import java.io.*;
import java.util.*;
import javax.crypto.Cipher;
//import javax.crypto.KeyGenerator;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
class Security
{
public static KeyPair generateRSAkeyPair() throws Exception
{
//SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//KeyGenerator keyGenerator = KeyGenerator.getInstance("RSA");
keyPairGenerator.initialize(4096);
KeyPair pair = keyPairGenerator.generateKeyPair();
return pair;
}
public static byte[] AESEncryption(String plaintext,SecretKey secKey) throws Exception
{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,secKey);
byte[] cipherText = cipher.doFinal(plaintext.getBytes());
return cipherText;
}
public static byte[] RSAEncryption(PrivateKey privateKey,SecretKey key) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
//cipher.update(plaintext.getBytes());
byte [] encryptedKey = cipher.doFinal(key.getEncoded());
//System.out.println(encryptedKey.length);
return encryptedKey;
}
public static byte[] RSADecryption(byte[] encryptedKey,PublicKey publicKey) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE,publicKey);
//byte check[] = cipher.doFinal(encryptedKey);
//System.out.println(check.length);
return cipher.doFinal(encryptedKey);
}
public static String AESDecryption(byte[] decryptedKey,byte[] text) throws Exception
{
SecretKey originalKey = new SecretKeySpec(decryptedKey,decryptedKey.length,"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE,originalKey);
byte[] plaintext = cipher.doFinal(text);
return new String(plaintext);
}
KeyPair keyPair;
SecretKey key;
Security()
{
try{
//@SuppressWarnings("unused")
keyPair = generateRSAkeyPair();
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(128); // The AES key size in number of bits
key = generator.generateKey();
}catch(Exception e) {
System.out.println(e);
}
}
static Security s = new Security();
}
public class Symmetra extends Security
{
private static final String TERMINATE = "Exit";
static String name;
static volatile boolean finished = false;
public static void main(String[] args) throws Exception
{
if (args.length != 2)
System.out.println("Two arguments required: <multicast-host> <port-number>");
else
{
try
{
//KeyPair keyPair = generate();
//Security s = new Security();
//SecretKey key = createAESKey();
InetAddress group = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
Scanner sc = new Scanner(system.in);
System.out.print("Enter your name: ");
//SocketAddress group = new SocketAddress(args[0],port);
name = sc.nextLine();
MulticastSocket socket = new MulticastSocket(port);
socket.setTimetoLive(3);
socket.joinGroup(group);
Thread t = new Thread(new ReadThread(socket,group,port));
t.start();
System.out.println("Start typing messages...\n");
while(true)
{
String message;
message = sc.nextLine();
if(message.equalsIgnoreCase(Symmetra.TERMINATE))
{
finished = true;
socket.leaveGroup(group);
socket.close();
break;
}
//message = name + ": " + message;
//byte[] cipherText = RSAEncryption(message,keyPair.getPrivate());
byte[] cipherText = AESEncryption(message,s.key);
byte[] encryptedKey = RSAEncryption(s.keyPair.getPrivate(),s.key);
System.out.println(cipherText.length + " " + encryptedKey.length);
//byte[] buffer = message.getBytes();
DatagramPacket datagram = new
DatagramPacket(cipherText,cipherText.length,port);
DatagramPacket datagram2 = new
DatagramPacket(encryptedKey,encryptedKey.length,port);
socket.send(datagram);
socket.send(datagram2);
}
}
catch(SocketException se)
{
System.out.println("Error creating socket");
se.printstacktrace();
}
catch(IOException ie)
{
System.out.println("Error reading/writing from/to socket");
ie.printstacktrace();
}
}
}
}
class ReadThread extends Security implements Runnable
{
private MulticastSocket socket;
private InetAddress group;
private int port;
private static final int MAX_LEN = 1000;
ReadThread(MulticastSocket socket,InetAddress group,int port)
{
this.socket = socket;
this.group = group;
this.port = port;
}
@Override
public void run()
{
while(!Symmetra.finished)
{
//KeyPair keyPair;
//SecretKey key;
try {
//keyPair = generate();
//key = createAESKey();
byte[] buffer = new byte[ReadThread.MAX_LEN];
DatagramPacket datagram = new
DatagramPacket(buffer,buffer.length,port);
byte[] keyBuffer = new byte[512];
DatagramPacket datagram2 = new
DatagramPacket(keyBuffer,keyBuffer.length,port);
String message;
try
{
socket.receive(datagram);
socket.receive(datagram2);
byte[] decryptKey = RSADecryption(keyBuffer,s.keyPair.getPublic());
String decryptText = AESDecryption(decryptKey,buffer);
//message = new String(decryptText,datagram.getLength(),"UTF-8");
message = decryptText;
if(!message.startsWith(Symmetra.name))
System.out.println(message);
}
catch(IOException e)
{
System.out.println("Socket closed!");
}
}
catch (Exception e1) {
// Todo Auto-generated catch block
e1.printstacktrace();
}
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)