проверить подпись openssl с помощью библиотеки crypto ++

0

Я пытаюсь проверить подпись open-ssl с помощью crypto++, вот часть open-ssl:

$ openssl genrsa 1024 >priv.pem

$ openssl rsa -in priv.pem -pubout -out pubkey.pem

$ openssl dgst -sha1 -sign privkey.pem data.txt > sign

$ openssl dgst -sha1 -verify pubkey.pem -signature sign data.txt
  Verified OK

Теперь в коде C++:

int main(int argc, char* argv[])
{
    try
    {
        RSA::PublicKey publicKey;
        const char * pubFilename = "pubkey.pem";
    FileSource pubFile(pubFilename,true,new PEMStripper(new Base64Decoder()));
    RSASSA_PKCS1v15_SHA_Verifier pub(pubFile);
        cout << "n: " << pub.GetTrapdoorFunction().GetModulus() << endl;
        cout << "e: " << pub.GetTrapdoorFunction().GetPublicExponent() << endl;
        string message = "data that is to be hashed and signed.";  //same as data.txt

        ifstream file ("sign", ios::in | ios::binary | ios::ate);
    ifstream::pos_type sigSize;
    char* sig;
    if(file.is_open())
    {
          sigSize = file.tellg();
          sig = new char[sigSize];
          file.seekg(0, ios::beg);
          if(!file.read(sig, sigSize))
          {
          cout << "fail to read" << endl;
          }
          file.close();
    }
        bool result = pub.VerifyMessage( (const byte*)message.c_str(),
            message.length(), (const byte*)sig, sigSize );

        // Result
        if( true == result ) {
            cout << "Signature on message verified" << endl;
        } else {
            cout << "Message verification failed" << endl;
        }

    } // try

    catch( CryptoPP::Exception& e ) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

Но я всегда получаю сообщение об ошибке

Теги:
encryption
rsa
openssl

2 ответа

1
Лучший ответ

Вы уверены, что data.txt не содержит окончательный трейлинг \n?

Если это не так, добавьте один в строку lietrale в этой строке так:

string message = "data that is to be hashed and signed.\n";  //same as data.txt
  • 0
    Благодаря тонну! Я собирался вырвать мои волосы.
0

Openssl использует ограниченную длину строковых данных, поэтому первый хэш использует sha1, а затем отправляет данные в opensssl

Ещё вопросы

Сообщество Overcoder
Наверх
Меню