RSA加密算法简单介绍以及python实现

RSA加密算法简单介绍以及python实现RSA 加密算法简单介绍 RSA 是一种公钥加密算法 它具有公钥和私钥两种密钥 公钥用来加密 并且是公开的 私钥是用来解密的 是不公开的 也不需要和数据一起传送 这样就能防止密钥在网络传输时泄露 RSA 算法设计的原理是依靠着模幂运算 例如加密 解密以及密钥的产生 1 密钥设计首先 我们需要了解密钥设计的思想 加密计算 c m emodn 解密计算 m c dmodn 其中 m 为明文 c 为密文 e 为公钥 d 为私钥 n 为一个我们要产生的大数 所以 根据以上两个式子有 dk ek

RSA加密算法简单介绍

注:本篇文章只是本人在学完RSA加密之后的个人总结,若有不正确的地方,欢迎指正OVO

RSA是一种公钥加密算法,它具有公钥和私钥两种密钥:公钥用来加密,并且是公开的,私钥是用来解密的,是不公开的,也不需要和数据一起传送,这样就能防止密钥在网络传输时泄露。

RSA算法设计的原理是依靠着模幂运算,例如加密、解密以及密钥的产生。

1.密钥设计

m^φ(n) mod n = 1 → m ^(tφ(n)) mod n = 1 → m ^(tφ(n)+1) mod n = m ②
∴① ②中两个式子相对应,即有:ed = (t*φ(n)+1) → ed = 1 mod φ(n)
不难看出,公钥e和私钥d是关于φ(n)互逆的。




到这里,可能会有疑问,为什么别人不能根据公钥e和 φ(n)来直接求得私钥呢?,这就是接下来要讲的:如何生成n使别人难以计算φ(n)。

2.大数n的生成

3.产生大素数p,q

Miller-Rabin算法思想
首先,由费马小定理:a^p-1 = 1 mod p (p为素数),我们可以将p-1写成2 ^k*m形式,其中,a我们可随机生成,但需满足1<=a<=n-1。
那么a ^p-1 = ((a ^m) ^2) ^2 … ,所以我们可以先验算a ^m mod p的结果是否为±1,
若是,那么a ^p-1 = ((a ^m) ^2) ^2 … 一定为1,那么可以判断出p为素数;
若不是,令b=a^ m mod p的结果,然后依次计算b, b^ 2,b^ 4,…,b^ 2^(k-1) mod n,若发现有一个为±1,则p是素数,否则,p为合数。








但是,这种算法并不是100%正确,有时候也会将合数当成素数输出,所以一般情况下,我们可以产生伪随机数来进行素数检测,而不是使用随机数来检测。

Miller-Rabin算法具体代码如下:

#判断是否为素数(Miller-Rabbin),RoundTime表示循环测试的次数,提高准确率 def _MillerRabin(self, num: int, times: int): # Miller-Rabin素性检验 # return False if n is not prime m = num-1 k = 0 while m & 1 == 0: m >>= 1 k += 1 for _ in range(times): x = random.randrange(2, num) x = self._FastExpMod(x, m, num) for _ in range(k): y = (x*x) % num if y == 1 and x != 1 and x != num-1: return False x = y if y != 1: return False return True 

4.密钥生成

我们生成两个大素数p,q后,我们就可以直接得到φ(n)。对于公钥e,我们可以随机生成,但需要满足gcd(e,φ(n))=1(可以使用欧几里得除法来判断余数是否为1)。

然后对于私钥d,因为ed = 1 mod φ(n)所以我们只需要求逆元就能得到d,然而求逆元可以根据欧几里得除法逆过程来求得。欧几里得除法求逆代码如下:

 #求x,y为两个所求逆元,其中y为私钥 def _ExtendedEuclidean(self, a: int, b: int): # 扩展欧几里得算法 # return x, y, gcd(a,b) # 使得x*a + y*b = gcd(a,b) # 非递归实现 if b == 0: return 1, 0, a y = s1 = 1 x = s2 = 0 q, r = divmod(a, b) while r: m = x n = y x = s1 - x*q y = s2 - y*q s1 = m s2 = n a = b b = r q, r = divmod(a, b) return x, y, b 

5.加解密

但是,对于大数的计算,我们不能直接使用高级语言所给定的计算来求,这样也会导致时间太长,我们在这需要使用平方-乘算法来求。该算法具体代码如下:

#平方乘算法求余数 base^n mod mod def _FastExpMod(self, base: int, exp: int, mod: int): # 快速幂取模: 蒙哥马利幂模运算 # return baseexp % mod base = base % mod exp = exp % mod power = 1 while exp: if exp & 1: power = (power * base) % mod exp >>= 1 base = (base * base) % mod return power 

全部代码

