Я пытаюсь проверить подпись 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;
}
Но я всегда получаю сообщение об ошибке
Вы уверены, что data.txt
не содержит окончательный трейлинг \n
?
Если это не так, добавьте один в строку lietrale в этой строке так:
string message = "data that is to be hashed and signed.\n"; //same as data.txt
Openssl использует ограниченную длину строковых данных, поэтому первый хэш использует sha1, а затем отправляет данные в opensssl