RSA 加密 - 字节数组和字符串之间的转换

RSA encyrption - converting between bytes array and String

我正在尝试实施能够执行以下操作的 RSA 加密:

如果我直接解密 byte 数组 return 通过加密,我能够使 encryption/decryption 工作,但如果我解析byte 数组到 String,然后再次回到 bytes。

以下代码可以工作:

cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherBytes = cipher.doFinal(input);
System.out.println("cipher: " + new String(cipherBytes));
returnValue += new String(cipherBytes);

cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher.doFinal(cipherBytes);
System.out.println("plain : " + new String(plainText));

以下代码工作:

byte[] cipherBytes = cipher.doFinal(input);
System.out.println("cipher: " + new String(cipherBytes));
returnValue += new String(cipherBytes);

String cipherText = new String(cipherBytes);
byte[] reCipherBytes = cipherText.getBytes();

cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plainText = cipher.doFinal(reCipherBytes);
System.out.println("plain : " + new String(plainText));

任何人都可以告诉我需要做什么才能使第二个版本成功运行吗?

我认为你的问题是因为在将字节数组转换为字符串时默认的 java ecoding/deconding 字符集,反之亦然。

我已经调试了你的代码,reCipherBytes 的长度与cipherBytes 的长度不同,这就是第二个代码块抛出异常的原因。

我建议您使用 base64 编码将 cipherBytes 转换为字符串。

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] cipherBytes = cipher.doFinal(input);
    System.out.println("cipher: " + new String(cipherBytes));
    String returnValue = new String(cipherBytes);

    String cipherText = Base64.getEncoder().encodeToString(cipherBytes);
    byte[] reCipherBytes = Base64.getDecoder().decode(cipherText);

    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    byte[] plainText = cipher.doFinal(reCipherBytes);
    System.out.println("plain : " + new String(plainText));

此代码片段应该可以工作