У меня есть веб-сервер, который подписывает сообщение, оно основано на этом коде 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() );
До сих пор все работало хорошо. Однако с одним конкретным сообщением верификатор не может подтвердить. Если я изменю один байт в этом специальном сообщении о сбое, код сработает.
Можете ли вы посмотреть на код и помочь мне, что может быть не так?
Задача ещё не решена.
Других решений пока нет …