2014-02-21 5 views
0

Я пытаюсь использовать OpenSSL для проверки подписи, которая была создана с использованием SHA256 с RSA (в частности, реализация Java в Signature.getInstance("SHA256withRSA")). У меня также есть строки, представляющие шестнадцатеричные формы показателя открытого ключа и модуля. (Например, показатель составляет «010001», что соответствует 65537.) Вот код.Проверка подписи с OpenSSL

int verify(string &plaintext, string &exp, string &mod, string &sig) { 
    RSA *pub_key = RSA_new(); 
    if (!BN_hex2bn(&pub_key->n, mod.c_str())) 
    exit(1); 
    if (!BN_hex2bn(&pub_key->e, exp.c_str())) 
    exit(1); 
    int verified = RSA_verify(
     NID_sha256, 
     reinterpret_cast<const unsigned char *>(plaintext.data()), 
     plaintext.size(), 
     reinterpret_cast<const unsigned char *>(sig.data()), 
     sig.size(), 
     pub_key); 
    RSA_free(pub_key); 
    return verified; 
} 

Я также попытался SHA256-хеширования открытого текста первого и переходя, что RSA_verify (наряду с SHA256_DIGEST_LENGTH), но это не сработало.

unsigned char hash[SHA256_DIGEST_LENGTH]; 
SHA256_CTX sha256; 
SHA256_Init(&sha256); 
SHA256_Update(&sha256, plaintext.data(), plaintext.size()); 
SHA256_Final(hash, &sha256); 
// use hash instead of plaintext in call to verify 

К сожалению, обе реализации возвращают 0. Могу ли я делать что-то здесь не так, или это кажется вероятным, что один из моих входов не так?

ответ

1

Хорошо, я понял. Оказывается, мой вклад был плохим. Подпись не была закодирована так, как я думал.

Как только я получил правильную подпись, мне пришлось использовать hash и SHA256_DIGEST_LENGTH в качестве входов сообщений.

Смежные вопросы