首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rsa-pss算法对数据签名

使用rsa-pss算法对数据签名
EN

Stack Overflow用户
提问于 2022-04-13 20:19:50
回答 1查看 401关注 0票数 0

我想使用RSA算法来使用锈蚀openssl机箱对数据进行签名和验证.但我遇到了一些问题。

这是我的代码:

代码语言:javascript
复制
    use openssl::sign::{Signer, Verifier, RsaPssSaltlen};
    use openssl::rsa::Rsa;
    use openssl::pkey::PKey;
    use openssl::hash::MessageDigest;
    
    // Generate a keypair
    let keypair = Rsa::generate(2048).unwrap();
    let keypair = PKey::from_rsa(keypair).unwrap();

    let data = b"hello, world!";

    // Sign the data
    let mut signer = Signer::new(MessageDigest::sha256(), &keypair).unwrap();
    // set the salt length to the digest length
    let digest_len = RsaPssSaltlen::DIGEST_LENGTH;
    signer.set_rsa_pss_saltlen(digest_len).unwrap(); // panic here

    signer.update(data).unwrap();
    let signature = signer.sign_to_vec().unwrap();

我将盐分长度设置为摘要长度,但代码引发了如下错误:

代码语言:javascript
复制
[Error { code: 67694738, library: "rsa routines", function: "pkey_rsa_ctrl", reason: "invalid pss saltlen", file: "crypto/rsa/rsa_pmeth.c", line: 438 }, Error { code: 101224595, library: "digital envelope routines", function: "EVP_PKEY_CTX_ctrl", reason: "command not supported", file: "crypto/evp/pmeth_lib.c", line: 396 }])

因此,pss saltlen是无效的,我不知道如何正确地执行它。

我还试着自己做了一件事:

代码语言:javascript
复制
let digest_len = RsaPssSaltlen::custom(32 as c_int);

抛出

代码语言:javascript
复制
[Error { code: 67694738, library: "rsa routines", function: "pkey_rsa_ctrl", reason: "invalid pss saltlen", file: "crypto/rsa/rsa_pmeth.c", line: 438 }, Error { code: 101224595, library: "digital envelope routines", function: "EVP_PKEY_CTX_ctrl", reason: "command not supported", file: "crypto/evp/pmeth_lib.c", line: 396 }]

也是一个无效的pss咸水。

有什么帮助吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 20:43:05

下面是一个使用RSA算法的示例:链接

基本上,您需要首先设置rsa_padding。

代码语言:javascript
复制
let key = include_bytes!("../test/rsa.pem");
        let private_key = Rsa::private_key_from_pem(key).unwrap();
        let pkey = PKey::from_rsa(private_key).unwrap();

        let mut signer = Signer::new(MessageDigest::sha256(), &pkey).unwrap();
        signer.set_rsa_padding(Padding::PKCS1_PSS).unwrap();
        assert_eq!(signer.rsa_padding().unwrap(), Padding::PKCS1_PSS);
        signer
            .set_rsa_pss_saltlen(RsaPssSaltlen::DIGEST_LENGTH)
            .unwrap();
        signer.set_rsa_mgf1_md(MessageDigest::sha256()).unwrap();
        signer.update(&Vec::from_hex(INPUT).unwrap()).unwrap();
        let signature = signer.sign_to_vec().unwrap();

        let mut verifier = Verifier::new(MessageDigest::sha256(), &pkey).unwrap();
        verifier.set_rsa_padding(Padding::PKCS1_PSS).unwrap();
        verifier
            .set_rsa_pss_saltlen(RsaPssSaltlen::DIGEST_LENGTH)
            .unwrap();
        verifier.set_rsa_mgf1_md(MessageDigest::sha256()).unwrap();
        verifier.update(&Vec::from_hex(INPUT).unwrap()).unwrap();
        assert!(verifier.verify(&signature).unwrap());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71863428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档