我尝试编写一种混合加密,以在服务器和客户端之间进行通信。因此,我从客户端发送了一个公共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);
}
谢谢!
问题来源:Stack Overflow
问题可能是您不必要地对代码进行了字符串化:
return new String(buffer);
这将以某种方式将缓冲区解释为字符串。但是,密钥由随机字节组成,这些字节可能会解码为意外的字符。然后,您可以使用还原回字节.getBytes(),但是为时已晚。
只需将AES密钥保留为字节即可,该部分应固定。
除此之外,read它与readNBytes(并且read是错误的)不一样,但这可能不是错误;您会遇到RSA问题,而不是AES密钥问题。
请注意,您可以检索以字节为单位的弹性模量大小来确定的字节阅读量,这样你就需要有一个恒定的512或者存在(我会为你写的KEY_SIZE / Byte.SIZE,其中KEY_SIZE = 4096至少表示缓冲区是一样的密钥大小清楚。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。