数据加密 ---- RSA 加密

1. 前言

之前几篇博文介绍了数据加密中的几种常用形式,如,单向加密中的MD5加密SHA加密,如,分组加密中的AES加密DES加密,也介绍了经常使用的异或加密。这一篇来介绍不对称加密算法中经常使用的一种——RSA加密。

 

其他算法可以看:数据加密 ---- 总篇

 

2. 简介

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

1983年9月12日麻省理工学院在美国为RSA算法申请了专利。这个专利2000年9月21日失效。由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。

 

3. 公钥和私钥

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)public key(PK) 是公开信息,而解密密钥(即秘密密钥)secret key(sk) 是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,由于无法计算出大数的欧拉函数{\color{Magenta}\phi(N)},所以不能根据PK计算出SK。

所以一段数据的RSA 算法过程大概总结为下图:

例如,Alice 给Tom 发一个私密消息,又不能让其他人截取,Alice 只需要拿到Tom 给的公钥,Tom拿到加密好的密文用自己的私钥进行解密,就可以知道Alice 发送的私密消息。同样的,Tom 给Alice 回复消息,只需要通过Alice给的公钥进行加密后,Alice 通过自己的私钥进行解密即可。这样,只要拥有对方的公钥,就可以相互的通信,而即使在此过程中公钥被截取,也无法计算出私钥而进行解密。

 

4. RSA 算法

4.1 获取密钥

1、寻找两个不相同的质数

随意选择两个大的质数 p和 q,p 不等于 q,计算N=p * q

什么是质数?

质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。

比如2,3,5,7这些都是质数,9就不是了,因为3*3=9了

2、根据欧拉函数获取 r

求得 r = φ(N) = φ(p)φ(q) = (p-1)(q-1)

这里的数学概念就是什么是欧拉函数了,什么是欧拉函数呢?

欧拉函数的定义:

欧拉函数 φ(n)是小于或等于 的正整数中与 n 互质的数的数目。

互质的定义:

如果两个或两个以上的整数的最大公约数是 1,则称它们为互质

例如:φ(8) = 4,因为1,3,5,7均和8互质。

推导欧拉函数:

(1)如果n = 1φ(1) = 1;(小于等于1的正整数中唯一和1互质的数就是1本身);

(2)如果n为质数,φ(n) = n - 1;因为质数和每一个比它小的数字都互质。比如5,比它小的正整数1,2,3,4都和他互质;

(3)如果nak次幂,则 φ(n) = φ(a^k) = a^k- a^{k-1} = (a-1)a^{k-1};

(4)若m,n互质,则 φ(mn) = φ(m)φ(n)

证明:ABC是跟mnmn互质的数的集,据中国剩余定理(经常看数学典故的童鞋应该了解,剩余定理又叫韩信点兵,也叫孙子定理),A*BC可建立双射一一对应)的关系。(或者也可以从初等代数角度给出欧拉函数积性的简单证明) 因此的φ(n)值使用算术基本定理便知。(来自维基百科)

3、选择一个小于 r 并与 r 互质的整数 e

选择一个小于 r 并与 r 互质的整数 e,求得 e关于 r 的模反元素,命名为ded \equiv 1(mod r)模反元素存在,当且仅当e与r互质),e我们通常取65537。

模反元素:

如果两个正整数 a 和 n 互质,那么一定可以找到整数 b,使得 ab -1 被n整除,或者说ab被n除的余数是1

比如3和5互质,3关于5的模反元素就可能是2,因为3*2-1=5可以被5整除。所以很明显模反元素不止一个,2加减5的整数倍都是3关于5的模反元素{…-3, 2,7,12…} 放在公式里就是3*2 = 1 (mod 5);

上面所提到的欧拉函数用处实际上在于欧拉定理

如果两个正整数an互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:

a^{\varphi(n)} \equiv 1(mod n)

由此可得:aφ(n - 1)次方肯定是a关于n的模反元素。

欧拉定理就可以用来证明模反元素必然存在。

由模反元素的定义和欧拉定理我们知道,aφ(n)次方减去1,可以被n整除。比如,3和5互质,而5的欧拉函数φ(5)等于4,所以34次方(81)减去1,可以被5整除(80/5=16)。

小费马定理:

假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成

a^{p-1}\equiv 1 (mod p)

这其实是欧拉定理的一个特例。

4、销毁p和q

