攻防世界:Crypto习题之easy_RSA

攻防世界:Crypto习题之easy_RSA

RSA 加密

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

首先设 $$\varphi(m) := | { 1 \leq k \leq m |\gcd(k, m) = 1 } |$$ 为欧拉函数(Euler'sche Phi-function)。

RSA加密算法的流程如下:

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

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

\[b=a^e \text{ mod } n, \ \ \ \ a,b \in \mathbb{Z}_n. \]

而解密时同理

\[a=b^d \text{ 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). 用扩展欧几里得算法找到 \(x\)\(y\),使得:

\[e \cdot x + \varphi(n) \cdot y = 1, \]

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

\[d \equiv x \bmod \varphi(n). \]

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

\[d = d + \phi(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”
posted @ 2024-12-05 05:54  笔墨绘星河1  阅读(27)  评论(0编辑  收藏  举报