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版本,导致此类异常。
使用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版本,导致此类异常。
相关文章推荐
- CryptAPI 数字签名 与 Openssl 验证签名
- 基于GMP和Openssl实现DSA对任意文件签名验证
- CryptAPI 数字签名 与 Openssl 验证签名
- OpenSSL学习之使用个人信息数字证书(PFX)进行签名和验证
- java数字签名(签名生成,用证书验证签名)
- 数字签名(代码签名)流程和数字签名的验证
- 使用 Openssl 验证自签名证书
- java数字签名(签名生成,用证书验证签名)
- CryptoAPI与openssl数字签名与验证交互
- openssl dgst(生成和验证数字签名)
- 使用 Openssl 验证自签名证书
- openssl生成签名与验证签名
- 数据签名与验证--OpenSSL
- 使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的服务器异步通知
- OpenSSL命令行工具验证数字签名
- 使用 Openssl 验证自签名证书
- OpenSSL学习之使用个人信息数字证书(PFX)进行签名和验证
- java数字签名(签名生成,用证书验证签名)
- openssl md5 rsa 签名和签名验证
- 基于OpenSSL的时间戳签名和验证