Хорошо, прошло довольно много часов.Вот что происходит:
Когда вы вызываете функцию openssl_sign
, PHP внутренне использует API-интерфейс EVP, предоставляемый openssl lib.EVP - это высокоуровневый API для базовых функций, таких как RSA_private_encrypt
.Поэтому, когда вы вызываете base64_encode(openssl_sign('hello', $signature, $privKey))
, это похоже на выполнение чего-то подобного в командной строке с использованием двоичного файла openssl:
echo -n "hello"| openssl dgst -sha1 -sign priv.key | openssl enc -base64
и NOT
echo -n "hello" | openssl dgst -sha1 | openssl rsautl -encrypt priv.key | openssl enc -base64
Iне знаю, почему это дает разные результаты, но это так.Если у кого-то есть идея, почему они отличаются: пожалуйста, поделитесь!
Однако, поскольку я использую инфраструктуру SSCrypto, я переписал функцию -sign (и -verify) с вызовами EVP (аннотация):
OpenSSL_add_all_digests();
EVP_MD_CTX_init(&md_ctx);
EVP_SignInit(&md_ctx, mdtype);
EVP_SignUpdate(&md_ctx, input, inlen);
if (EVP_SignFinal(&md_ctx, (unsigned char*) outbuf, (unsigned int *)&outlen, pkey)) {
NSLog(@"signed successfully.");
}
И вуаля: я получаю те же подписи, что и от PHP.Да, и для справки: PHP использует отступы PKCS.
Спасибо вам, ребята, за то, что направили меня в правильном направлении!