问题描述
以下方法不起作用。 最后,decodedMessage带有垃圾,而不是预期的结果。
我在遵循一个可以正常工作的示例。
public static void POCSimple()
{
String secretMessage = "short message";
PublicKey publicKey = null;
PrivateKey privateKey = null;
String encodedMessage = "";
byte[] encodedBytes = null;
String decodedMessage ="";
byte[] decodedBytes = null;
try
{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();
Cipher c1 = Cipher.getInstance("RSA");
c1.init(Cipher.ENCRYPT_MODE, publicKey);
encodedBytes = c1.doFinal(secretMessage.getBytes());
encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT);
Cipher c2 = Cipher.getInstance("RSA");
c2.init(Cipher.DECRYPT_MODE, privateKey);
decodedBytes = c2.doFinal(encodedBytes);
decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);
String mystring = "look at results";
}
catch (Exception e)
{
String status = e.toString();
}
}
非常感激任何的帮助。 谢谢院长
1楼
当然您会收到垃圾,这是您的顺序:
Plaintext message -> Encrypt -> Encode -> Encoded message
Encoded message -> Decrypt -> Decode -> GARBAGE
您需要先撤消Base64编码,然后才能解密消息,这是以错误的顺序执行反向过程的!
编辑
实际上更糟的是,这是您的顺序:
Plaintext message -> Encrypt -> Encode -> Encoded message
Encrypted message -> Decrypt -> Encode -> GARBAGE
尝试这个:
Cipher c1 = Cipher.getInstance("RSA");
c1.init(Cipher.ENCRYPT_MODE, publicKey);
encodedBytes = c1.doFinal(secretMessage.getBytes());
encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT);
Cipher c2 = Cipher.getInstance("RSA");
c2.init(Cipher.DECRYPT_MODE, privateKey)
decodedBytes = Base64.decode(encodedMessage.toByteArray(), Base64.DEFAULT);
decryptedMessage = c2.doFinal(decodedBytes);
2楼
原来,在我的原始代码中,decodedBytes包含正确解密的字节。 下面的命令是将decodedBytes变成垃圾字符...
decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);
我用...替换了该代码
String str = new String(decodedBytes, "UTF-8");
这就解决了这个问题,可能是因为最初从未对decodedBytes进行过Base64编码。
我还发现,如果使用2048位密钥,使用直接RSA只能加密最多245个字节。 如果我使用1024位密钥,则更少。
如果需要使用非对称的公钥/私钥对较大的字符串进行加密,那么我首先需要使用对称的AES对字符串进行加密,然后使用公共RSA密钥对AES密钥进行加密,并通过网络同时发送加密的AES密钥和加密的消息,其中接收者可以使用其专用RSA密钥解密AES密钥。 AES密钥可以在发送代码中随机生成。