2014-12-02 4 views
1

RSA 비공개 키로 메시지에 서명하려고합니다. pkey에 개인 키를 읽은 다음 openssl 위키에서 말한대로 문자열에 서명하지만 마지막 단계에서는 실패합니다. 프로그램에서 주석 처리 된 행에서 항상 0을 리턴합니다. 이는 기호가 실패했음을의 L합니다. 아무도 내가 무엇이 잘못되었는지 찾아내는 데 도움이 될 수 있습니까?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; 
} 

감사합니다.

내가 리눅스 민트 17에있는 OpenSSL 1.0.1j를 사용하고, 그리고

openssl genrsa -out privkey.pem 256 

답변

1

키가 너무 작하여 개인 키가 생성되고, 그 비트를 바이트 아니다. 해시 및 PKCS # 1 패딩을 보유 할 수있는 안전한 안전한 키 크기로 다시 시도하십시오. OpenSSL 명령 줄을 사용하여 생성 한 256 비트 대신 적어도 2048 비트를 권장합니다.

키 크기에 대한 자세한 내용은 keylength.com을 참조하십시오. RSA는 AES와 같은 대칭 알고리즘에 필요한 것보다 훨씬 큰 키 크기가 필요합니다.

+0

이렇게하면 문제가 해결됩니다. 도와 주셔서 감사합니다! – Dacheng