RSA签到OPENSSL

时间:2014-12-02 17:27:33

标签: c cryptography openssl rsa sign

我正在尝试使用RSA私钥签名邮件。我读了一个pkey私钥,然后在openssl wiki上签了一个字符串,但在最后一步失败了。它总是在程序中注释的行上返回0,这意味着符号失败。任何人都可以帮我找出问题所在吗?

void main() {

EVP_MD_CTX * mdctx ;
EVP_PKEY * pkey ;
char dmessage[20] = "The messages";
int ret = 0;
FILE * fp;
unsigned char * sig = NULL;
size_t * slen = malloc(sizeof(size_t));

fp = fopen ("privkey.pem", "r");
if (fp == NULL) exit (1);
pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
fclose (fp);

if (pkey == NULL) { 
  ERR_print_errors_fp (stderr);
exit (1);
}

if(!(mdctx = EVP_MD_CTX_create())) goto err;
if(1 != EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, pkey)) goto err;
if(1 != EVP_DigestSignUpdate(mdctx, dmessage, 12)) goto err;
if(1 != EVP_DigestSignFinal(mdctx, NULL, slen)) goto err;
if(!(sig = OPENSSL_malloc(sizeof(unsigned char) * (int)(*slen)))) goto err;
if(1 != (ret = EVP_DigestSignFinal(mdctx, sig, slen))) goto err;//*****it return 0 here,which means sign failed

ret = 1;
err:
if(ret != 1)
{
  printf("%d somthing wrong\n",ret);
}

/* Clean up */
if(sig && !ret) OPENSSL_free(sig);
if(mdctx) EVP_MD_CTX_destroy(mdctx);
return;
}

非常感谢!

我在linux mint 17上使用openssl 1.0.1j,私钥由

生成
openssl genrsa -out privkey.pem 256

1 个答案:

答案 0 :(得分:1)

你的密钥太小了,这个位不是字节。再次尝试使用可以保存哈希和PKCS#1填充的良好安全密钥大小。我建议使用至少2048位而不是使用OpenSSL命令行生成的256位。

有关密钥大小的详细信息,请参阅keylength.com。请注意,RSA要求密钥大小远远大于AES等对称算法所需的密钥大小。