Проблема с проверкой phpseclib sha256

У меня возникают проблемы с использованием phpseclib для проверки подписи, использованной в примере, приведенном в приложении A.2.2 к http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-38. Значения, используемые как модуль, экспонента, подпись и 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 ответ

Решение

Проблема в том, что n и, возможно, частный показатель отрицательны.

Модульная арифметика не работает с отрицательным модулем. Это зависит от библиотеки, если это проблема. Крипто-специфичные библиотеки BN_ в OpenSSL предназначены только для положительных значений, но другие библиотеки, использующие реализацию с двумя дополнениями, то есть с отрицательными значениями, такими как Java, имеют те же проблемы.

Вы всегда можете просто поставить префикс байта с нулевым значением для любого числа, используемого в RSA. RSA основан на модульной арифметике и не использует отрицательные значения ни для одного из компонентов ключа.

Другие вопросы по тегам