当前位置: 首页 > 知识库问答 >
问题:

openssl锈箱:ECDSA签名大小不是64字节?

姬昊焱
2023-03-14

我想使用OpenSSL rust crate来执行加密操作,特别是使用ECDSA算法。

我使用下面的代码来生成ECDSA密钥(椭圆曲线P-256 ),并使用它来签署数据和获取签名:

    use openssl::sign::{Signer, Verifier};
    use openssl::ec::{EcKey, EcGroup};
    use openssl::pkey::PKey;
    use openssl::hash::MessageDigest;
    use openssl::nid::Nid;

    // ec key
    let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
    let keypair = EcKey::generate(&group).unwrap();
    let keypair = PKey::from_ec_key(keypair).unwrap();

    // data to sign
    let data = b"hello, world!";

    // hash: sha-256
    let mut signer = Signer::new(MessageDigest::sha256(), &keypair).unwrap();
    let buf_size = signer.len().unwrap();  // Computes an upper bound on the signature length.
    println!("buffer size {}", buf_size);  // 72
    let mut buf: [u8; 72] = [0; 72];

    // sign
    let exact_bytes = signer.sign_oneshot(&mut buf, data).unwrap(); //the number of bytes written.
    println!("{}", exact_bytes); // 70

我不明白为什么< code>exact_bytes是70。以我的理解,应该是64。

对于签名过程中使用的曲线,ECDSA签名比签名者的私钥长2倍。例如,对于256位椭圆曲线(如secp256k1),ECDSA签名是512位(64字节),对于521位曲线(如secp521r1),签名是1042位。

有什么帮助吗?谢谢!

共有1个答案

鲜于承基
2023-03-14

从这里看来,它还取决于签名所使用的编码,这可能会增加长度。

另外,解释了您对签名长度的理解,这与您所说的并不完全相同。

 类似资料:
  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。

  • 来自OpenSSL文档 使用命名曲线prime256v1(又名P-256)创建给定SHA-256散列值的ECDSA签名。 第二步:使用ECDSA_do_sign()计算SHA-256哈希值的ECDSA签名: 或使用ECDSA_sign(): 第三步:使用ECDSA_do_verify()验证创建的ECDSA签名: 或者使用ECDSA_verify(): 最后评估返回值: EOF 这使我认识到,我需

  • 我使用OpenSSL(在C中)对文本进行签名,但是我的Java程序并不总是验证签名的消息(只有大约1/5得到验证)。有趣的是,https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html没有证实其中任何一个: 曲线名称:secp256k1签名算法:SHA256with ECDSA 私钥 密钥 失败: 成功: 爪哇 C.

  • 我正在尝试生成“原始”的未编码ECDSA签名,用于加密芯片。目标是在主机pc上签名,然后将其发送到芯片进行验证。然而,我遇到了一个小问题。我的理解是ECDSA签名应该是64字节(对于secp256v1)。而且,当我使用芯片生成签名时,它的长度确实是64字节。然而,当我使用openssl时,签名长度为71字节。签名的开头似乎是某种前缀,但我找不到关于它的任何数据。 以下是我尝试做每件事情的方式: 生

  • 我正在尝试使用公钥验证散列的ECDSA签名。我写了一个小的围棋程序,成功地做到了这一点,但是我不能把它移植到C语言中。 这是我的输入数据: < li >公钥:< code > mfkwewyhkozizj 0 caqyikozij0 dackcdqgaedd 9 vxm phjv 4 vofo 0 zofplr r5 iczxquxsr 9 eka ouo 9 b 7 wl 1 daggi 0 e

  • 要使用OpenSSL生成私钥和公钥,我已经运行 我将公钥上传到远程服务器。然后将导入。Net Framework(它必须是。Net Framework)C#服务使用它来签署API有效负载: 用上面的代码给出 如果我使用并运行它会生成一个名为的PKCS#12密钥,然后: 使用<code>privateKeyFile=private-key.pem。p12上面的代码似乎对请求进行了签名,但API响应为