以下方法不起作用。 decodeMessage最终会使用垃圾而不是预期的结果。
我正在关注一个可能有效的例子here。
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();
}
}
任何帮助都将非常感激。 谢谢, 迪安
答案 0 :(得分: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);
答案 1 :(得分:1)
事实证明,在我的原始代码中,decodingBytes包含正确解密的字节。以下命令将decodeBytes转换为垃圾字符......
decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);
我用...替换了那段代码。
String str = new String(decodedBytes, "UTF-8");
这解决了这个问题,可能是因为decodeBytes从来没有进行过Base64编码。
我还发现使用直接RSA我只能使用2048位密钥加密最多245个字节。如果我使用1024位密钥,则会减少。
如果需要使用非对称公钥/私钥加密更大的字符串,那么我需要首先使用对称AES加密字符串,然后使用公共RSA密钥加密AES密钥,并将加密的AES密钥和加密的消息一起发送接收器可以使用其私有RSA密钥解密AES密钥的线路。 AES密钥可以在发送代码中随机生成。