import random class RSA: def __init__(self): self._lowPrimes = [2, 3, 5, 7, 11, 13, 17, 19] for i in range(self._lowPrimes[-1]+1, 1000): for p in self._lowPrimes: if i % p: continue else: break else: self._lowPrimes.append(i) def _FastExpMod(self, base: int, exp: int, mod: int): # 快速幂取模: 蒙哥马利幂模运算 # return baseexp % mod # base = base % mod # exp = exp % mod power = 1 while exp: if exp & 1: power = (power * base) % mod exp >>= 1 base = (base * base) % mod return power def _MillerRabin(self, num: int, times: int): # Miller-Rabin素性检验 # return False if n is not prime m = num-1 k = 0 while m & 1 == 0: m >>= 1 k += 1 for _ in range(times): x = random.randrange(2, num) x = self._FastExpMod(x, m, num) for _ in range(k): y = (x*x) % num if y == 1 and x != 1 and x != num-1: return False x = y if y != 1: return False return True def _IsNotPrime(self, num: int, times: int = 10): # 分解质因数测试 + Miller-Rabin素性检验 # return True if n is not prime if num < 2: return True # 分解质因数 for p in self._lowPrimes: d, m = divmod(num, p) if m == 0: if d == 1: return False else: return True # Miller-Rabin isP = self._MillerRabin(num, times) return not isP def _FindPrime(self, low_bits: int, high_bits: int) -> int: # 在区间[2^lowBits,2^highBits)寻找一个素数 lowNum = 1 << low_bits highNum = 1 << high_bits n = random.randrange(lowNum, highNum) while self._IsNotPrime(n): n = random.randrange(lowNum, highNum) return n def _ExtendedEuclidean(self, a: int, b: int): # 扩展欧几里得算法 # return x, y, gcd(a,b) # 使得x*a + y*b = gcd(a,b) # 非递归实现 if b == 0: return 1, 0, a y = s1 = 1 x = s2 = 0 q, r = divmod(a, b) while r: m = x n = y x = s1 - x*q y = s2 - y*q s1 = m s2 = n a = b b = r q, r = divmod(a, b) return x, y, b def hex2int(self, x: str) -> int: # hex字符串转换为整数 return int(x, 16) def int2hex(self, x: int) -> str: # 整数转换为hex字符串 return hex(x)[2:] def hex2bin(self, x: str) -> str: # hex字符串转换为字节数组 if len(x) & 1: x = "0" + x buffer = bytearray() for i in range(0, len(x), 2): buffer.append(self.hex2int(x[i:i+2])) x = bytes(buffer) return x.decode() def RSA_Key_Gen(self): # 生成RSA密钥对 key_len = 1024 p = self._FindPrime(key_len-6, key_len-2) q = self._FindPrime(key_len+2, key_len+6) n = p * q phi = (p-1)*(q-1) gcd = 0 while gcd != 1: e = random.randint(1, 2100) _, d, gcd = self._ExtendedEuclidean(phi, e) # 欧几里得求逆元 if d < 0: d += phi with open("RSA_Public_Key.txt", 'w') as f: res = str(n)+"\n"+str(e) f.write(res) with open("RSA_Secret_Key.txt", 'w') as f: res = str(n)+"\n"+str(d) f.write(res) def Encrypt(self, plain_text: str, public_key: tuple) -> int: data = int(plain_text.encode().hex(), 16) # 明文进行处理 n, e = public_key # 获得公钥 result = self._FastExpMod(data, e, n) return result def Decrypt(self, secret_text: int, secret_key: tuple) -> str: n, d = secret_key result = self._FastExpMod(secret_text, d, n) return self.hex2bin(self.int2hex(result)) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178586.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:57
下一篇 2026年3月26日 下午4:57


相关推荐

  • python多行注释快捷键用不了_jupyter多行注释快捷键

    python多行注释快捷键用不了_jupyter多行注释快捷键在编写Python程代码时,有时需要将部分代码注释掉,而如果我们一行一行的进行注释,显然是非常麻烦,不够方便。那么我们想要把多行代码程序快速注释掉,有没有什么快捷键可以实现多行注释吗?《Python快乐编程》千锋教育告诉你具体方法。当然是有的,并且有三种方式实现。一、我们可以通过快捷键:Ctr+/来实现。注意:我们在操作此快捷键前需要首先选中准备要注释的代码!单行和多行的注释是一样的…

    2022年8月15日
    6
  • 选择排序——C语言代码

    选择排序——C语言代码介绍选择排序下面是我在网上找的示例图,便于更好地理解选择排序通过这个图我们明白K只是一个标记,它标记的是比较中小的数。我们第一轮我们可以找到所有数中最小的数,然后让它和处于第一位的数进行位置交换,第二轮比较时,第一轮找出的最小数不在参加比较,然后我们可以找出剩下数中最小的数,之后的每轮同理。下面大家看一下我的代码首先要明白for(j=i+1;j&lt;=9;j++) { if(a[k]&…

    2022年6月25日
    37
  • 泛函分析笔记3:内积空间

    泛函分析笔记3:内积空间我们前面讲了距离空间 赋范空间 距离空间赋予了两个点之间的距离度量 范数赋予了每个点自身的长度度量 而范数则可以导出距离 本章要讲的内积可以看成是更加统一的定义 因为从内积我们可以导出范数 进而导出距离 因此内积空间是一个 更小 的空间 在此基础上结合完备性我们引出了 Hilbert 空间 后续我们的研究也大多集中在 Hilbert 空间上 文章目录 1 内积空间 2 正交补与正交投影 3 标准正交基 4 Hilbert 空间上有界线性泛函表示 1 内积空间定义 XXX 为 K mathbb K K

    2026年3月26日
    2
  • onmousemove鼠标截取

    onmousemove鼠标截取mouseover 鼠标截取

    2026年3月26日
    2
  • Delphi XE 5,Rad Studio XE 5 官方下载(附激活成功教程),更新 Update 1,Help Update 1

    Delphi XE 5,Rad Studio XE 5 官方下载(附激活成功教程),更新 Update 1,Help Update 1DelphiXE5激活成功教程,有图有真相EmbarcaderoRADStudioXE5Update2v19.0.14356.6604(等待激活成功教程中…):http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_upd2_win.isohotfix_1_2_3_…

    2022年7月18日
    29
  • 平定igb之“乱”

    平定igb之“乱”平定 igb 之 乱 作者 dnk admin

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号