您的位置:首页 > 运维架构

openssl DSA 数字签名与签名验证

2015-02-12 11:45 489 查看
与RSA不同,DSA的主要功能是做数字签名与签名验证。DSA不具备对数据进行加密解密的功能,因此在使用上面请注意。往往有很多使用者误认为非对称加密算法都可以对数据进行加解密处理,其实不然,DSA就是一个很好的例子。

使用C/C++ 调用openssl/crypt库进行DSA测试,代码如下:

/* gcc -o test test_dsa.c ../../libcrypto.a -I../bn/ */
#include <stdio.h>
#include <string.h>
#include "dsa.h"
#include "bn.h"

int show_error(int ret,char *msg){
char *buf = (char*)malloc(1024);
long err = ERR_get_error();
ERR_error_string(err,buf);
fprintf(stderr,"[%s] ret:[%d] err:[%d] msg:[%s]\n",msg,ret,err,buf);
free(buf);
return 0 ;
}

int init_dsa_key(DSA **dsa,DSA **dsa_pri,DSA **dsa_pub){
int ret = 0;
*dsa = DSA_new();
DSA_generate_parameters_ex(*dsa,1024,NULL,0,NULL,NULL,NULL);
show_error(ret,"DSA_generate_parameters() 1:success,0:failed");
ret = DSA_generate_key(*dsa);
show_error(ret,"DSA_generate_key() 1:success,0:failed");

*dsa_pri = DSA_new();
(*dsa_pri)->p = BN_dup((*dsa)->p);
(*dsa_pri)->q = BN_dup((*dsa)->q);
(*dsa_pri)->g = BN_dup((*dsa)->g);
(*dsa_pri)->priv_key = BN_dup((*dsa)->priv_key);

*dsa_pub = DSA_new();
(*dsa_pub)->p = BN_dup((*dsa)->p);
(*dsa_pub)->q = BN_dup((*dsa)->q);
(*dsa_pub)->g = BN_dup((*dsa)->g);
(*dsa_pub)->pub_key = BN_dup((*dsa)->pub_key);

return 0;
}

int test_dsa(char *buf1,int len1,DSA *dsa_pri,DSA *dsa_pub){
int ret = 0;
int dsa_len = DSA_size(dsa_pri);
int len2 = dsa_len;
char *buf2=(char *)malloc(len2);

ret = DSA_sign(0,buf1,len1,buf2,&len2,dsa_pri);
show_error(ret,"DSA_sign() 1:success,0:failed");

ret = DSA_verify(0,buf1,len1,buf2,len2,dsa_pub);
show_error(ret,"DSA_verify() 1:success,0:failed");

ret = DSA_verify(0,buf1,len1,buf1,len2,dsa_pub);
show_error(ret,"DSA_verify() 1:success,0:failed");

return ret;
}

#define BUF_SIZE 64
int main(){
int ret = 0;
DSA *dsa = NULL;
DSA *dsa_pri = NULL;
DSA *dsa_pub = NULL;
int i,len = BUF_SIZE;
char *buf = (char *)malloc(len);
memset(buf,0,len);
for(i=0;i<BUF_SIZE;i++){
buf[i] = i%256;
}

init_dsa_key(&dsa,&dsa_pri,&dsa_pub);
test_dsa(buf,len,dsa_pri,dsa_pub);

return ret;
}
//
// DSA只能对数据进行数字签名及签名验证,无法对数据进行非对称加密解密。
//

本代码在 openssl-1.0.1k版本下验证通过,之前的一个openssl版本程序一直出不了结果,不确定是否由于测试机器有多个openssl版本,导致此类异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息