2015-01-23 2 views
3

У меня возникли проблемы с подписями/проверкой строки с Crypto ++. Я пробовал методы, перечисленные на этом веб-сайте, среди других, в течение нескольких месяцев, без успеха. Я ранее пробовал решение стиля C, размещенное здесь: http://www.cryptopp.com/wiki/Elliptic_Curve_Digital_Signature_Algorithm, но в настоящее время я работаю над реализацией с использованием фильтров.ECDSA Неправильно подписание/проверка

Моя попытка ниже является модификацией решения, размещенной здесь: Get ECDSA signature with Crypto++.

Следующий код выводит ошибку: ERROR: VerifierFilter: digital signature not valid

ECDSA<ECP, SHA256>::PrivateKey privateKey; 
ECDSA<ECP, SHA256>::PublicKey publicKey; 

AutoSeededRandomPool prng, rrng; 

privateKey.Initialize(prng, CryptoPP::ASN1::secp256k1()); 

privateKey.MakePublicKey(publicKey); 

string signature; 

signature.erase(); 

string message = "Do or do not. There is no try."; 

StringSource(message, true, 
    new SignerFilter(rrng, 
    ECDSA<ECP, SHA256>::Signer(privateKey), 
    new StringSink(signature))); 

try 
{ 
    StringSource(signature + message, true, 
     new SignatureVerificationFilter(
     ECDSA<ECP, SHA256>::Verifier(publicKey), NULL, 
     SignatureVerificationFilter::THROW_EXCEPTION 
     ) // SignatureVerificationFilter 
     ); // StringSource 
} 
catch (CryptoPP::Exception& e) 
{ 
    std::cerr << "\n\nERROR: " << e.what() << std::endl; 
} 

Любая помощь приветствуется, спасибо.

ответ

3

После просмотра вики дольше, я думаю, что, возможно, наткнулся на решение.

http://www.cryptopp.com/wiki/SignatureVerificationFilter#Signature_Generation_and_Verification

In the example above, the filter receives a concatenation of message+signature. When SIGNATURE_AT_BEGIN is not specified in the constructor, SIGNATURE_AT_END is implied and the signature to be verified must be presented after the message. If the signature is inserted first, SIGNATURE_AT_BEGIN must be be specified as an additional flags value as shown below.

Поскольку THROW_EXCEPTION используется, signature и message должны быть заменены или SIGNATURE_AT_BEGIN должны быть добавлены. В этом случае следующий код не генерирует исключения.

StringSource ss(signature + message, true, 
    new SignatureVerificationFilter(
    verifier, NULL, 
    THROW_EXCEPTION | SIGNATURE_AT_BEGIN 
     ) // SignatureVerificationFilter 
     ); // StringSource 
0
StringSource(signature + message, true, 
    new SignatureVerificationFilter(
     ECDSA<ECP, SHA256>::Verifier(publicKey), NULL, 
     SignatureVerificationFilter::THROW_EXCEPTION 
    ) // SignatureVerificationFilter 
); // 

Приведенное выглядит рыбным. Это выглядит подозрительно по двум причинам. Во-первых, он использует анонимные объявления, и я знаю, что некоторые версии GCC дают плохие результаты с ними. GCC генерирует код, так что деструкторы запускаются слишком быстро. Итак, назовите свою декларацию.

Во-вторых, SignatureVerificationFilter берет ссылку, а не временную. Поэтому вы должны указать ссылку на verifier или использовать функцию члена Ref(), если она доступна.

Во-первых, попробуйте просто:

ECDSA<ECP, SHA256>::Verifier verifier(publicKey); 

StringSource ss(signature + message, true, 
    new SignatureVerificationFilter(
     verifier, NULL, 
     SignatureVerificationFilter::THROW_EXCEPTION 
    ) // SignatureVerificationFilter 
); // StringSource 

Во-вторых, попробуйте:

StringSource ss(signature + message, true, 
    new SignatureVerificationFilter(
     ECDSA<ECP, SHA256>::Verifier(publicKey).Ref(), NULL, 
     SignatureVerificationFilter::THROW_EXCEPTION 
    ) // SignatureVerificationFilter 
); // StringSource 

Но я не уверен, что если ECDSA<ECP, SHA256>::Verifier(publicKey).Ref() будет работать.

+0

@stacker - Я вижу, где вы получили код (к сожалению, я парень, который, вероятно, написал его). Я получу эти wiki-страницы в следующий раз, когда приду на воздух. – jww

+0

@ jww - Ни один вариант не разработан для меня. Я применил ваши изменения в первом решении для моего подписания, но не повезло. Кроме того, Ref(), по-видимому, не является членом. Спасибо за помощь. – stacker

+0

@stacker - примените те же изменения в коде подписывателя в случае, если создается плохая подпись (что объясняет неудачную проверку). – jww

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