2014-01-15 71 views
0

中检查它有一个RSA私钥和一个RSA公钥。如何使用私钥签名并通过公钥在php

两个rsa键都在xml版本中(<RSAKeyValue><Modulus>....);

我需要从私有密钥进行PKCS8签名和PHP

我用这个片段制作签字普布利克关键测试:

$content = "test string"; 
include('Crypt/RSA.php'); 
$rsa = new Crypt_RSA(); 
$rsa->loadKey(file_get_contents("private.txt")); 
$pem_format = $rsa->getPrivateKey(); 
$pvk_res = openssl_get_privatekey($pem_format); 
$sig = ''; 
openssl_sign($content , $sig, $pvk_res, OPENSSL_ALGO_SHA1); 
$signature = base64_encode($sig); 

是制作签名这个正确的方式?

现在怎么用公钥来测试签名的准确性?

+0

http://www.php.net/manual/en/function.openssl-verify.php –

回答

1

PKCS8涉及到关键格式 - 不是签名。

此外,我看到你使用phpseclib将密钥转换为pem,然后使用openssl。为什么不直接使用phpseclib?在这一点上,你可以用这个例子:

http://phpseclib.sourceforge.net/rsa/examples.html#sign,sign2

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
//$rsa->setPassword('password'); 
$rsa->loadKey('...'); // private key 

$plaintext = '...'; 

$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); 
$signature = $rsa->sign($plaintext); 

$rsa->loadKey('...'); // public key 
echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; 
?> 
+0

感谢。但是'$ rsa-> verify($ plaintext,$ signature)'给了我**'未验证'** :( –

+0

是你是否逐字使用该代码或者是否将你认为需要的部分复制/粘贴到自己的库中?如果后者不忘记'$ rsa-> setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1)'。 – neubert

+0

我复制这个逐字而不是'$ rsa-> loadKey('...'); // public key'我用'$ rsa-> loadKey('public.txt'); // public key' and it does not work。当我使用这个'$ rsa-> loadKey('private.txt'); // public key'它工作! !但我想通过公钥检查它,而不是私钥!!! –