- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 C++ 尝试在 Elliptic_Curve_Cryptography 之后生成一个 ECDSA key 对来自 OpenSSL 维基。
#include <iostream>
#include <openssl/obj_mac.h>
#include <openssl/ec.h>
int main()
{
EC_KEY *key;
if(NULL == (key = EC_KEY_new_by_curve_name(NID_secp224r1)))
std::cout << "error on new_curve_by_name" << std::endl;
if(1 != EC_KEY_generate_key(key)) std::cout << "error in generating keys" << std::endl;
}
key 对生成没有错误,但我不知道如何在两个不同的对象(EC_POINT 和 BIGNUM)中提取公钥和私钥,知道吗?
最佳答案
我认为你想要的方法是:
EC_KEY_get0_private_key和 EC_KEY_get0_public_key
这对我有用:
EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp224r1);
if(!key)
{
std::cerr << "Error creating curve key" << '\n';
return EXIT_FAILURE;
}
if(!EC_KEY_generate_key(key))
{
std::cerr << "Error generating curve key" << '\n';
EC_KEY_free(key);
return EXIT_FAILURE;
}
BIGNUM const* prv = EC_KEY_get0_private_key(key);
if(!prv)
{
std::cerr << "Error getting private key" << '\n';
EC_KEY_free(key);
return EXIT_FAILURE;
}
std::cout << "Private key: " << prv << '\n';
EC_POINT const* pub = EC_KEY_get0_public_key(key);
if(!pub)
{
std::cerr << "Error getting public key" << '\n';
EC_KEY_free(key);
return EXIT_FAILURE;
}
std::cout << "Public key: " << pub << '\n';
// Use keys here ...
EC_KEY_free(key);
注意:
当像这样使用 C
库时,我经常定义一个自定义的智能指针 来处理删除。这使得代码不太容易发生内存泄漏和“异常安全”。
例如我会这样定义:
struct ec_key_dter{void operator()(EC_KEY* k)const{if(k) EC_KEY_free(k);}};
using ec_key_uptr = std::unique_ptr<EC_KEY, ec_key_dter>;
然后像这样使用它:
auto key = ec_key_uptr(EC_KEY_new_by_curve_name(NID_secp224r1));
if(!key)
throw std::runtime_error("Error creating curve key");
if(!EC_KEY_generate_key(key.get()))
throw std::runtime_error("Error generating curve key");
if(!EC_KEY_check_key(key.get()))
throw std::runtime_error("Error checking curve key");
// ... etc ...
// Do not delete the key manually!!
关于c++ - 分离 ECDSA key 对的公钥和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685191/
我需要创建由“根”证书(自签名,ECDSA)签名的“客户端”ECDSA 证书。“根”证书是按照 Translating Elliptic Curve parameters (BC to MS) 中的描
理论上,如果拥有公钥、签名和已签名的数据并且哈希算法已知,则应该可以验证一段数据的签名。 我有二进制格式的所有这些组件。有人知道验证此签名的最简单方法吗?打开SSL? Python?一个例子会很棒。不
我正在使用ECC证书来观察TLS是如何工作的,谁能帮我区分ECDH-ECDSA-AES128-SHA256和 ECDHE-ECDSA-AES128-SHA256 . 使用时ECDHE-ECDSA-AE
我在执行以下操作时遇到问题: 使用 Python 为 ECDSA SECP256k1 曲线创建公私钥对,并将其打印在终端上。 在 Python 脚本和 visual studio(使用 micro-e
我正在尝试生成用于加密芯片的“原始”、未编码的 ECDSA 签名。目标是在主机 pc 上签署某些内容,然后将其发送到芯片进行验证。但是,我遇到了一个小问题。我的理解是 ECDSA 签名应该是 64 个
我需要使用 ECDSA 算法对消息进行签名并在 java 中发送给接收者。然后,接收方应验证发送方的签名。 因此,为此,接收方拥有发送方的公钥,但在通过以下命令将 java.security.Publ
我正在使用创建 key 对 ECDSA::Signer signer; signer.AccessKey().Initialize(randomGeneratorM, ASN1::secp160r1(
我只需要为 ECDSA 获取私钥和公钥对。 Stanford Javascript Crypto Library 以非标准方式 ( https://groups.google.com/forum/
我一直在为以太坊交易管理器编写签名者服务,我需要使用 Google KMS Golang APIs 签署以太坊交易。 .我将在下面尝试总结我面临的问题。 Ethereum 在 R 中需要紧凑的 RLP
我使用以下两行来生成 ECDSA 私钥的十六进制: openssl ecparam -genkey -name secp256k1 -out data.pem openssl ec -in data.
我正在使用 python 和 cryptography.io 来签署和验证消息。我可以通过以下方式获得签名的 DER 编码字节表示: cryptography_priv_key.sign(messag
是否有为 JWK 创建指纹(又名指纹)的标准规范方法? 从我阅读的内容来看,该标准似乎没有定义 kid应该指定,我觉得很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是一个需要查找表的值,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
我想知道ECDSA签名和公钥的数据格式是什么规范(或标准)定义的? 我正在 java 卡上测试 ECDSA 签名。我发现签名和公钥值中有一个TLV格式。 * Public key (TV format
我正在尝试创建一个数字证书,该证书将使用 EC key 而不是来自 RSA 的 key 进行自签名,并遵循这些 SO link1和 link2 。我将 link1 中给出的 RSA 签名算法替换为 E
我正在尝试创建一个数字证书,该证书将使用 EC key 而不是来自 RSA 的 key 进行自签名,并遵循这些 SO link1和 link2 。我将 link1 中给出的 RSA 签名算法替换为 E
以下网站经常被引用,我认为是准确的: https://gobittest.appspot.com/Address 我正在尝试在 Golang 中重现这些步骤,但第一步失败:-( 有人可以向我提供一个
我试图从私钥生成公共(public) ECDSA key ,但我没有在互联网上找到关于如何执行此操作的太多帮助。几乎一切都是为了从公钥规范生成公钥,但我不知道如何获得它。到目前为止,这是我整理的内容:
是否有任何库支持从 javascript(前端)的私钥派生 ecdsa 公钥? (有了私钥,我们就可以生成对应的公钥) 我研究了localethereum white paper ,我想实现加密层。
来自OpenSSL documentation 使用命名曲线 prime256v1(又名 P-256)创建给定 SHA-256 哈希值的 ECDSA 签名。 第二步:使用 ECDSA_do_sign(
我是一名优秀的程序员,十分优秀!