解密的字符串包含有效字符和无效字符
Decrypted String has valid and invalid characters
我正在使用以下代码解密 RSA 加密的 base64 编码字符串。然而,解密的字符串有一些 无效字符 放在真实字符串的前面。我一直在试图找出可能导致这些垃圾数据出现的原因,但我在这方面的专业知识有限限制了我。
在终端中使用 openssl 使用以下命令对数据进行加密。
使用的 OpenSSL 命令:
openssl genrsa -out priv_key.pem 2048
openssl rsa -pubout -in priv_key.pem -out pub_key.pem
openssl rsautl -encrypt -in userdata.json -out user_encrypted_with_pub_key -inkey pub_key.pem –pubin
我唯一以编程方式做的事情就是解码使用上述命令加密的数据。我正在使用最新版本的 bouncyCastle。
代码:
decipherString(priv, decodeBase64(base64StringBuilder.toString()).toByteArray());
private static void decipherString(PrivateKey privateKey, byte[] encodedStringData) {
byte[] dectyptedText = null;
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
dectyptedText = cipher.doFinal(encodedStringData);
Timber.w("Deciphered text is: %s", new String(dectyptedText, "UTF-8"));
}
catch (Exception e) {
e.printStackTrace();
}
}
输出:
T1.O�Y1�{��l�M�X�`�������/9����Z��yt�戋��Eo�� Z3����~7A����rtj)j��x')��e��/��$iJ����;����1&��I��U��#��$����} ��C������4P����E��-ρ������?wQ����Z��b��Py��%��>��I��X����TqDv��_�� ����{ "ssid": "PT", "password": "XYZ123", "security": "WPA2" }
永远,永远不要这样做:
Cipher cipher = Cipher.getInstance("RSA");
始终指定完整的转换字符串:“algorithm/mode/padding”。不这样做将导致 non-portable 代码,因为默认值为 provider-specific。在您的情况下,默认值相当于
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
但这不是您需要的。 openssl rsautl
默认使用PKCS#1 v1.5加密填充,所以你需要的是
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
我正在使用以下代码解密 RSA 加密的 base64 编码字符串。然而,解密的字符串有一些 无效字符 放在真实字符串的前面。我一直在试图找出可能导致这些垃圾数据出现的原因,但我在这方面的专业知识有限限制了我。
在终端中使用 openssl 使用以下命令对数据进行加密。
使用的 OpenSSL 命令:
openssl genrsa -out priv_key.pem 2048
openssl rsa -pubout -in priv_key.pem -out pub_key.pem
openssl rsautl -encrypt -in userdata.json -out user_encrypted_with_pub_key -inkey pub_key.pem –pubin
我唯一以编程方式做的事情就是解码使用上述命令加密的数据。我正在使用最新版本的 bouncyCastle。
代码:
decipherString(priv, decodeBase64(base64StringBuilder.toString()).toByteArray());
private static void decipherString(PrivateKey privateKey, byte[] encodedStringData) {
byte[] dectyptedText = null;
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
dectyptedText = cipher.doFinal(encodedStringData);
Timber.w("Deciphered text is: %s", new String(dectyptedText, "UTF-8"));
}
catch (Exception e) {
e.printStackTrace();
}
}
输出:
T1.O�Y1�{��l�M�X�`�������/9����Z��yt�戋��Eo�� Z3����~7A����rtj)j��x')��e��/��$iJ����;����1&��I��U��#��$����} ��C������4P����E��-ρ������?wQ����Z��b��Py��%��>��I��X����TqDv��_�� ����{ "ssid": "PT", "password": "XYZ123", "security": "WPA2" }
永远,永远不要这样做:
Cipher cipher = Cipher.getInstance("RSA");
始终指定完整的转换字符串:“algorithm/mode/padding”。不这样做将导致 non-portable 代码,因为默认值为 provider-specific。在您的情况下,默认值相当于
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
但这不是您需要的。 openssl rsautl
默认使用PKCS#1 v1.5加密填充,所以你需要的是
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");