开发者社区> 问答> 正文

为什么在Java中加密的RSA字节是变量?

我尝试编写一种混合加密,以在服务器和客户端之间进行通信。因此,我从客户端发送了一个公共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

展开
收起
montos 2020-03-27 22:26:21 494 0
1 条回答
写回答
取消 提交回答
  • 问题可能是您不必要地对代码进行了字符串化:

       return new String(buffer);
    

    这将以某种方式将缓冲区解释为字符串。但是,密钥由随机字节组成,这些字节可能会解码为意外的字符。然后,您可以使用还原回字节.getBytes(),但是为时已晚。

    只需将AES密钥保留为字节即可,该部分应固定。

    除此之外,read它与readNBytes​(并且read是错误的)不一样,但这可能不是错误;您会遇到RSA问题,而不是AES密钥问题。

    请注意,您可以检索以字节为单位的弹性模量大小来确定的字节阅读量,这样你就需要有一个恒定的512或者存在(我会为你写的KEY_SIZE / Byte.SIZE,其中KEY_SIZE = 4096至少表示缓冲区是一样的密钥大小清楚。

    回答来源:Stack Overflow

    2020-03-27 22:26:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载