以下方法不起作用。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();
}
}
任何帮助将是最感激的。谢谢,院长
当然你得到的是垃圾,这是你的序列:
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);
原来在我的原始代码中,decodedBytes包含正确解密的字节。下面的命令将decodedBytes转换为垃圾字符…
decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);
我将代码替换为…
String str = new String(decodedBytes, "UTF-8");
这解决了这个问题,可能是因为decodedBytes从一开始就没有被Base64编码过。
我还发现,使用直接RSA,如果我使用2048位密钥,我只能加密最多245字节。如果我使用1024位的密钥,会更少。
如果更大的字符串需要使用非对称公钥/私钥加密,那么我需要首先使用对称AES加密字符串,然后用公共RSA密钥加密AES密钥,并在接收方可以使用其私有RSA密钥解密AES密钥的地方发送加密的AES密钥和加密的消息。AES密钥可以在发送码中随机生成。