尝试让非对称 RSA 加密工作
Trying to get asymmetric RSA encryption to work
以下方法无效。 decodedMessage 以垃圾结束,而不是预期的结果。
我正在关注一个据称可行的示例 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();
}
}
如有任何帮助,我们将不胜感激。
谢谢,
院长
当然你得到的是垃圾,这是你的序列:
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 编码。
我还发现如果使用 2048 位密钥,使用直接 RSA 最多只能加密 245 字节。如果我使用 1024 位密钥,则更少。
如果需要使用非对称 Public/Private 密钥加密较大的字符串,那么我需要先使用对称 AES 加密字符串,然后使用 public RSA 密钥加密 AES 密钥,然后发送加密的 AES 密钥和加密的消息,接收者可以在其中使用他们的私有 RSA 密钥解密 AES 密钥。 AES密钥可以在发送码中随机生成。
以下方法无效。 decodedMessage 以垃圾结束,而不是预期的结果。
我正在关注一个据称可行的示例 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();
}
}
如有任何帮助,我们将不胜感激。 谢谢, 院长
当然你得到的是垃圾,这是你的序列:
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 编码。
我还发现如果使用 2048 位密钥,使用直接 RSA 最多只能加密 245 字节。如果我使用 1024 位密钥,则更少。
如果需要使用非对称 Public/Private 密钥加密较大的字符串,那么我需要先使用对称 AES 加密字符串,然后使用 public RSA 密钥加密 AES 密钥,然后发送加密的 AES 密钥和加密的消息,接收者可以在其中使用他们的私有 RSA 密钥解密 AES 密钥。 AES密钥可以在发送码中随机生成。