1.源码实现

#include

#include

#include

#include

#include

struct DSA_SIG_st {

BIGNUM *r;

BIGNUM *s;

};

//公钥验证签名

int my_verify(const char *input, int input_len, DSA_SIG *signret, const char *pub_key_fn)

{

DSA *p_dsa = NULL;

FILE *file = NULL;

int ret = 0;

if((file = fopen(pub_key_fn, "rb")) == NULL)

{

ret = -1;

return ret;

}

if((p_dsa = PEM_read_DSA_PUBKEY(file, NULL,NULL,NULL )) == NULL)

{

ret = -2;

fclose(file);

return ret;

}

fclose(file);

ret = DSA_do_verify(input, input_len, signret, p_dsa);

if(ret != 1)

{

ret = -3;

printf("DSA_verify err!\n");

DSA_free(p_dsa);

return ret;

}

printf("verify is ok!\n");

DSA_free(p_dsa);

return 0;

}

//私钥签名

int my_sign(const char *input, int input_len, const char *pri_key_fn)

{

DSA *p_dsa = NULL;

DSA_SIG *s;

FILE *file = NULL;

unsigned char *data[2];

int nid;

int signlen = 0;

int i = 0;

int ret = 0;

memset(data, 0x00, sizeof(data));

nid = 0;

file = fopen(pri_key_fn, "rb");

if(!file)

{

ret = -1;

return ret;

}

if((p_dsa = PEM_read_DSAPrivateKey(file, NULL, NULL, NULL)) == NULL)

{

ret = -2;

fclose(file);

return ret;

}

fclose(file);

s = DSA_do_sign(input, input_len, p_dsa);

if(s == NULL)

{

ret = -3;

DSA_free(p_dsa);

return ret;

}

data[0] = BN_bn2hex(s->r);

data[1] = BN_bn2hex(s->s);

DSA_free(p_dsa);

DSA_SIG_free(s);

printf("%s\n", data[0]);

printf("%s\n", data[1]);

free(data[0]);

free(data[1]);

return 0;

}

int main(int argc, char**argv)

{

char src[512+1];

char dst_str[2][512+1];

int src_len;

int ret;

FILE *f;

memset(src, 0x00, sizeof(src));

//memset(dst, 0x00, sizeof(dst));

if(argv[1][0] == 's')

{

strcpy(src, "aedewderdfercfrtvgfrtfgrtgfrtgvtrgtrvgtyebtybytbnybyuyubndrybrfgswdhyewhde");

src_len = strlen(src) ;

ret = my_sign(src, src_len, argv[2]);

if(ret)

{

fprintf(stderr, "Error\n");

}

}

else

{

DSA_SIG *s = (DSA_SIG *)malloc(sizeof(DSA_SIG));

strcpy(src, "aedewderdfercfrtvgfrtfgrtgfrtgvtrgtrvgtyebtybytbnybyuyubndrybrfgswdhyewhde");

strncpy(dst_str[0], argv[2], 512);

strncpy(dst_str[1], argv[3], 512);

src_len = strlen(src);

s->r = BN_new();

s->s = BN_new();

BN_hex2bn(&(s->r), dst_str[0]);

BN_hex2bn(&(s->s), dst_str[1]);

ret = my_verify(src, src_len, s, argv[1]);

if(ret)

{

fprintf(stderr, "Error\n");

}

BN_free(s->r);

BN_free(s->s);

free(s);

}

return 0;

}

2.编译源码

$ gcc -I$HOME/local/include -o example example.c -L$HOME/local/lib -lssl

3.生成私钥和公钥

$ openssl dsaparam -out dsa_param.pem 2048

$ openssl gendsa -out dsapri2048.pem dsa_param.pem

$ openssl dsa -in dsapri2048.pem -pubout -out dsapub2048.pem

4.运行结果

$ ./example s dsapri2048.pem

2B3BB6C33239C738AF186ADCAFB0A2704B1A4DC2

0D33CC1A97773BB607252A058E7B9F87E7B885E1

$ ./example dsapub2048.pem 2B3BB6C33239C738AF186ADCAFB0A2704B1A4DC2 0D33CC1A97773BB607252A058E7B9F87E7B885E1

verify is ok!

