首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openssl DSA签名

Openssl DSA签名
EN

Stack Overflow用户
提问于 2011-12-05 03:30:18
回答 1查看 2.2K关注 0票数 2

我正在尝试使用DSA证书对一些数据进行签名。我将证书保存在内存中(它是使用openssl gendsa命令生成的)。

我的函数如下所示,我的问题是使用res = EVP_SignFinal。这里的函数返回0,并将signature_len设置为0。

代码语言:javascript
复制
bool my_dsa_sign(const Certificate& certificate, const char* messageData, size_t messageLength, Signature &outSignature) {
    bool resultOk = false;
    BIO* bio = BIO_new_mem_buf((void*) certificate.getPEMData(), certificate.getSize());
    if(NULL != bio) {
        EVP_PKEY *pkey = NULL;
        if(NULL != (pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))) {
            unsigned int signature_len;
            EVP_MD_CTX ctx;
            int res = EVP_SignInit(&ctx, EVP_sha512());
            if(1 == res) {
                res = EVP_SignUpdate(&ctx, messageData, messageLength);
                if(1 == res) {
                    unsigned char* s = (unsigned char*)malloc(EVP_PKEY_size(pkey));

                    // problem here
                    res = EVP_SignFinal(&ctx, s, &signature_len, pkey);
                    if(1 == res) {
                        resultOk = true;
                        signature.setData(s, signature_len);
                    }
                }
            }
            EVP_PKEY_free(pkey);
            EVP_MD_CTX_cleanup(&ctx);
        }
        BIO_free(bio);
    }
    return resultOk;
}

你知道问题出在哪里吗?我已经检查过调试器,证书的值是正确的,格式如下:

代码语言:javascript
复制
-----BEGIN DSA PRIVATE KEY-----
MIID....
.......
-----END DSA PRIVATE KEY-----

长度也是正确的,与文件的长度相匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-05 04:41:37

由于对OpenSSL了解不多,我看不出您在代码中使用了DSA。

代码语言:javascript
复制
int res = EVP_SignInit(&ctx, EVP_sha512());

manual page to EVP_SignInit说:

EVP_SignInit()初始化签名上下文ctx以使用digest 类型的默认实现。

manual page to EVP_sha512说:

...,EVP_sha512(),...返回...、SHA512、...的EVP_MD结构摘要算法。在每种情况下,关联的签名算法都是

由我高亮显示。因此,看起来您正在尝试使用DSA密钥进行RSA签名,这将不起作用(或者说是胡说八道)。

在浏览了一些文档之后,我没有找到一种将SHA512与DSA一起使用的方法,尽管文档现在声明:

摘要和签名算法之间的联系在OpenSSL 1.0和更高版本中已修复,因此现在EVP_sha1()可以与EVP_dss1()和DSA一起使用,不再需要使用EVP_dss1()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8377995

复制
相关文章

相似问题

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