Значение после кодирования/декодирования cryptopp base64 не совпадает

Я играю с cryptopp и у меня проблемы с кодировкой/декодированием Base64.

В следующем коде гипотетически значение sig должно быть равно tsig, но они отличаются последним символом (sig больше tsig на один символ). Я пробовал также изменить параметр insertLineBreaks в Base64Encoder, но результат тот же. ...

RSASSA_PKCS1v15_SHA_Signer privkey(privateKey);
SecByteBlock sbbSignature(privkey.SignatureLength());
privkey.SignMessage(rng, (byte const*) strContents.data(),
    strContents.size(),sbbSignature);

Base64Encoder b(new StringSink(signedData));
b.Put(sbbSignature.begin(), sbbSignature.size());

string sig;
StringSink sinksig(sig);
sinksig.Put(sbbSignature.begin(), sbbSignature.size());

string tsig;
StringSource ss(signedData, true, 
    new Base64Decoder(
        new StringSink(tsig)
    )
);

Где моя ошибка?


person apopovych    schedule 15.04.2014    source источник


Ответы (1)


b.Put(sbbSignature.begin(), sbbSignature.size());

Пытаться:

b.Put(sbbSignature.begin(), sbbSignature.size());
b.MessgeEnd();

Это выглядит не совсем правильно:

SecByteBlock sbbSignature(privkey.SignatureLength());
privkey.SignMessage(rng, (byte const*) strContents.data(),
    strContents.size(),sbbSignature);

Пытаться:

size_t maxLength = privkey.MaxSignatureLength();
SecByteBlock sbbSignature(maxLength);

size_t signatureLength = privkey.SignMessage(rng,
    (byte const*) strContents.data(), strContents.size(),
    sbbSignature);

if(maxLength != signatureLength)
    sbbSignature.resize(signatureLength);

В вики Crypto++ есть пример по адресу Схема подписи RSA с приложением, но я думаю, что это неправильно после просмотра.

person jww    schedule 15.04.2014
comment
Вики-страницы Crypto++ в схемах подписи RSA теперь исправлены. - person jww; 16.04.2014
comment
Да, работает нормально. б.КонецСообщения(); - одна вещь, которую я пропустил. - person apopovych; 16.04.2014
comment
Да, его легко пропустить. Base64Encoder и Base64Decoder буферизируют данные в поисках следующего полного блока из 3 или 4 символов для кодирования или декодирования. Также проблема с HexEncoders и Base32Encoders, особенно в паре с FileSink. FileSinks будет буферизовать 1024 байта. - person jww; 16.04.2014