c语言bnd文件,C语言openssl库DSA签名相关推荐

  1. c语言课件 文件,C语言课件--文件.ppt

    C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...

  2. c语言bnd文件,Unix环境下嵌入式C程序编译

    A.预编译部分 1.预编译DB2篇 1.1 什么是DB2预编译 在我们用C语言编写访问DB2的程序过程中,需要用到嵌入式SQL,其作用是将DB2 SQL混入一般C程序中, DB2预编译器可以将SQL语 ...

  3. c语言程序库文件,c语言标准函数库

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 在C语言程序设计里,C 标准函数(C Standard library)是所有符合标准的头文件(head file)的集合,以 ...

  4. c语言实现自动打开文件夹,c语言打开文件(c语言文件打开方式代码)

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都可以通过文件管理的方法来完成.而在编程时使用最多的要算 是磁盘文件, 因此. { printf("File ope ...

  5. c语言中 文件,c语言中文件的使用方法

    c语言中文件的使用方法 一.文件指针的定义 FILE *fp//注意FILE的大写 二.文件的打开 fp=fopen("(路径)文件名.文件格式后缀","文件的使用方法& ...

  6. 如何写一个C语言头文件,C语言头文件如何写?.doc

    C语言头文件如何写? 沃直植跑决争肾垮忧地留许腐榔锑舱黎徒礁锄税絮窟柑冀宴稼误萎蛛席脏衙鹏丢寇急院馋猎争城丫轨最懦患队巩并道嫉缘拉诵旭倘荫惭岩靛约瞥剑澳摈讶蕾沈蜜荧次侧抿两洛加悠馈射移淳敏凹肮复钡桑缮 ...

  7. c语言文件打开方式字符串,C语言打开文件-C语言打开文件的方式-C语言以只读方式打开文件-C语言以读写方式打开文件-嗨客网...

    C语言打开文件教程 在 在 C 语言中,打开文件使用 fopen C语言fopen函数详解 语法 FILE *fopen(char *filename, char *mode); 参数 参数 描述 f ...

  8. c语言bnd文件,(((sizeof (X)) + (bnd)) (~(bnd)))

    1函数声明 首先,要实现类似printf()的变参函数,函数的最后一个参数要用...表示,如 int log(char * arg1, ...) 这样编译器才能知道这个函数是变参函数.这个参数与变参函 ...

  9. c语言实现rsa签名验证,C语言openssl库RSA签名

    1.源码实现 #include #include #include #include #include //公钥验证签名 int my_verify(const char *input, int in ...

最新文章

  1. 旷视 IPO 在即,看清“AI 第一股”的商业真相
  2. 在Mybatis3开发中与配置相关的7点体会
  3. 向app store提交应用时,必须点“ready to upload binary”!
  4. DSP:6678开发板NDK网口通信完整实现(附源码)
  5. if的作用域问题 *输出1~6的随机数*
  6. 使用Apache Cassandra设置SpringData项目
  7. 智慧教室解决方案和移动授课概念说明
  8. 渗透测试(Penetration Testing)
  9. 基于MHA+semi sync实现mysql数据库的高可用
  10. 技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验
  11. 持续集成工具集之五 使用Email Extension Plugin插件
  12. C++ 中的数学计算函数
  13. 【转载】shell实例手册
  14. Gvim的基本命令:CTR-C =进入命令行
  15. 偏差(bias)、方差(variance)和噪音(noise)
  16. DNSObserver检测DNS安全漏洞
  17. rpc wmi 服务不可用_wmi服务是什么?wmi服务常见问题及解决技巧!
  18. wincc逻辑运算符_wincc中表达式及公式
  19. OpenSolaris/Solaris 常见问题解答
  20. 利辛县腾讯服务器维护,腾讯内容开放平台

热门文章

  1. 案例-浙江省律师综合管理平台信息爬取
  2. 基于java大学生缴费(收费)管理系统
  3. 连接mysql数据库实验_Jdbc连接数据库实验报告(1)
  4. 好和弦-1-基础乐理
  5. 计算机操作系统第八章习题(附答案)
  6. SW4STM32/AC6/Turestudio创建工程 适用linux开发STM32
  7. MySQL在线备份与恢复工具 -- Xtrabackup
  8. 如何安装windows7ghost系统
  9. 苹果手机上运行python_Python新手入门教程_在手机上就能学习编程的软件
  10. 苹果11蓝牙配对不成功怎么办_为啥苹果11连不上蓝牙耳机