c - 如何使用 OpenSSL 从 wolfSSL 验证 ECC 签名

标签 c cryptography elliptic-curve challenge-response wolfssl

我是椭圆曲线密码学、openSSL 和 wolfSSL 的新手。我的上下文是我使用 openssl 从命令行生成 KeyPair 并将私钥导入我的代码。然后我使用 wolfSSL 生成签名并输出它。

我将输出保存为DER格式并尝试用openSSL验证,验证失败。

如果我在我的代码中使用 wolfSSL 进行签名和验证,它会成功验证,如果我在命令行中使用 openSSL 进行签名和验证,它也会成功。

是否存在我不确定的编码问题?

更新代码

// ECC public key
const uint8_t pubKey[] ={Hex Format key};
// ECC Signature from wolfSSL
char* sigString = {Signature from wolfSSL returned as char};
/* TYPE CONVERTIONS*/
const uint8_t *der_bytes_copy;
const uint8_t *pub_bytes_copy;
der_bytes_copy = (const unsigned char*)sigString;
pub_bytes_copy = pubKey;


EC_KEY *ECpubkey;
size_t keySize = sizeof(pubKey);
int eccgrp;
eccgrp = OBJ_txt2nid("secp256r1");
 ECpubkey = EC_KEY_new_by_curve_name(eccgrp);
o2i_ECPublicKey(&ECpubkey, &pub_bytes_copy, keySize);
ECDSA_SIG *signature;
signature = d2i_ECDSA_SIG(NULL, &der_bytes_copy, signedSize);
uint8_t digest[36];
int verified;
const char message[] = "Test for Authenticate Kernel with ECC";
SHA256_CTX ctx;
SHA256_Init(&ctx);
SHA256_Update(&ctx, (const uint8_t*)message,sizeof(message));
SHA256_Final(digest, &ctx);
verified = ECDSA_do_verify(digest, sizeof(digest), signature, ECpubkey);

私钥与 wolfSSL 一起使用来签署消息,然后使用公钥与 openssl 来验证,但这突然停止。

最佳答案

过去,在使用 openSSL 并将符号值与 wolfSSL 进行比较时,我发现 OpenSSL 在签名时会执行以下步骤:

  1. 读入并解码 key
  2. 计算哈希值
  3. 签名编码散列
  4. 对编码后的散列进行签名
  5. Base64编码签名

OpenSSL 并没有使这一点变得明显或用户友好,因此不幸的是,这是您必须发现的东西。

请在 wolfSSL 中使用以下步骤来实现您想要的输出:

1 创建或导入您的 ECC key
2 像以前一样计算输入的 sha 哈希
3 使用此 API 调用对散列进行编码:encodedSz = wc_EncodeSignature(encodedOutput, hashInput, SHA256_DIGEST_SIZE, SHA256h);
4 对编码后的散列进行签名
5 现在做验证

让我们知道这是否适合您。

关于c - 如何使用 OpenSSL 从 wolfSSL 验证 ECC 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994824/

相关文章:

python - pyecc 和 secure 中的 ECC key 编码

encryption - 自修改哈希加密算法

java - Java Card 不支持 brainpool320r1 椭圆曲线?

c - 带有 `df` 的可用 block

C 哈希表多类型输入

c - 找到最大数量的最快和最有效的方法。可以通过对数组的 2 个 DISTINCT 元素执行按位和获得

c - POSIX 中的 fopen 与 open(C 语言)

c# - 读取 ASN.1 DER 编码的 RSA 公钥

algorithm - 质数币? Node.JS 与 Haskell 适用性

java - Bouncy CastLe 的 ECDHE 安全性