使用实例讲解RSA算法(用于公钥和私钥体系)


使用实例讲解RSA算法(用于公钥和私钥体系)
更新日期:2010年4月27日

使用实例讲解RSA算法(用于公私钥体系)

摘自http://www.cfca.com.cn/zhishi/wz-012.htm

RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。

   RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。

RSA的安全基于大数分解的难度。其公私钥是一对大素数(100200位十进制数或更大)的函数。从一个公和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。

RSA的公、私的组成,以及加密、解密的公式可见于下表:

可能各位同事好久没有接触数学了,看了这些公式不免一头雾水。别急,在没有正式讲解RSA加密算法以前,让我们先复习一下数学上的几个基本概念,它们在后面的介绍中要用到:

一、 什么是素数

素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,1535,所以15不是素数;又如,126243,所以12也不是素数。另一方面,13除了等于131以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为质数

二、什么是互质数(或互素数)?

小学数学教材对互质数是这样定义的:公约数只有1的两个数,叫做互质数。这里所说的两个数是指自然数。

判别方法主要有以下几种(不限于此):

1)两个质数一定是互质数。例如,271319

2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3105 26

31不是质数也不是合数,它和任何一个自然数在一起都是互质数。如19908

4)相邻的两个自然数是互质数。如 15 16

5)相邻的两个奇数是互质数。如 49 51

6)大数是质数的两个数是互质数。如9788

7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7 16

8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357715357=3×7×17,而3717都不是715的约数,这两个数为互质数。等等。

三、什么是模指数运算?

指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=126 mod 6=228 mod 2 =0等等。

模指数运算就是先做指数运算,取其结果再做模运算。如

好,现在开始正式讲解RSA加密算法。

算法描述:

1)选择一对不同的、足够大的素数pq

2)计算n=pq

3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。

4)找一个与f(n)互质的数e,且1<e<f(n)< span="">

5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)

这里要解释一下,是数论中表示同余的符号。公式中,符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边de的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。

6)公KU=(e,n),私KR=(d,n)

7)加密时,先将明文变换成0n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:

8)解密过程为:

实例描述:

在这篇科普小文章里,不可能对RSA算法的正确性作严格的数学证明,但我们可以通过一个简单的例子来理解RSA的工作原理。为了便于计算。在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:

1)设计公私密钥(e,n)(d,n)

p=3q=11,得出n=p×q=3×11=33f(n)=(p-1)(q-1)=2×10=20;取e=3,(320互质)则e×d≡1 mod f(n),即3×d≡1 mod 20

d怎样取值呢?可以用试算的办法来寻找。试算结果见下表:

通过试算我们找到,当d=7时,e×d≡1 mod f(n)同余等式成立。因此,可令d=7。从而我们可以设计出一对公私密钥,加密密钥(公)为:KU =(e,n)=(3,33),解密密钥(私)为:KR =(d,n)=(7,33)

2)英文数字化。

将明文信息数字化,并将每块两个数字分组。假定明文英文字母编码表为按字母顺序排列数值,即:

  则得到分组后的key的明文信息为:110525

3)明文加密

用户加密密钥(3,33) 将数字化明文分组信息加密成密文。由C≡Me(mod n)

  因此,得到相应的密文信息为:113116

4)密文解密。

  用户B收到密文,若将其解密,只需要计算,即:

用户B得到明文信息为:110525。根据上面的编码表将其转换为英文,我们又得到了恢复后的原文“key”

 你看,它的原理就可以这么简单地解释!

当然,实际运用要比这复杂得多,由于RSA算法的公的长度(模长度)要到1024位甚至2048位才能保证安全,因此,pqe的选取、公的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。

最后简单谈谈RSA的安全性

首先,我们来探讨为什么RSA密码难于破解?

RSA密码应用中,公KU是被公开的,即en的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的en的数值(n等于pq),想法求出d的数值,这样就可以得到私来破解密文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)(q-1)。换句话说,只要求出pq的值,我们就能求出d的值而得到私

pq是一个大素数的时候,从它们的积pq去分解因子pq,这是一个公认的数学难题。比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。因此,RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公方案之一。

然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。

此外,RSA的缺点还有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<<引用[1]>>中提到了非对称加密算法,其中最广为使用的就是RSA算法RSA算法是一种基于大数因数分解的加密算法,它是一种公钥加密算法,即加密和解密使用不同的密钥。RSA算法的安全性基于大数分解的难度,即将一个大数分解成两个质数的乘积的难度。RSA算法的具体实现步骤如下: 1. 选择两个大质数p和q,计算它们的乘积n=p*q。 2. 计算欧拉函数φ(n)=(p-1)*(q-1)。 3. 选择一个整数e,1<e<φ(n),且e与φ(n)互质。 4. 计算d,使得d*e mod φ(n)=1。 5. 公钥为(n,e),私钥为(n,d)。 6. 加密时,将明文m用公钥加密成密文c,即c=m^e mod n。 7. 解密时,将密文c用私钥解密成明文m,即m=c^d mod n。 下面是一个使用Python实现RSA算法的例子: ```python import random # 判断一个数是否为质数 def is_prime(n): if n <= 1: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True # 生成一个大质数 def generate_prime(): while True: p = random.randint(100, 1000) if is_prime(p): return p # 计算两个数的最大公约数 def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) # 计算模反元素 def mod_inverse(a, m): for i in range(1, m): if (a * i) % m == 1: return i return None # 生成公钥私钥 def generate_key(): p = generate_prime() q = generate_prime() n = p * q phi_n = (p - 1) * (q - 1) while True: e = random.randint(2, phi_n - 1) if gcd(e, phi_n) == 1: break d = mod_inverse(e, phi_n) return (n, e), (n, d) # 加密 def encrypt(m, public_key): n, e = public_key c = pow(m, e, n) return c # 解密 def decrypt(c, private_key): n, d = private_key m = pow(c, d, n) return m # 测试 public_key, private_key = generate_key() print("公钥:", public_key) print("私钥:", private_key) m = 123 c = encrypt(m, public_key) print("密文:", c) m = decrypt(c, private_key) print("明文:", m) ``` <<引用>>中提到了DES算法,它是一种对称加密算法,即加密和解密使用相同的密钥。DES算法的具体实现步骤如下: 1. 将64位明文分成左右两个32位的部分L0和R0。 2. 将R0作为下一轮的L0。 3. 将R0通过扩展置换E扩展成48位,与密钥K1进行异或运算,得到48位的结果。 4. 将异或运算的结果分成8个6位的部分,每个部分作为S盒的输入,得到8个4位的输出。 5. 将8个4位的输出合并成32位的输出,通过P盒置换得到32位的结果。 6. 将32位的结果与L0进行异或运算,得到R1。 7. 重复2-6步,直到得到L16和R16。 8. 将L16和R16交换,得到64位的密文。 下面是一个使用Python实现DES算法的例子: ```python # 初始置换IP IP = [58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7] # 逆初始置换IP^-1 IP_INV = [40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25] # 扩展置换E E = [32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1] # 置换P P = [16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25] # S盒 S_BOX = [ # S1 [ [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7], [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8], [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0], [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13] ], # S2 [ [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10], [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5], [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15], [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9] ], # S3 [ [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8], [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1], [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7], [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12] ], # S4 [ [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15], [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9], [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4], [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14] ], # S5 [ [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9], [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6], [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14], [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3] ], # S6 [ [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11], [10

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值