Dav*_*idS 5 php java encryption rsa
假设我有以下Java代码来生成Public-private密钥对:
KeyPairGenerator generator = KeyPairGenerator.getInstance ("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
generator.initialize (1024, random);
KeyPair pair = generator.generateKeyPair();
RSAPrivateKey priv = (RSAPrivateKey)pair.getPrivate();
RSAPublicKey pub = (RSAPublicKey)pair.getPublic();
// Sign a message
Signature dsa = Signature.getInstance("SHA1withRSA");
dsa.initSign (priv);
dsa.update ("Hello, World".getBytes(), 0, "Hello, World".length());
byte[] out = dsa.sign();
/* save the signature in a file */
FileOutputStream sigfos = new FileOutputStream("sig");
sigfos.write(out);
sigfos.close();
Run Code Online (Sandbox Code Playgroud)
如何在PHP中解密并解密文件"sig"?我已经阅读了帖子:https://stackoverflow.com/a/1662887/414414,它提供了一个将DER文件转换为PEM(假设我也从Java保存公钥)的函数.
我尝试过类似的东西:
$key = openssl_pkey_get_public ("file://pub_key.pem");
$data = null;
openssl_public_decrypt ( file_get_contents ("sig"), $data, $key);
echo $data, "\n";
Run Code Online (Sandbox Code Playgroud)
它成功解密了消息,但它是许多奇怪的字符.
我们的场景是一个Java客户端,它将消息发送到PHP服务器,但使用私钥加密数据.PHP知道公钥,它应该用来解密和验证消息.
我已经在SO上阅读了很多关于这个问题的帖子,但我已经意识到这是一个特定的问题,特别是如果使用不同的算法等等.很抱歉,如果这可能是重复的.
任何反馈都非常感谢!
“RSA 签名”通常不仅仅是“用私钥加密,用公钥解密”,因为像 PKCS#1 这样的公钥协议也指定了填充方案,并且所有签名方案都会加密消息的摘要,而不是加密消息的摘要。完整的消息。如果java的签名方案使用PKCS#1中指定的签名填充方案,我找不到任何文档,但我怀疑确实如此。
如果是这样,您将需要使用openssl_verifyPHP 中的方法,记录在此处。如果签名无效或有效,则分别返回 0 或 1。
如果 Java 不使用填充方案,您的问题是签名中加密的数据是消息的哈希值,而不是消息本身(您可以在 Java 代码中看到它使用 SHA-1 哈希值)算法)。因此,在 PHP 方面,您需要使用设置为 true 的 sha1 方法获取消息的 sha1 哈希值,并$raw_output比较这些字符串以确保您的消息有效。
| 归档时间: |
|
| 查看次数: |
1888 次 |
| 最近记录: |