python——RSA算法

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

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40909772/article/details/88068085