RSA解密(逆元,快速幂,快速乘)

逆元

逆元的解释

为什么会有逆元这个概念。

因为 有时我们需要计算 (A/B) % M 的值, 如果B过大,或者A过大,可能会爆精度,然后我们就想到能不(A%M / B%M)

发现这种方法不对,那我们可以将除法换成乘法(A *B^-1)% M 这样就能转化成 (A % M *B^-1% M)% M

所以我们就要来求B-1的值,因为不能用分数,所以我们就设定B-1为B的逆元

先设C为B的逆元,由上面可以知道由(a/b)%M,可以推出B*C=1(mod m)

则(A/B)%m = (A/B)*1%m = (A/B)*(B*C%M)%M= A*C(mod M)

即A/B的模等于A*B的逆元

还有一种更接地气的解释在此记录一下,首先我们设定一个加法取模的世界,是一个以0为中心的世界,有一个点从世界的中心加了3,然后又加了一个数使得点回到了世界中心,这个数就是逆元

然后又是一个乘法取模且中心为1的世界,有一个点从中心*3mod7,然后又突然乘了一个数让点mod7回到了世界中心,这个数就是在乘法世界mod7的逆元,这个世界没有除法,没有分数,因为3*5mod7=1,所以3mod7的一个逆元就是5,所以5和3就是在mod7的条件下互为逆元

为什么要逆元呢,因为除法是定义内会出现不可计算的情况,比如说3/5mod7,在这个世界里就变成了3*3mod7这就可以推导出公式(A/B)%p=(A*B-1)%p=(A%p*B-1%p)%p ==> 推导之后

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据您的要求回答问题,并保护您的隐私。 下面是用Python实现非对称加密算法RSA快速模幂乘算法的代码,代码中包含注释说明。请注意,这些示例代码仅供参考,甚至不一定是最优的实现方式。实际应用中,需要采用更高级的安全措施,如对密钥进行合适的保护和管理。同时,本AI只是一款娱乐工具,所涉及的代码仅供学习参考,不得用于非法用途。 ``` import random def mod_exp(base, exponent, modulus): """ 该函数用于计算模幂乘算法,即计算 (base^exponent) % modulus,使用二进制方法使时间复杂度降低至log2(exponent) """ result = 1 while exponent > 0: if exponent % 2 == 1: result = (result * base) % modulus exponent = exponent // 2 base = (base * base) % modulus return result def gcd(a, b): """ 该函数用于计算两个数的最大公约数,采用欧几里得算法 """ while b: a, b = b, a % b return a def extended_gcd(a, b): """ 该函数用于计算两个数的扩展欧几里得算法,返回值为 (gcd, x, y),其中gcd为a和b的最大公约数,x和y满足 ax + by = gcd """ if a == 0: return (b, 0, 1) else: gcd, x, y = extended_gcd(b % a, a) return (gcd, y - (b // a) * x, x) def generate_keypair(p, q): """ 该函数用于生成RSA加密的公钥和私钥,接受两个大质数p和q """ # 计算 n = p * q n = p * q # 计算 r = (p-1) * (q-1) r = (p - 1) * (q - 1) # 选择一个随机数 e, 1 < e < r,使得e与r互质 e = random.randrange(1, r) while gcd(e, r) != 1: e = random.randrange(1, r) # 计算模反元素d模r的乘法逆元,也就是 (e*d) mod r = 1,其中 d 称为私钥 _, d, _ = extended_gcd(e, r) # 返回公钥和私钥 return ((n, e), (n, d)) def encrypt(public_key, plaintext): """ 该函数用于使用RSA算法进行加密,接受公钥和明文 """ # 解构公钥 n, e = public_key # 对每个明文字符m,c = m^e mod n ciphertext = [mod_exp(ord(char), e, n) for char in plaintext] # 将加密后的字符列表拼接成字符串并返回 return ''.join(map(str,ciphertext)) def decrypt(private_key, ciphertext): """ 该函数用于使用RSA算法进行解密,接受私钥和密文 """ # 解构私钥 n, d = private_key # 对每个密文字符c,m = c^d mod n plaintext = [chr(mod_exp(char, d, n)) for char in ciphertext] # 将解密后的字符列表拼接成字符串并返回 return ''.join(plaintext) # 生成公钥和私钥 p = 17 q = 19 public_key, private_key = generate_keypair(p, q) # 进行加密和解密 message = "Hello, World!" encrypted_message = encrypt(public_key, message) decrypted_message = decrypt(private_key, encrypted_message) print("Public Key: ", public_key) print("Private Key: ", private_key) print("Original Message: ", message) print("Encrypted Message: ", encrypted_message) print("Decrypted Message: ", decrypted_message) ``` 希望这份代码可以回答您的问题,如果您还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值