gpt4 book ai didi

java - Java 中的 RSA 加密,PHP 中的解密

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:00 25 4
gpt4 key购买 nike

假设我有以下 Java 代码来生成公私 key 对:

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();

如何在 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";

邮件解密成功,但是里面有很多奇怪的字符。

我们的场景是一个 Java 客户端,它向 PHP 服务器发送消息,但使用私钥加密数据。 PHP 知道公钥,它应该用来解密和验证消息。

我在 SO 上阅读了很多关于这个问题的帖子,但我开始意识到这是一个有点具体的问题,特别是如果使用不同的算法等等。如果这可能是一个问题,我很抱歉重复。

非常感谢任何反馈!

最佳答案

“RSA 签名”通常不仅仅是“用私钥加密,用公钥解密”,因为像 PKCS#1 这样的公钥协议(protocol)也指定了填充方案,所有签名方案都会加密消息的摘要,而不是完整的消息。如果 java 的签名方案使用 PKCS#1 中指定的签名填充方案,我找不到任何文档,但我怀疑它是。

如果是,您将改为使用 PHP 中的 openssl_verify 方法,已记录 here .如果签名无效或有效,这将分别返回 0 或 1。

如果 Java 不使用填充方案,您的问题是签名中加密的数据是消息的哈希值,而不是消息本身(您可以在 Java 代码中看到它使用 SHA -1 哈希算法)。因此,在 PHP 端,您需要使用 sha1 method 获取消息的 sha1 哈希值。将 $raw_output 设置为 true,并比较这些字符串以确保您的消息有效。

关于java - Java 中的 RSA 加密,PHP 中的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com