ECDSA 使用 SecByteBlock 密钥对
ECDSA using SecByteBlock key pairs
我已经实现了ECDH
,私有和公共都是SecByteBlock
类型,现在我正在尝试使用这些键实现SHA256
的ECDSA
。
假设已经生成了pubA
和privA
并且有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 上的椭圆曲线数字签名算法。
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- ECDSA 密钥对生成输出错误
- C++生成 RSA 密钥对并读取
- 当第一个密钥更改时,将对持续的映射保持持续
- ECDSA 使用 SecByteBlock 密钥对
- 如何对Mac密钥的集合进行排序
- 根据类成员对同一密钥的多映射元素进行排序
- C++使用密钥和掩码对字符进行加密
- 使用openssl生成DSA密钥对
- 如何在没有 p、q 等的情况下加载 RSA 密钥对
- 如何在没有Openssl或其他库的情况下加载RSA密钥对
- ssl对端证书或ssh远程密钥不正确
- 我可以从智能卡的密钥容器中获得公钥/私钥对吗?
- 映射映射与std::对作为密钥相比有什么优势
- 在Qt中对项目应用迂腐的GCC密钥时有很多警告
- 从RSA密钥对变量中分离公钥和私钥