因此,我正在尝试使用RSA公钥和私钥对字符串进行加密/解密。它可以很好地加密,但是每当我尝试解密加密的字符串时,我都会得到非常奇怪的输出。例如,“ hello”解密为:
�]t1��#Z�-�-p���h2�5�〜��E'����bh��〜�-I����t.k�>����。 +
v���?NA��y。[@��jp!2p�X@ oZ $ ٥ @@&�v���=�A��e�A�m��; @d �Db�A�!。{�w|�IE�Ì魈S��] �'����88��%������ ��O.N:S
E�J0。 4�l�3�ϓn3�� {。
我不确定我的解密算法是否有问题,或者是否与将解密后的字节转换为字符串(或类似的东西)有关。
这是解密方法:
public String decryptString(PrivateKey key, String string) {
try {
pubDecryptCipher.init(Cipher.DECRYPT_MODE, key);
byte[] decodedBytes = Base64.decodeBase64(string.getBytes());
byte[] unencryptedByteArray = pubDecryptCipher.doFinal(decodedBytes);
return new String(unencryptedByteArray, "UTF8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
加密:
public String encryptString(PublicKey key, String string) {
try {
pubEncryptCipher.init(Cipher.ENCRYPT_MODE, key);
byte[] eba = pubEncryptCipher.doFinal(string.getBytes("UTF8"));
byte[] encodedBytes = Base64.encodeBase64(eba);
return encodedBytes.toString();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
十六进制解密的字符串:
efbfbdefbfbdefbfbdc78d2defbfbd6e2fefbfbdefbfbdefbfbd50efbfbd73efbfbd6defbfbd31efbfbd40117defbfbdefbfbd2cefbfbd576ed39c2aefbfbd41533defbfbdefbfbd1a167c23efbfbdd0a11a3213355eefbfbdefbfbdefbfbd6145efbfbd55efbfbdefbfbd7d09efbfbd700814efbfbdefbfbd687b225eefbfbd3c00efbfbdefbfbd3509efbfbd6c5eefbfbdefbfbd79efbfbdefbfbd033d77efbfbd71efbfbd57efbfbd7e76d6a101efbfbd4aefbfbd4a0540efbfbdefbfbd297f6fefbfbd73efbfbdefbfbdefbfbd010defbfbdefbfbdefbfbd00efbfbd490706efbfbdefbfbdefbfbd322435efbfbd02efbfbdefbfbd1dd79477efbfbd13efbfbdd5bb57efbfbdefbfbd0aefbfbd39404b53efbfbdefbfbd06165aefbfbd32efbfbdefbfbd4665efbfbddd9d6aefbfbd0842efbfbdefbfbd7c35efbfbdefbfbdefbfbd3e7eefbfbdefbfbd11efbfbd1fc7b839efbfbd44efbfbdefbfbd1aefbfbd3a314ac48eefbfbd7cefbfbd77efbfbd097449efbfbdcaa8351aefbfbdefbfbd5befbfbdefbfbd655a62efbfbd3651efbfbdefbfbd41efbfbd64efbfbd1150efbfbd65efbfbd224720060cefbfbd11efbfbdefbfbdefbfbdefbfbd0defbfbd1439efbfbdefbfbd
通过字符串算法,您的意思是:
pubEncryptCipher = Cipher.getInstance("RSA");
pubDecryptCipher = Cipher.getInstance("RSA");
?
最佳答案
问题是encodedBytes.toString()
不能执行您期望的操作。您需要改为new String(encodedBytes, StandardCharsets.ASCII);
。或new String(encodedBytes, Charset.forName("ASCII"));
兼容Java SE 1.7的代码。
您应该始终指示填充模式;请使用"RSA/None/PKCS1Padding"
代替"RSA"
。