ECDSA 使用 SecByteBlock 密钥对

ECDSA using SecByteBlock key pairs

本文关键字:密钥对 SecByteBlock 使用 ECDSA      更新时间:2023-10-16

我已经实现了ECDH,私有和公共都是SecByteBlock类型,现在我正在尝试使用这些键实现SHA256ECDSA

假设已经生成了pubAprivA并且有SecByteBlock实例,如何在 ECDSA 中使用它们?

提前谢谢你!

OID CURVE = secp256r1();
AutoSeededX917RNG<AES> rng;
// Elliptic Curve Diffie-Hellman
ECDH < ECP >::Domain dhA( CURVE );
SecByteBlock privA(dhA.PrivateKeyLength()), pubA(dhA.PublicKeyLength());
dhA.GenerateKeyPair(rng, privA, pubA);
// Elliptic Curve Digital Signature Algorithm
ECDSA<ECP, SHA256>::PrivateKey privateKey;
DL_GroupParameters_EC<ECP> params(ASN1::secp256k1());
privateKey.Initialize(rng, params);        
// Generating private key
ECIES<ECP>::PrivateKey privateKey;
privateKey.Initialize(rng, ASN1::secp160r1());
// Generating matching public key
ECIES<ECP>::PublicKey publicKey;
privateKey.MakePublicKey(publicKey);
ECDSA<ECP>::Signer signer(privateKey);
ECDSA<ECP>::Verifier verifier(publicKey);

我认为这不是一个好主意。应使用 ECDSA 类创建密钥。然而,它就在这里。

#include "cryptlib.h"
#include "eccrypto.h"
#include "secblock.h"
#include "filters.h"
#include "integer.h"
#include "osrng.h"
#include "files.h"
#include "oids.h"
#include "sha.h"
#include <iostream>
#include <stdexcept>
int main(int argc, char* argv[])
{
    using namespace CryptoPP;
    try
    {
        const OID CURVE = ASN1::secp256r1();
        AutoSeededRandomPool prng;
        ECDH <ECP>::Domain dh(CURVE);
        SecByteBlock privA(dh.PrivateKeyLength()), pubA(dh.PublicKeyLength());
        dh.GenerateKeyPair(prng, privA, pubA);
        const Integer x(privA.begin(), privA.size());
        ECDSA<ECP, SHA256>::PrivateKey privateKey;
        privateKey.Initialize(CURVE, x);
        bool valid = privateKey.Validate(prng, 3);
        if (valid == false)
            throw std::runtime_error("Private key is not valid ECDSA key");
        std::cout << "Private key is valid ECDSA key" << std::endl;
    }
    catch (const std::runtime_error& ex)
    {
        std::cerr << ex.what() << std::endl;
        std::exit(1);
    }
    return 0;
}

和:

cryptopp$ g++ test.cxx ./libcryptopp.a -o test.exe
cryptopp$ ./test.exe
Private key is valid ECDSA key

更多信息请访问 Crypto++ wiki 上的椭圆曲线数字签名算法。