1简介。
RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
2.算法过程。
(1)选择两个不相等的质数p和 q,例如:p=61,q=53
(2)在1 ~ (p-1)(q-1) 随机选择一个整数e,并且要与(p-1)(q-1)互质(最大公约数为1),1<e<60×52=31201<e<60×52=3120,且需要和3120互质,随便选取一个符合条件的数17
(3)计算二元一次方程,ex+(p−1)(q−1)y=1,ex+(p−1)(q−1)y=1,也就是计算 17x+3120y=1,例如x=2753,y=-15
(4)公钥为和私钥(pq,x)即:公钥为(3233,17)私钥为(3233,2753)
3.代码实现算法过程。
例如:
#!/usr/bin/python
#coding:utf-8
'''
扩展欧几里的算法
计算 ax + by = 1中的x与y的整数解(a与b互质)
'''
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b)
x = y1
y = x1 - a / b * y1
return r, x, y
def gen_key(p, q):
n = p * q
fy = (p - 1) * (q - 1) # 计算与n互质的整数个数 欧拉函数
e = 65537 # 选取e 一般选取65537
a = e
b = fy
r, x, y = ext_gcd(a, b)
d = x
# 返回: 公钥 私钥
return (n, e), (n, d)
def main():
#公钥私钥中用到的两个大质数p,q
p = 302825536744096741518546212761194311477
q = 325045504186436346209877301320131277983
pubkey, selfkey = gen_key(p, q)
print pubkey #输出公钥
print selfkey #输出私钥
if __name__ == "__main__":
main()
结果:
4.实现信息加解密过程。
加解密过程请看这位博主的文章:https://www.cnblogs.com/hykun/p/RSA.html
代码:
#!/usr/bin/python
#coding:utf-8
'''
扩展欧几里的算法
计算 ax + by = 1中的x与y的整数解(a与b互质)
'''
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b)
x = y1
y = x1 - a / b * y1
return r, x, y
'''
超大整数超大次幂然后对超大的整数取模
(base ^ exponent) mod n
'''
def exp_mode(base, exponent, n):
bin_array = bin(exponent)[2:][::-1]
r = len(bin_array)
base_array = []
pre_base = base
base_array.append(pre_base)
for _ in range(r - 1):
next_base = (pre_base * pre_base) % n
base_array.append(next_base)
pre_base = next_base
a_w_b = __multi(base_array, bin_array)
return a_w_b % n
def __multi(array, bin_array):
result = 1
for index in range(len(array)):
a = array[index]
if not int(bin_array[index]):
continue
result *= a
return result
def gen_key(p, q):
n = p * q
fy = (p - 1) * (q - 1) # 计算与n互质的整数个数 欧拉函数
e = 65537 # 选取e 一般选取65537
# generate d
a = e
b = fy
r, x, y = ext_gcd(a, b)
d = x
# 返回: 公钥 私钥
return (n, e), (n, d)
# 加密 m是被加密的信息 加密成为c
def encrypt(m, pubkey):
n = pubkey[0]
e = pubkey[1]
c = exp_mode(m, e, n)
return c
# 解密 c是密文,解密为明文m
def decrypt(c, selfkey):
n = selfkey[0]
d = selfkey[1]
m = exp_mode(c, d, n)
return m
if __name__ == "__main__":
'''公钥私钥中用到的两个大质数p,q'''
p = 302825536744096741518546212761194311477
q = 325045504186436346209877301320131277983
pubkey, selfkey = gen_key(p, q)
'''需要被加密的信息转化成数字,长度小于秘钥n的长度,
如果信息长度大于n的长度,那么分段进行加密,分段解密即可。
'''
m = 98711236
'''信息加密'''
c = encrypt(m, pubkey)
print c
'''信息解密'''
d = decrypt(c, selfkey)
print d
结果: