x-r*_*ray 5 php java android rsa signature
这就是我想要做的:
到目前为止我得到了什么:
在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);
Run Code Online (Sandbox Code Playgroud)
在PHP方面:
编辑:正如neubert所说,解决方案是添加$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);.另外我添加了trim函数,$_POST['pubkey']因为我注意到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';
Run Code Online (Sandbox Code Playgroud)
会发生什么:
phpseclib给了我一个php通知"无效的签名",结果是"未经验证".
我已经在PHP方面用不同的变体对它进行了测试,例如在将公钥交给loadKey(...)之前解码公钥,而不是base64解码签名,留下"----- BEGIN PUBLIC KEY- ---- \n"事情,但到目前为止没有任何帮助.
那么我需要做些什么来完成这项工作呢?
编辑:现在它的作品!
似乎 $_POST['msg'] 也可能需要进行 base64_decode() 处理?另外,尝试做$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1). 默认情况下,phpseclib 会执行 OAEP 填充,虽然更安全,但并未得到广泛支持,也不是大多数内容的默认设置。
| 归档时间: |
|
| 查看次数: |
6899 次 |
| 最近记录: |