qt — проверка подписи PHP / C ++ ECDSA

У меня есть веб-сервер, который подписывает сообщение, оно основано на этом коде PHP: https://github.com/phpecc/phpecc/blob/master/examples/creating_signature.php

    $adapter = EccFactory::getAdapter();
$generator = EccFactory::getNistCurves()->generator256();
$useDerandomizedSignatures = true;
$algorithm = 'sha256';
## You'll be restoring from a key, as opposed to generating one.
$pemSerializer = new PemPrivateKeySerializer(new DerPrivateKeySerializer($adapter));
$keyData = file_get_contents('../../../PrivateKey.pem');
$key = $pemSerializer->parse($keyData);
$signer = new Signer($adapter);
$hash = $signer->hashData($generator, $algorithm, $stringToSign);
# Derandomized signatures are not necessary, but can reduce
# the attack surface for a private key that is to be used often.
if ($useDerandomizedSignatures) {
$random = \Mdanter\Ecc\Random\RandomGeneratorFactory::getHmacRandomGenerator($key, $hash, $algorithm);
} else {
$random = \Mdanter\Ecc\Random\RandomGeneratorFactory::getRandomGenerator();
}
$randomK = $random->generate($generator->getOrder());
$signat = $signer->sign($key, $hash, $randomK);
$serializedSig = gmp_export($signat->getR()) . gmp_export($signat->getS());
$signature = base64_encode($serializedSig);

Как видите, подпись кодируется в base64 и затем отправляется в программу Qt, где она проверяется с помощью библиотеки Crypto ++:

// load public key
QFile file(":certificates/PublicKey.der");
file.open(QIODevice::ReadOnly);
QByteArray ba = file.readAll();

CryptoPP::ByteQueue queue;
queue.Put((byte *)ba.data(), ba.size());

ECDSA<ECP, SHA256>::PublicKey publicKey;
publicKey.Load(queue);

QByteArray signature = QByteArray::fromBase64(signature.toLatin1());

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

bool result = verifier.VerifyMessage( (const byte*)message.toStdString().c_str(), message.length(), (const byte*)signature.data(), signature.length() );

До сих пор все работало хорошо. Однако с одним конкретным сообщением верификатор не может подтвердить. Если я изменю один байт в этом специальном сообщении о сбое, код сработает.

Можете ли вы посмотреть на код и помочь мне, что может быть не так?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]