编辑:不再需要第二个问题 . 问题是填充问题的结果;将密码的参数更改为“RSA / ECB / PKCS1Padding”修复它,这已经在其他使用的密码中实现了 .
对于学校作业,我必须在Java(客户端和服务器)中创建两个程序,这两个程序使用RSA非对称加密来创建和同意使用DES加密的会话密钥 . 交换机中的最终消息包含由客户端生成的密钥,该密钥由客户端的私钥加密,然后使用服务器的公钥再次加密 . 然后,服务器可以使用其私钥解密消息,然后使用客户端的公钥再次解密,以获取DES密钥 . 但是,第一次加密导致大小为256的字节数组,第二次加密需要一个小于该字节数组的字节数组 . 有没有办法操纵数据,以便我可以加密密钥两次,如赋值中指定的那样?请注意,这是一项要求,对会话密钥使用DES算法也是如此 .
另外,忽略第二加密,使得允许客户端和服务器彼此发送加密消息的分配的下一部分产生另一个问题 . 目前,客户端使用服务器的公钥来包装密钥,然后服务器使用其私钥对其进行解包 . 但是,在服务器端解包会话密钥会产生InvalidKeyException;解包的密钥长度是256字节,这是完全错误的 .
在服务器端,我有:
byte[] m4 = new byte[256];
datIn.read(m4);
cUwp.init(Cipher.UNWRAP_MODE, myKey);
ks = (SecretKey)cUwp.unwrap(m4, "DES", Cipher.SECRET_KEY);
System.out.println("Recieved key:\n" + ks);
try{
Cipher desCipher = Cipher.getInstance("DES");
desCipher.init(Cipher.DECRYPT_MODE, ks);
}
catch(NoSuchPaddingException|InvalidKeyException e){
System.out.println("Error: " + e);
}
在客户端:
KeyGenerator keygen = KeyGenerator.getInstance("DES");
SecretKey key = keygen.generateKey();
cWrp.init(Cipher.WRAP_MODE, theirKey);
byte[] m4 = cWrp.wrap(key);
datOut.write(m4);
ks = key;
try{
Cipher desCipher = Cipher.getInstance("DES");
desCipher.init(Cipher.DECRYPT_MODE, ks);
}
catch(NoSuchPaddingException|InvalidKeyException e){
System.out.println("Error: " + e);
}
我的代码的任何其他部分都没有出现任何大小差异;任何其他解密的消息都是正确的大小,但没有一个使用wrap()方法,因为它们是字符串而不是SecretKeys . 有什么东西我不见了吗?