RSA 加密 - 字节数组和字符串之间的转换
RSA encyrption - converting between bytes array and String
我正在尝试实施能够执行以下操作的 RSA 加密:
- 接受字符串值作为输入以使用 public 密钥进行加密
- return 加密后的密码为字符串
- 接受加密的密码作为使用私钥解密的输入
- return原值,解密后
如果我直接解密 byte
数组 return 通过加密,我能够使 encryption/decryption 工作,但如果我解析byte
数组到 String
,然后再次回到 byte
s。
以下代码可以工作:
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));
此代码片段应该可以工作
我正在尝试实施能够执行以下操作的 RSA 加密:
- 接受字符串值作为输入以使用 public 密钥进行加密
- return 加密后的密码为字符串
- 接受加密的密码作为使用私钥解密的输入
- return原值,解密后
如果我直接解密 byte
数组 return 通过加密,我能够使 encryption/decryption 工作,但如果我解析byte
数组到 String
,然后再次回到 byte
s。
以下代码可以工作:
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));
此代码片段应该可以工作