用libtommath实现RSA算法
RSA算法描述:
1) 选择两个大素数 p、q, 计算 n = p*q;
2) 产生 e, d 使:
e*d = 1mod(p-1)(q-1)
e 与 (p-1)(q-1) 互质
[公钥] e、n
[私钥] d、n
3) 加密:
c = m^d mod n
4) 解密:
m = c^e mod n
--------------------------------------------------------------------------------------
libtommath是一个大数算法库。以下的代码是用这个库中的函数实现的,相当简单。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#include <tommath.h>typedef struct { int bits; /* bits in key */ mp_int n; /* modulus */ mp_int e; /* public exponent */ mp_int d; /* private exponent */}rsa_key;int rsa_rng(unsigned char *dst, int len, void *dat){ int x; for (x = 0; x < len; x++) dst[x] = rand() & 0xFF; return len;}int rsa_preme_random( mp_int *a, int bits ){ int err = mp_prime_random_ex( a, 8, bits, LTM_PRIME_2MSB_ON|LTM_PRIME_SAFE, rsa_rng, NULL ); if (err != MP_OKAY) { return -1; } return 0;}int rsa_gen_key( rsa_key *key, int bits ){ mp_int p, q; mp_int sp, sq; mp_int n, m; mp_int e, d; mp_int t; //init mp_ints mp_init( &p ); mp_init( &q ); mp_init( &sp ); mp_init( &sq ); mp_init( &n ); mp_init( &m ); mp_init( &e ); mp_init( &d ); mp_init( &t ); //genarate p & q rsa_preme_random( &p, bits/2 ); rsa_preme_random( &q, bits/2 ); //make n & m mp_sub_d( &p, 1, &sp ); mp_sub_d( &q, 1, &sq ); mp_mul( &p, &q, &n ); mp_mul( &sp, &sq, &m ); //make e & d mp_set( &e, 127 ); retry_e: mp_gcd( &e, &m, &t ); if( ( mp_cmp_d(&t, 1) ) > 0 ){ mp_add_d( &e, 2, &e ); goto retry_e; } mp_invmod( &e, &m, &d ); //copy n d e to key struct mp_init( &key->n ); mp_init( &key->d ); mp_init( &key->e ); key->bits = bits; mp_copy( &n, &key->n ); mp_copy( &d, &key->d ); mp_copy( &e, &key->e ); mp_clear( &p ); mp_clear( &q ); mp_clear( &sp );mp_clear( &sq ); mp_clear( &n ); mp_clear( &m ); mp_clear( &e ); mp_clear( &d ); mp_clear( &t ); return 0;}/*set rsa key by string */int rsa_set_key( rsa_key *key, char *sn, char *se, char *sd, int bits, int radix ){ key->bits = bits; mp_init( &key->n ); mp_init( &key->d ); mp_init( &key->e ); if( sn ) mp_read_radix( &key->n, sn, radix ); if( se ) mp_read_radix( &key->e, se, radix ); if( sd ) mp_read_radix( &key->d, sd, radix ); return 0;}/*encrypt by private key */int rsa_encrypt(mp_int *c, mp_int *m, rsa_key *key){ mp_exptmod( c, &key->d, &key->n, m ); return 0;}/*decrypt by public key */int rsa_decrypt(mp_int *m, mp_int *c, rsa_key *key){ mp_exptmod( m, &key->e, &key->n, c ); return 0;}int rsa_test(){ mp_int c, m; rsa_key key; char sn[] = "BB7F51983FD8707FD6227C23DEF5D5377A5A737CEF3C5252E578EFE136DF87B50473F9341F1640C8D258034E14C16993FCE6C6B8C3CEEB65FC8FBCD8EB77B3B05AC7C4D09E0FA1BA2EFE87D3184DB6718AE41A7CAD89B8DCE0FE80CEB523D5D647F9DB58A31D2E71AC677E67FA6E75820736C9893761EE4ACD11F31DBDC349EF"; char se[] = "010001"; char sm[] = "AA7B0BF4AAE8B7C2ECC485ACFA57770E50BB9207233E4278654717E470691981C187F81FFC3B90895063EF98C0D86B5297B655399309E6699FEE2270B0F3431B5ABAD7E516261926C35BF6BBFEFB49366EBE96DC510E9CBD915337E8188D517D15DCF90298C40233EEEAFD5A9459F5D3410E6B89B44DF6E818FA3594EF935534"; char sc[1024]; mp_init( &c ); mp_init( &m ); rsa_set_key( &key, sn, se, NULL, 128, 16 ); mp_read_radix( &m, sm, 16 ); rsa_decrypt( &m, &c, &key ); mp_toradix( &c, sc, 16 ); printf("%s\n", sc); return 0;} |
用libtommath实现RSA算法的更多相关文章
- 信息安全-5:RSA算法详解(已编程实现)[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...
- RSA算法原理
一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...
- C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用
.net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...
- [已解决] 快速理解RSA算法
RSA算法基础详解 http://www.cnblogs.com/hykun/p/RSA.html RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/ ...
- 公钥私钥和RSA算法
1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...
- 跨越千年的RSA算法
转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
- (转)RSA算法原理(二)
作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...
- (转) RSA算法原理(一)
最近用到了RSA加密算法,虽然有现成的,但是想看看它的原理,翻到此文,感觉写得很好,通俗易懂,转了. 作者: 阮一峰 日期: 2013年6月27日 如果你问我,哪一种算法最重要? 我可能会回答&q ...
- springmvc使用RSA算法加密表单
今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...
随机推荐
- 实践认识--ANN
1. 常用激活函数 激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数. (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Functio ...
- 如何给redis设置密码
如何给redis设置密码 学习了:https://blog.csdn.net/qq_35357001/article/details/56835919
- HeadFirst设计模式 之 C++实现(三):Decorator(装饰者模式)
装饰者模式是非常有意思的一种设计模式,你将可以在不改动不论什么底层代码的情况下.给你的(或别人的)对象赋予新的职责. 不是使用继承每回在编译时超类上改动代码,而是利用组合(composition)和托 ...
- python正则方法
通过正则替换字符串 res=re.sub(正则,newString,srcString)//返回替换后的字符串 res,m=res.subn(正则,newString,srcString)//返回替换 ...
- Android SDK下载速度慢的解决方法(简单使用代理)
相信做android开发的同学们.一定会遇到的问题就是google那边常常崩,可是学习的開始.我们又必须要用Android SDK,(几个G的大小),一般我们装完ADT之后(假设你用的是Eclipse ...
- Git命令学习总结(-)
入职的第一天,让git命令直接给难住了,汗!使用习惯可视化的工具对于命令行早就忘记的一干二净.还好,回家自己练习一下,总会没有错的.git就不做简介了,版本管理除了svn就是git了,其他的都无所谓了 ...
- 【转载】C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项
1.为什么需要扩展方法 .NET3.5给我们提供了扩展方法的概念,它的功能是在不修改要添加类型的原有结构时,允许你为类或结构添加新方法. 思考:那么究竟为什么需要扩展方法呢,为什么不直接修改原有类型呢 ...
- 详谈kubernetes更新-2
系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...
- mysql启动warning: World-writable config file
如果在启动warning: World-writable config file /home/mysql/my.cnf is ignored原因:my.cnf的读取权限进行了设置,不允许World-w ...
- Please read "Security" section of the manual to find out how to run mysqld as root!
[root@test ~]# /usr/local/mysql/bin/mysqld2018-08-05T08:29:05.143142Z 0 [Warning] [MY-011070] [Serve ...