【发布时间】:2012-05-07 02:28:40
【问题描述】:
我的 Android 项目中有一些解密问题。
我得到一个用私钥签名的字符串,我必须用公钥验证(解密)它。 我想得到与使用 PHP 函数完全相同的结果 - openssl_public_decrypt (http://php.net/manual/pl/function.openssl-public-decrypt.php)
我必须在我的 Java 项目中这样做,这样我才能使用 Java 库(例如 BouncyCastle 或其他东西,有什么建议吗?)
有什么办法解决这个问题吗?
好的,这是我的代码。 我得到这样的公钥
PEMReader reader = new PEMReader(new InputStreamReader(ctx
.getAssets().open("pubkey.pem")));
Object obj;
while ((obj = reader.readObject()) != null) {
if (obj instanceof RSAPublicKey) {
pubKey = (RSAPublicKey) obj;
return pubKey;
}
}
而且我总是毫无问题地获得公钥。
Cipher c = Cipher.getInstance("RSA/NONE/NoPadding", "SC");
c.init(Cipher.DECRYPT_MODE, pubKey);
byte[] result = c.doFinal(data_to_decrypt.getBytes());
结果(将字节转换为字符串后)我得到022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae...
php 函数返回的地方
sd8dsa348acvcx87|00454|OK|15000|CDE 这是正确的输出。
【问题讨论】:
-
在公钥密码学中:您使用私钥签名和解密/解密;您验证(签名)并使用公钥加密/加密。你想做什么?
-
就像我说的我正在尝试使用公钥解密数据
-
你不能用公钥解密数据,这是没有意义的(尽管 PHP 的命名选择很糟糕)。 “我得到一个用私钥加密的字符串”:这真的没有意义。最好是签了。当然,对于 RSA,它或多或少会是相同的操作(但对于 DSA,情况并非如此)。问题是消息的签名几乎肯定会涉及哈希,因此不可能获取原始消息。
-
好的,假设该字符串已签名,我该如何验证呢?
-
您对签名了解更多吗?使用了哪种哈希算法,例如
RSAwithSHA1?
标签: java php android rsa public-key