使用phpseclibvalidation在Java(Android)中生成的SHA1withRSA签名

这就是我想要做的:

  • 在Java / Android中生成512位RSA密钥对
  • 为Java中的某些消息生成SHA1withRSA签名
  • 向PHP发送消息,签名和公钥(用于测试这将同时完成)
  • 使用phpseclibvalidationPHP中的消息

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

在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 nameValuePairs = new ArrayList(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编码的键以换行符结束。

 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通知“无效的签名”,结果是“未经validation”。

我已经在PHP方面测试了不同的变体,例如在将公钥交给loadKey(…)之前对base64进行解码,而不是对解密签名进行base64解码,而不留下“—– BEGIN PUBLIC KEY- —- \ n“事情,但到目前为止没有任何帮助。

那么我需要做些什么来使这项工作?

编辑:现在它的作品!

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