编辑:不再需要第二个问题。问题是填充问题的结果;将密码的参数更改为" 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。我有什么遗失的东西吗?
答案 0 :(得分:4)
你这样做完全错了。必须使用 public 键进行加密,并使用私钥进行解密。否则任何人都可以解密它。
扔掉它并使用TLS。