如何使用C中的openssl调用解密私钥文件并签署一些文本?

时间:2010-12-01 00:48:07

标签: c cryptography openssl

我有两个独立的程序(下面拼接在一起)。第一个生成密钥对并保存到文件(工作正常)。第二个打开私钥,用密码短语解密,然后我需要它来签署一串文本。下面的代码在PEM_read_PrivateKey()(最后)调用上失败(无法查看原因)。任何人都可以指出我做错了什么然后openssl调用我应该使用私钥来签署一些文本?

int main (int argc, char *argv[])
{
    char *priv_pem = "priv.pem";
    char *pub_pem  = "pub.pem";
    char *pass     = "Password";
    FILE *fp;   
    int bits = 4096;
    unsigned long exp = RSA_F4;

    RSA *rsa;
    EVP_PKEY *pkey;

    //  GENERATE KEY
    rsa=RSA_generate_key(bits,exp,NULL,NULL);
    if (RSA_check_key(rsa)!=1)
        Exit(1,"Error whilst checking key","");
    pkey = EVP_PKEY_new();
    EVP_PKEY_assign_RSA(pkey, rsa);

    //  WRITE ENCRYPTED PRIVATE KEY
    if (!(fp = fopen(priv_pem, "w")))
        Exit(2,"Error opening PEM file",priv_pem);
    if (!PEM_write_PrivateKey(fp,pkey,EVP_aes_256_cbc(),NULL,0,NULL,pass))
        Exit(3,"Error writing PEM file",priv_pem);
    fclose(fp);

    //  WRITE PUBLIC KEY
    if (!(fp = fopen(pub_pem, "w")))
        Exit(4,"Error opening PEM file",pub_pem);
    if (!PEM_write_PUBKEY(fp, pkey))
        Exit(5,"Error writing PEM file",pub_pem);
    fclose(fp);
    // ------- End of key generation program -------

    // ------- Start of text signing program -------
    //  READ IN ENCRYPTED PRIVATE KEY
    if (!(fp = fopen(priv_pem, "r")))
        Exit(6,"Error reading encrypted private key file",priv_pem);
    if (!PEM_read_PrivateKey(fp,&pkey,NULL,pass))
        Exit(7,"Error decrypting private key file",priv_pem);
    fclose(fp);

    // Sign some text using the private key....

    //  FREE
    RSA_free(rsa);  
    return 0;
}

2 个答案:

答案 0 :(得分:3)

在将pkey传递给NULL之前,您是否已将&pkey初始化为PEM_read_PrivateKey()?如果没有,它将尝试重新使用EVP_PKEY指向的pkey结构 - 如果pkey未初始化,则会查看内存中的随机位置。

发生错误时,您可以使用ERR_print_errors_fp(stderr);将OpenSSL错误堆栈转储到stderr - 这通常有助于发现问题。

答案 1 :(得分:1)

感谢@caf的帮助。 通过反复试验,我通过在开头添加以下内容来修复PEM_read_PrivateKey()错误:

if (EVP_get_cipherbyname("aes-256-cbc") == NULL)
    OpenSSL_add_all_algorithms();

但是,我仍在寻找生成密钥然后使用私钥进行签名的最佳(实践)方法。从我有限的理解,我正在寻找符合RSA的“PKCS#1 v2.0:RSA密码学标准”的openssl方法