openssl DSA 数字签名与签名验证


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


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


/* gcc -o test test_dsa.c ../../libcrypto.a -I../bn/ */
#include 
#include 
#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

本代码在 openssl-1.0.1k版本下验证通过,之前的一个openssl版本程序一直出不了结果,不确定是否由于测试机器有多个openssl版本,导致此类异常。


你可能感兴趣的:(数据安全,C,系统综合)