1.头文件部分

#include

#include

#include

2.判断大数是不是0或1

参见《C语言实现RSA算法》

3.大数加减乘除幂模

参见《C语言实现RSA算法》

4.先乘积后取模的函数

int big_num_mul_mod(unsigned long *a, unsigned long *b, unsigned long *c, unsigned long *s, int len)

{

unsigned long d[2*len];

unsigned long e[2*len];

unsigned long f[2*len];

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

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

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

memcpy(e+len, c, 4*len);

big_num_mul(a, b, d, len);

big_num_mod(d, e, f, 2*len);

memcpy(s, f+len, 4*len);

return 0;

}

5.根据私钥求公钥

int dsa_get_key(unsigned long *p, unsigned long *q, unsigned long *h, unsigned long *g, unsigned long *x, unsigned long *y, int len)

{

unsigned long a[len];

unsigned long b[len];

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

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

a[len-1] = 1;

printf("key p: ");

print_num(p, len);

printf("key a: ");

print_num(a, len);

big_num_sub(p, a, b, len);

a[len-1] = 0;

big_num_div(b, q, a, len);

big_num_pow_mod(h, a, p, g, len);

big_num_pow_mod(g, x, p, y, len);

printf("key g: ");

print_num(g, len);

printf("key y: ");

print_num(y, len);

return 0;

}

6.签名函数

int dsa_set_sig(unsigned long *p, unsigned long *q, unsigned long *g, unsigned long *x, unsigned long *k, unsigned long *m, unsigned long *r, unsigned long *s, int len)

{

unsigned long a[len];

unsigned long b[len];

unsigned long c[len];

unsigned long d[len];

unsigned long e[len];

unsigned long f[len];

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

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

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

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

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

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

big_num_pow_mod(g, k, p, a, len);

printf("step 1 end\n");

big_num_mod(a, q, r, len);

printf("step 2 end\n");

big_num_mod_inv(k, q, b, len);

printf("step 3 end\n");

big_num_mul_mod(x, r, q, c, len);

printf("step 4 end\n");

big_num_mod(m, q, d, len);

printf("step 5 end\n");

big_num_add(c, d, e, len);

printf("step 6 end\n");

big_num_mod(e, q, f, len);

printf("step 7 end\n");

big_num_mul_mod(b, f, q, s, len);

printf("step 8 end\n");

printf("key m: ");

print_num(m, len);

printf("key r: ");

print_num(r, len);

printf("key s: ");

print_num(s, len);

return 0;

}

7.签名验证函数

int dsa_verify_sig(unsigned long *p, unsigned long *q, unsigned long *g, unsigned long *y, unsigned long *m, unsigned long *r, unsigned long *s, unsigned long *v, int len)

{

unsigned long a[len];

unsigned long b[len];

unsigned long c[len];

unsigned long d[len];

unsigned long e[len];

unsigned long f[len];

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

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

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

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

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

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

big_num_mod_inv(s, q, a, len);

printf("verify step 3 end\n");

big_num_mul_mod(d, e, p, f, len);

printf("verify step 6 end\n");

big_num_mod(f, q, v, len);

printf("verify step 7 end\n");

return 0;

}

8.主函数部分

int main()

{

unsigned long p[16] = {0x41C416C1, 0x59C0E918, 0xB16668C4, 0x93481D71, 0x1EF64AF5, 0xC9BC2A23, 0x671494D1, 0x9512D773, 0x103C7497, 0xB53ABB51, 0x7CF0EAD2, 0x86F8A8F3, 0x5862D58A, 0x82095489, 0x0A64A7DA, 0xFD3CD307};

unsigned long q[16] = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xE342DAC7, 0x8043EFD8, 0x93AA3A8C, 0x43CB20CE, 0x4FFD13FF};

unsigned long h[16] = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1f25dbcb, 0x8cc6d056, 0x9fff2a9c, 0xc4cc8be6, 0xefdba4d1};

//unsigned long g[16] = {0};

unsigned long x[16] = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x90f755d3, 0xb2719345, 0x15098119, 0x6ef74fe8, 0x0104f1f2};

//unsigned long y[16] = {0};

unsigned long g[16] = {0x18C0EB49, 0xA18E9A74, 0x4D119F13, 0x08A5AFCF, 0x5152747A, 0x2F9C9144, 0x1ED48DC3, 0xEFB05F2B, 0x194063CE, 0x77602605, 0x88C098CB, 0x13F80BA5, 0x3C3BBB93, 0xC9BA32FA, 0x4C14A3D2, 0xAB1A8623};

unsigned long y[16] = {0x288FA8BB, 0x4F783D45, 0x514E0C7C, 0x13629F03, 0xDDD82F3A, 0xECBE5337, 0xBFF9FF4A, 0x55945ADA, 0xFBF36083, 0xC68436BA, 0x48649C41, 0x31B647FC, 0x815019DB, 0x105A9B85, 0xCB7C670E, 0xA6A0A615};

unsigned long k[16] = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7ce0b2c4, 0x7ec535c0, 0x40a64a18, 0xc5f6f450, 0xf0868e30};

unsigned long u[16] = {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xac01065b, 0xcf974ba9, 0x86c84f0f, 0x335180e0, 0x9a65e139};

unsigned long v[16] = {0};

unsigned long r[16] = {0};

unsigned long s[16] = {0};

int len = 16;

printf("key p: ");

print_num(p, len);

//dsa_get_key(p, q, h, g, x, y, len);

dsa_set_sig(p, q, g, x, k, u, r, s, len);

