2014-12-02 80 views
1

我想用RSA私鑰簽名消息。我讀了一個私鑰給pkey,然後像在openssl wiki上說的那樣對一個字符串進行簽名,但是在最後一步失敗了。它總是在程序中註釋的行返回0,這意味着符號失敗。任何人都可以幫我找出有什麼問題嗎?RSA登錄OPENSSL

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

您的密鑰來說太小了,這是個不字節。再次嘗試使用可保存散列和PKCS#1填充的安全密鑰。我會推薦至少2048位而不是使用OpenSSL命令行生成的256位。

有關密鑰大小的更多信息,請參閱keylength.com。請注意,RSA需要比對稱算法(如AES)所需的密鑰更大的密鑰。

+0

解決了這個問題。謝謝您的幫助! – Dacheng 2014-12-03 06:24:10