【发布时间】:2012-12-22 05:28:35
【问题描述】:
我加密/解密如下消息: 加密字符串 -> base64 编码字节 -> 序列化字符串 -> 反序列化字符串 -> 解码 b64 -> 解密字节。
加密如下:
PublicKey pubKey = readPublicKey();
Cipher cipher;
cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData;
cipherData = cipher.doFinal(message.getBytes());
return cipherData;
解密是这样完成的:
PrivateKey pk = readPrivateKey();
Cipher cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.DECRYPT_MODE, pk);
return new String(cipher.doFinal(data));
键是这样读取的:
ObjectInputStream oin =
new ObjectInputStream(new BufferedInputStream(is));
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privKey = fact.generatePrivate(keySpec);
return privKey;
我在这里省略了 b64 的东西,但我已经验证问题不会影响该代码。
现在发生的事情是我实际上得到了正确的答案,但它前面带有二进制乱码。如果我加密“TESTDATA”,我将得到 TESTDATA。该代码在纯 Java 中运行良好,但在 Android 中失败。有谁知道如何解决这一问题?
编辑:使用 RSA/NONE/NoPadding 加密/解密似乎没有帮助。我还在普通 JRE 中使用 org.bouncycastle。
【问题讨论】:
-
@Milos:这似乎很合理,但是当我使用“RSA/NONE/NoPadding”加密/解密时它不起作用。输出都是乱码。我错过了什么吗?生成密钥时是否需要更改某些内容?
-
@navlelo,尝试打印出生成的密钥,看看是否一切都符合这个要求。
-
@navlelo:这个网站上肯定有 200 个问题,其他问题是程序员使用默认值而不知道它们的含义。不要使用默认值。
message.getBytes()是做什么的?它使用 platform 默认字符集。new String(byte[])构造函数有什么作用?它还使用默认平台字符集。那你在做什么?您正在尝试在不同的平台上运行您的代码!始终指定字符集。您始终可以使用“UTF-8”。Cipher.getInstance("RSA")也是如此。为什么要关闭模式和填充?你只是自找麻烦。