gpt4 book ai didi

java - 使用 phpseclib 验证在 Java (Android) 中生成的 SHA1withRSA 签名

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:38 27 4
gpt4 key购买 nike

这就是我想要做的:

  • 在 Java/Android 中生成一个 512 位 RSA key 对
  • 用 Java 为一些消息生成 SHA1withRSA 签名
  • 向 PHP 发送消息、签名和公钥(同时进行测试)
  • 使用 phpseclib 在 PHP 中验证消息

到目前为止我得到了什么:

在 Java 方面:

String msg = "Test message";

// generate keypair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(512);
KeyPair keyPair = keyGen.generateKeyPair();

// generate signature
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(keyPair.getPrivate(), SecureRandom.getInstance("SHA1PRNG"));
signature.update(msg.getBytes());
byte[] sigBytes = signature.sign();

// send message, signature and public key to php script
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(uploadNum + 1);
nameValuePairs.add(new BasicNameValuePair("msg", msg));
nameValuePairs.add(new BasicNameValuePair("signature", Base64.encodeToString(sigBytes,
Base64.DEFAULT)));
nameValuePairs.add(new BasicNameValuePair("pubkey", Base64.encodeToString(keyPair
.getPublic().getEncoded(), Base64.DEFAULT)));

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(UPLOAD_SCRIPT);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);

在 PHP 方面:

编辑: 正如 neubert 提到的,解决方案是添加 $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);。此外,我在 $_POST['pubkey'] 周围添加了 trim 函数,因为我注意到 base64 编码的 key 以换行符结尾。

include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$rsa->loadKey("-----BEGIN PUBLIC KEY-----\n" . trim($_POST['pubkey']) . "\n-----END PUBLIC KEY-----");
echo $rsa->verify($_POST['msg'], base64_decode($_POST['signature'])) ? 'verified' : 'unverified';

发生的事情是:

phpseclib 给我一个 php 通知“无效的签名”,结果是“未验证”。

我已经在 PHP 端使用不同的变体对此进行了测试,例如base64-在将其交给 loadKey(...) 之前解码公钥,而不是 base64-解码签名,留下“-----BEGIN PUBLIC KEY-----\n”的东西,但没有任何帮助远。

那么我需要做什么才能使这项工作正常进行?

编辑:现在可以了!

最佳答案

$_POST['msg'] 似乎也需要进行 base64_decode() 处理?另外,尝试执行 $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1)。默认情况下,phpseclib 执行 OAEP 填充,虽然更安全,但没有得到广泛支持,也不是大多数东西的默认设置。

关于java - 使用 phpseclib 验证在 Java (Android) 中生成的 SHA1withRSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763260/

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