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算法的更多相关文章

  1. 信息安全-5:RSA算法详解(已编程实现)[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...

  2. RSA算法原理

    一直以来对linux中的ssh认证.SSL.TLS这些安全认证似懂非懂的.看到阮一峰博客中对RSA算法的原理做了非常详细的解释,看完之后茅塞顿开,关于RSA的相关文章如下 RSA算法原理(一) RSA ...

  3. C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用

    .net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...

  4. [已解决] 快速理解RSA算法

    RSA算法基础详解 http://www.cnblogs.com/hykun/p/RSA.html RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/ ...

  5. 公钥私钥和RSA算法

    1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...

  6. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  7. (转)RSA算法原理(二)

      作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解 ...

  8. (转) RSA算法原理(一)

    最近用到了RSA加密算法,虽然有现成的,但是想看看它的原理,翻到此文,感觉写得很好,通俗易懂,转了.   作者: 阮一峰 日期: 2013年6月27日 如果你问我,哪一种算法最重要? 我可能会回答&q ...

  9. springmvc使用RSA算法加密表单

    今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...

随机推荐

  1. POJ3592 Instantaneous Transference 强连通+最长路

    题目链接: id=3592">poj3592 题意: 给出一幅n X m的二维地图,每一个格子可能是矿区,障碍,或者传送点 用不同的字符表示: 有一辆矿车从地图的左上角(0,0)出发, ...

  2. C 标准库 - <stddef.h>

    C 标准库 - <stddef.h> 简介 stddef .h 头文件定义了各种变量类型和宏.这些定义中的大部分也出现在其它头文件中. 库变量 下面是头文件 stddef.h 中定义的变量 ...

  3. odoo税金处理

    税金可以设置为'税金包含在价格中',或者'税金不包含在价格中'.         在税金计算处理过程中,odoo会将价格/金额按 total_included/ total_exincluded 分开 ...

  4. 使用 xmllint 验证 odoo xml文件

    Odoo 源码包含了2个 relax ng 文件,也是odoo sa用来验证xml的正确性的. openerp/import_xml.rng openerp/addons/base/rng/view. ...

  5. Windows 编程1

    杀死一个进程 使用命令 system( taskkill /f /im     QQ.exe); 即可. 打开一个进程 使用命令 system("应用程序的位置");   头文件: ...

  6. Ffmpeg 实现文件切割

    文件切割是一项很常见的基本功能,通过Ffmpeg可以很容易实现这项功能. 首先介绍下基本原理,文件切割说白了就过滤掉文件的部分音视频包,按照什么规则过滤呢? 答案是时间戳.文件中每个视频及音频包都有时 ...

  7. Unity3D游戏开发之简单的碰撞检測

    在"Project"面板中单击"Create"旁边的小三角,选择"javascript"创建一个名为"collision" ...

  8. ZYThumbnailTableView---堪比一个小型阅读App

    Demo github地址: https://github.com/liuzhiyi1992/ZYThumbnailTableView 原文地址:http://zyden.vicp.cc/zythum ...

  9. MongoDB 操作手冊CRUD 事务 两步提交

    运行两步提交 概述 这部分提供了多记录更新或者多记录事务.使用两步提交来完毕多记录写入的模板. 另外.能够扩展此方法来提供rollback-like功能. 背景 MongoDB对于单条记录的操作是原子 ...

  10. WPF触发器(Trigger、DataTrigger、EventTrigger)

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...