此时我们的(N , e)是公钥,(N, d)为私钥,把公钥(N, e)传给别人,然后将(N, d)自己藏起来

 

4.2 加密消息

假设Alice 想给Tom 送一个消息 m,他知道Tom 产生的 N和 e。他使用起先与Tom 约好的格式将 m转换为一个小于 N的非负整数 n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为 n。用下面这个公式他可以将 n 加密为 c:

{\color{Red} \mathbf{n^e}} {\color{Red} \mathbf{\equiv}} c (mod N)

计算 c并不复杂。Alice算出 c后就可以将它传递给Tom 。

 

4.3 解密消息

Tom 得到Alice 的消息 c 后就可以利用她的密钥 d 来解码。她可以用以下这个公式来将 c 转换为 n:

\mathbf{​{\color{Red} c^d}} {\color{Red} \equiv} n (mod N)

得到 n 后,她可以将原来的信息 m 重新复原。

 

解码原理:

由 n^e \equiv c (mod N)

c = n^e - kN

那么,c^d = (n^e - kN)^d,所以,只需要证明(n^e - kN)^d \equiv n (mod N) 即可。

将上述方程式的左侧用二项式定理展开,

(n^e - kN)^d = C_d^0 * n^{ed} * (-kN)^0 + C_d^1 * n^{e(d-1)} * (-kN)^1 + ... +  C_d^d * n^{e0} * (-kN)^d

可以发现,由于第二项开始都是 N 的整数倍,mod 后都为0,所以step2的证明可以简化为,

n^{ed} \equiv n (mod N)

 

又因为ed \equiv 1 (mod r),即 ed = 1 + hφ(N),得到

n^{ed} = n^{1+h\varphi(N)} = n * n^{h\varphi(N)} = n * (n^{\varphi(N)})^h ,那么只需要证明,

n * \mathbf{​{\color{Red} (n^{\varphi(N)})^h}} \mathbf{​{\color{Red} \equiv}} n (mod N)

1、如果n 与 N互质,那么n^{\varphi(N)} \equiv 1 (mod N),

n^{\varphi(N)} = 1 + kN 

这里的 k 与上面不是一个,理解为一个系数就可以。

最后n * (1 + kN)^h = n + ... + N 的倍数 \equiv n (mod N)

所以,等式验证成功。

2、如果n 与 N 不是互质关系

此时,N = pq,p、q为两个质数,那么n 肯定是p或者q的倍数。即,n 为kp或者为kq。

如果以n=kp为例,这时k 和q必然互质。如果k 与q不为互质,那么k=ix,q=iy,i 为非1的最大公约数,又因为q 为质数,所以i 为q,那么n=kp=qxp=xn,但是按照RSA规范,n < N ,所以,k与q必然互质。

因为k 与q 互质,p与q也是互质,所以kp 与q 是互质,即n 与q是互质的。由小费马定理得,如果n 与质数q 互质,那么,

(kp)^{q-1} \equiv 1 (mod q)

进一步扩展,可得:

[(kp)^{(q-1)}]^{h(p-1)} * (kp) \equiv kp  (mod q)

即,(kp)^{ed} \equivkp  (mod q)

进一步改写成等式:

(kp)^{ed} = kp + tq

显然,t能被p整除, 即t=t’p,可以得出,

(kp)^{ed} = kp + t' pq = kp + t'N \equiv kp   (mod N)

因为kp = n,所以得出

n^{ed} \equiv n (mod N)

所以,等式验证成功。

 

4.4 举例

1、P = 65

2、选两个质数,例如p=61,q=53,从而得到 N=3233

3、通过p、q计算出r=3120

4、找一个与r互质的数e=17(其实这个数很好找,找个质数,整数倍不是r即可)

5、根据e、r计算出d=2753

6、销毁p、q

--------------- 至此,密钥部分完成 --------------

7、加密

根据公式 c=n^e mod N (即 n^e \equiv c (mod N)),算得 c=65^{17} mod 3233 = 2790

8、解密

根据公式n=c^d mod N (即c^d \equiv n (mod N)),算得 n=2750^{2753} mod 3233 = 65

 

5. 安全

假设偷听者乙获得了甲的公钥 N 和 e以及丙的加密消息 c,但她无法直接获得甲的密钥 d,要获得 d,最简单的方法是将 N 分解为p  和q,这样她可以得到同余方程 de=1 (mod(p-1)(q-1))并解出 {\displaystyle d},然后代入解密公式

