问题与phpseclib sha256验证

时间:2014-12-19 18:44:09

标签: cryptography rsa digital-signature phpseclib

我无法使用phpseclib来验证http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-38附录A.2.2中记录的示例中使用的签名。用作模数,指数,签名和tobesigned的值来自规范的附录。签名确实在使用.NET时验证,并且已经创建了规范的几个实现,因此我假设输入有效。我以前没有使用phpseclib的经验,不得不猜测如何加载密钥,并找到简约的文档,以便您的帮助非常感谢!

// per guzmar converts the encoding used in the ietf specification to a string
function cpim_base64url_decode($data) { 
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, 
            '=', STR_PAD_RIGHT)); 
} 

$rsa = new Crypt_RSA();

$publicKeyUrlEncoded = "ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ";
$exponentUrlEncoded = "AQAB";
$publicKeyString = base64url_decode($publicKeyUrlEncoded);
$exponentString = base64url_decode($exponentUrlEncoded);

$pk = array(
   'e' => new Math_BigInteger($exponentString, -256),
   'n' => new Math_BigInteger($publicKeyString, -256)
);

$rsa->setHash('sha256');
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);

$tobesignedString   = 'eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ';
$signatureUrlEncoded = "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"; 
$signatureString = base64url_decode($signatureUrlEncoded);

$keyloadResult = $rsa->loadKey($pk, CRYPT_RSA_PUBLIC_FORMAT_RAW);

$result = $rsa->verify($tobesignedString, $signatureString) ? 'verified' : 'unverified';

1 个答案:

答案 0 :(得分:1)

问题是n和私人指数可能是负面的。

模数运算不适用于负模数。如果这是一个问题,这取决于库。 OpenSSL的加密特定BN_库仅用于正值,但使用双补码实现的其他库 - 即具有负值(如Java)具有相同的问题。

对于RSA中使用的任何数字,您可以始终为零值字节添加前缀。 RSA基于模运算,不对键的任何组件使用负值。