攻防世界:Crypto习题之easy_RSA

攻防世界:Crypto习题之easy_RSA

RSA 加密

在非对称加密算法中,单向函数被广泛应用,用于确保从公钥加密后的密文无法轻易推导出私钥,从而保证数据的安全性。而其中最著名的算法便是 RSA 加密算法。

首先设 φ(m):=|1kmgcd(k,m)=1| 为欧拉函数(Euler'sche Phi-function)。

RSA加密算法的流程如下:

  1. 选择2个很大的质数p,q.
  2. 计算n:=pq。这里的n是公开的,p,q则是保密的。
  3. 计算φ(n)。(因为我们知道n=pq,且p,q均为质数,我们可以利用公式φ(n)=(p1)(q1)进行快速计算。)
  4. 选择e{1,2,...,φ(n)1},使得gcd(φ(n),e)=1.
    我们的公钥为(e,n)
  5. 计算密钥d,满足ed1 mod φ(n).

假设我们现在有明文x以及公钥(e,n),进行加密时只需要计算

b=ae mod n,    a,bZn.

而解密时同理

a=bd mod n.

如此一来,任何人都可以将一段信息加密后发送给我们,而只有我们能够解密这段信息。

题目内容

https://adworld.xctf.org.cn/challenges/list

2024-12-04-10-12-48.png
2024-12-04-10-14-16.png

思路

在进行第5步计算密钥d时,可以考虑以下算法:
(1). 用扩展欧几里得算法找到 xy,使得:

ex+φ(n)y=1,

(2). 上式中,xφ(n) 的值即为 d

dxmodφ(n).

如果 d<0,需要将其调整到正数范围:

d=d+ϕ(n).

代码

p=473398607161 q=4511491 e=17 # 扩展欧几里得算法 def extended_euclidean(a, b): if b == 0: return a, 1, 0 gcd, x1, y1 = extended_euclidean(b, a % b) x = y1 y = x1 - (a // b) * y1 return gcd, x, y def calculate_private_key(p, q, e): phi = (p - 1) * (q - 1) gcd, x, y = extended_euclidean(e, phi) if gcd != 1: raise ValueError("e and phi(n) are not coprime") d = x % phi if d < 0: d += phi return d d = calculate_private_key(p, q, e) print(f"私钥 d 是: {d}") # 输出结果应为“私钥 d 是: 125631357777427553”

__EOF__

本文作者笔墨绘星河
本文链接https://www.cnblogs.com/bimohuixinghe/p/18587612.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   笔墨绘星河_Archer  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示