c^d \equivn (mod N)

导出n(破密)。但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在。

至今为止也没有人能够证明对 N 进行因数分解是唯一的从 c 导出 n 的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。)

因此今天一般认为只要 N 足够大,那么黑客就没有办法了。

假如 N 的长度小于或等于 256 位,那么用一台个人计算机在几个小时内就可以分解它的因子了。1999年,数百台计算机合作分解了一个512位长的N。一个由Shamir 和Tromer在2003年从理论上构建的硬件TWIRL,使人们开始质疑1024位长的N的安全性,目前推荐 N 的长度至少为2048位。

1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的派生算法。(即依赖于分解大整数困难性的加密算法)

假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。

 

6. 细节

6.1 密钥细节

首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

除此之外这样找到的 p和 q还要满足一定的要求,首先它们不能太靠近,此外 p-1或 q-1的因子不能太小,否则的话 N也可以被很快地分解。

此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出 p和 q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。

此外密钥 d必须足够大,1990年有人证明假如  p大于 q而小于 2q(这是一个很经常的情况)而 d < \frac{1}{3} x N^{\frac{1}{4}},那么从 N和 e可以很有效地推算出d。此外 e=2永远不应该被使用。

 

6.2 速度

比起 DES 和其它对称算法来说,RSA要慢得多。实际上Alice 一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Tom 。

另外,由于RSA的加密速度慢,一般都会将原文进行消息摘要,进行数字签名。而原文通过对称加密的算法加密,并和该签名一同发送。详细的数字签名和认证加密,可以看另一篇博文 数字签名

 

6.3 密钥分配

和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Alice 一个公钥,并使Alice 相信这是Tom 的公钥,并且她可以截下Alice和Tom 之间的信息传递,那么她可以将她自己的公钥传给Alice,Alice以为这是Tom 的公钥。Eve可以将所有Alice 传递给Tom 的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Tom 的公钥加密后传给Tom。理论上Tom 和Alice 都不会发现Eve在偷听他们的消息。今天人们一般用可靠的第三方机构签发证书来防止这样的攻击。

 

6.4 时间攻击

1995年有人提出了一种非常意想不到的攻击方式:假如Eve对Tom 的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出d。这种攻击方式之所以会成立,主要是因为在进行加密时所进行的模指数运算是一个比特一个比特进行的,而比特为1所花的运算比比特为0的运算要多很多,因此若能得到多组消息与其加密时间,就会有机会可以反推出私钥的内容。

 

附:

android 实例:https://blog.csdn.net/shift_wwx/article/details/84325007

 

参考:

https://blog.csdn.net/shift_wwx/article/details/84583947

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RSA算法是一种非对称加密算法,它需要生成公钥和私钥,然后使用公钥加密数据,使用私钥解密数据。下面是一个使用RSA-3072算法进行加密的C++示例代码: ```c++ #include <iostream> #include <string> #include <openssl/rsa.h> #include <openssl/pem.h> using namespace std; int main() { string message = "Hello, this is a message to be encrypted using RSA-3072 algorithm!"; string public_key_file = "public_key.pem"; // 读取公钥文件 FILE* fp = fopen(public_key_file.c_str(), "rb"); if (!fp) { cout << "Failed to read public key file!" << endl; return -1; } RSA* rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); fclose(fp); // 加密 int key_size = RSA_size(rsa); unsigned char* encrypted = new unsigned char[key_size]; int encrypted_length = RSA_public_encrypt(message.length(), (unsigned char*)message.c_str(), encrypted, rsa, RSA_PKCS1_PADDING); // 输出加密结果 cout << "Encrypted message: "; for (int i = 0; i < encrypted_length; i++) { printf("%02X", encrypted[i]); } cout << endl; RSA_free(rsa); delete[] encrypted; return 0; } ``` 需要注意的是,使用RSA算法进行加密和解密的数据长度不能超过密钥长度减去一定的额外长度(例如PKCS#1填充方式需要额外长度11字节),否则加密或解密会失败。对于RSA-3072算法来说,密钥长度为3072位,即384字节,使用PKCS#1填充方式则额外长度为11字节,因此每次加密数据长度不能超过373字节。如果需要加密更大的数据,可以考虑使用对称加密算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值