dsa_verify_sig(p, q, g, y, u, r, s, v, len);

printf("key m: ");

print_num(u, len);

printf("key r: ");

print_num(r, len);

printf("key s: ");

print_num(s, len);

printf("key v: ");

print_num(v, len);

return 0;

}

c语言编程实现dsa算法,C语言实现DSA算法(不包括质数生成)相关推荐

  1. c语言编程期刊论文管理系统,C语言编程下计算机软件论文

    1计算机软件C语言的编程实验 1.1计算机软件C语言的编程技巧 计算机软件C语言的编程中,最主要的依据是指针应用,C语言指针能够根据软件程序的编写需求,构建可行的函数,而程序员在设计函数编程的过程中, ...

  2. 高斯消元法的c语言编程,列主元高斯消元法的C语言编程

    列主元高斯消元法的C语言编程 列主元高斯消元法 基本思想:用高斯消元法求解线性方程组时,为避免小的主元,在进行第k步消元前,应该在第k列(k)元素aik(i k,(k)(k)例如|aikk| max| ...

  3. c语言程序设计自学跟谁好,双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好...

    双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好 首页 > 软件 > 双辽c语言编程学习 作者:镀金池   发布时间:2017-12-07 05:48 一个C语 ...

  4. c语言程序设计需要学多久,九江c语言编程学习,九江学c语言编程报班,九江学c语言编程一般要多久才能学会...

    九江c语言编程学习,九江学c语言编程报班,九江学c语言编程一般要多久才能学会 首页 > C语言 > 九江c语言编程学习 作者:镀金池   发布时间:2017-10-18 14:11 据ID ...

  5. c语言编程学多久,丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会...

    丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会 首页 > 软件 > 丰城c语言编程学习 作者:镀金池   发布时间:2018-04-09 16:40 在之后 ...

  6. 江门C语言培训,江门c语言编程学习,江门学c语言编程培训,江门学c语言编程效果怎么样...

    江门c语言编程学习,江门学c语言编程培训,江门学c语言编程效果怎么样 首页 > C语言 > 江门c语言编程学习 作者:镀金池   发布时间:2017-10-18 09:25 在初期的C语言 ...

  7. C语言报名里面培训怎么填,庄河c语言编程学习,庄河学c语言编程培训,庄河学c语言编程报个培训班怎么样...

    庄河c语言编程学习,庄河学c语言编程培训,庄河学c语言编程报个培训班怎么样 首页 > 软件 > 庄河c语言编程学习 作者:镀金池   发布时间:2017-11-29 11:13 明天利用时 ...

  8. 罗定c语言,罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费...

    罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费 首页 > 软件 > 罗定学c语言编程 作者:镀金池   发布时间:2018-10-04 23:40 依照c语言的法则, ...

  9. 安庆师范大学c语言程序设计,安庆c语言编程学习,安庆学c语言编程培训,安庆学c语言编程一般能拿多少工资...

    安庆c语言编程学习,安庆学c语言编程培训,安庆学c语言编程一般能拿多少工资 首页 > C语言 > 安庆c语言编程学习 作者:镀金池   发布时间:2017-10-18 15:20 假定我们 ...

  10. 汕头c语言培训班,汕头c语言编程学习,汕头学c语言编程哪个好,汕头学c语言编程需要报培训班吗...

    汕头c语言编程学习,汕头学c语言编程哪个好,汕头学c语言编程需要报培训班吗 首页 > C语言 > 汕头c语言编程学习 作者:镀金池   发布时间:2017-10-18 20:12 经历:若 ...

最新文章

  1. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步
  2. react native 学习笔记
  3. Android --- layout_marginStart和layout_marginEnd的详细讲解
  4. iOS开发之打包上传报错: ERROR ITMS-90087/ERROR ITMS-90125
  5. ubuntu分解压缩包
  6. 西工大计算机学院交流,2017西工大计算机交流+精贵资料
  7. 2017年前端最受欢迎调查报告:ES 6,React和Sublime Text依然霸主
  8. vue中组件的导出导入_5.2 vue中 keep-alive 组件的作用,详细解释keep-alive使用方法...
  9. hp dl360安装rhel6.4时找不到硬盘
  10. Android 查看內存使用
  11. \sbin\nginx:cannot execute binary file
  12. HTML简单登录界面的实现
  13. 荣耀4a android art,荣耀4A黑科技大揭秘,真是给工程师给跪了!!
  14. 关于3分频电路的讨论
  15. 一直又爱又恨的jqueryValidate,看到一个还不错的laber.error样式
  16. esp8266灯上电闪一下_怎样使用ESP8266-01引脚和指示灯
  17. Google Cloud Speech-to-Text / Text-to-Speech API 试用
  18. vs6 中没有集成vss的问题
  19. 写服务器node实际项目,基于node搭建服务器,写接口,调接口,跨域的实例
  20. R语言常微分方程数值解海强作业

热门文章

  1. sql进行批量更新或者一条sql写出批量更新的语句
  2. 华为面试题库c语言,华为校园招聘c语言面试题集.doc
  3. Altium Designer:从零开始的电路板制作攻略
  4. Day 16-Vue3 技术_Composition API 的优势
  5. 怎么选择一个好的企业即时通讯软件
  6. cs231n:assignment2——Q4: ConvNet on CIFAR-10
  7. Javascript定义类或对象之动态原型法
  8. janusgraph编程指南之-Schema设计
  9. 火狐浏览器翻译页面功能如何设置
  10. 多元线性回归分析(Stata)