【发布时间】:2021-09-09 04:55:21
【问题描述】:
我尝试编写混合加密来在服务器和客户端之间进行通信。所以我从客户端发送一个公共 RSA 密钥,服务器加密他的 AES 密钥并将其发回。但是如果我在客户端上解密它,密钥比我发送的要长,我不知道为什么......
代码如下:
客户:
socket.getOutputStream().write(security.getKeyPair().getPublic().getEncoded());
byte[] keyBuffer = new byte[512];
socket.getInputStream().read(keyBuffer);
security.setKey(new SecretKeySpec(security.decryptRSA(keyBuffer).getBytes(), "AES"));
服务器:
byte[] keyBuffer = new byte[550];
this.socket.getInputStream().read(keyBuffer);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(keyBuffer));
this.socket.getOutputStream().write(this.security.encryptRSA(this.security.getKey().getEncoded(), publicKey));
安全类方法:
public byte[] encryptRSA(byte[] message, PublicKey key) {
byte[] buffer = message;
try {
this.cipher = Cipher.getInstance("RSA");
this.cipher.init(Cipher.ENCRYPT_MODE, key);
buffer = this.cipher.doFinal(buffer);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return buffer;
}
public String decryptRSA(byte[] message) {
byte[] buffer = message;
try {
this.cipher = Cipher.getInstance("RSA");
this.cipher.init(Cipher.DECRYPT_MODE, this.keyPair.getPrivate());
buffer = this.cipher.doFinal(buffer);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return new String(buffer);
}
谢谢!
【问题讨论】:
-
正确生成的 AES 密钥应该是任意二进制数据,而不是字符——来自 Java
KeyGenerator肯定 的一个是——而 JavaString并非经常用于设计不保留二进制数据。将 AES 密钥视为byte[],而不是String。 -
你得到什么异常?您的应用是否在等待接收/发送一些数据?您似乎以假设长度发送/接收数据。正如已经回答的那样,如果您的密钥包含不可打印的字符,
new String(buffer)肯定会废弃这些
标签: java arrays encryption rsa encryption-asymmetric