[办公自动化]我和DeepSeek的对话3,学习RSA
我的问题:
请你帮忙再讲讲RSA的基本原理,用通俗的语言。
之前还问了一道GHCTF2025新生赛的题目:
from Crypto.Util.number import getPrime, bytes_to_long p=getPrime(128) q=getPrime(128) n=p*q phi=(p-1)*(q-1) flag="NSSCTF{xxxxxx}" print("p=",p) print("q=",q) m=bytes_to_long(flag.encode()) e=4 c=pow(m,e,n) print("c=",c) print("n=",n) ''' p= 182756071972245688517047475576147877841 q= 305364532854935080710443995362714630091 c= 14745090428909283741632702934793176175157287000845660394920203837824364163635 n= 55807222544207698804941555841826949089076269327839468775219849408812970713531 '''
Deepseek答案:
RSA 加密可以想象成一种特殊的“数学锁”:你造一把锁(公钥),所有人都能用它来锁住信息,但只有你拿着钥匙(私钥)才能解开。它的核心是三个步骤:
1. 造锁(生成密钥)
-
选两个大质数:比如 p=3p=3,q=11q=11(实际中这两个数极大,比如几百位)。
-
计算锁的“齿数”:n=p×q=3×11=33n=p×q=3×11=33(这就是公钥的一部分)。
-
计算“隐藏的齿轮”:ϕ(n)=(p−1)(q−1)=2×10=20ϕ(n)=(p−1)(q−1)=2×10=20(这是私钥的关键)。
-
选一个“公开的开关”:比如 e=3e=3(要满足 ee 和 ϕ(n)=20ϕ(n)=20 互质,即没有公因数)。
-
生成“钥匙”:找一个数 dd,使得 e×d≡1mod ϕ(n)e×d≡1modϕ(n)。这里 d=7d=7,因为 3×7=21≡1mod 203×7=21≡1mod20。
公钥是锁:(n=33,e=3)(n=33,e=3);私钥是钥匙:d=7d=7。
2. 上锁(加密)
假设你想加密数字 m=7m=7:
-
用公钥加密:计算 c=memod n=73mod 33=343mod 33=13c=memodn=73mod33=343mod33=13。
-
加密后的密文是 c=13c=13。
3. 开锁(解密)
用私钥 d=7d=7 解密密文 c=13c=13:
-
用钥匙解密:计算 m=cdmod n=137mod 33m=cdmodn=137mod33。
-
直接计算 137137 会很大,但可以用模运算简化:
-
132=169mod 33=4132=169mod33=4
-
134=42=16mod 33134=42=16mod33
-
137=134×132×13=16×4×13=832mod 33=7137=134×132×13=16×4×13=832mod33=7。
-
-
解密得到原文 m=7m=7。
为什么 RSA 安全?
-
锁(公钥)是公开的:所有人都知道 n=33n=33 和 e=3e=3。
-
钥匙(私钥)藏在质数里:如果攻击者想从 n=33n=33 反推出 p=3p=3 和 q=11q=11,需要做质因数分解。当 nn 是一个几百位的数时,分解它需要超级计算机算几百年。
特殊情况(比如你的题目中的 e=4e=4)
通常 ee 必须和 ϕ(n)ϕ(n) 互质,才能保证存在解密的 dd。但如果 ee 和 ϕ(n)ϕ(n) 不互质(比如你的题目中 e=4e=4,而 ϕ(n)ϕ(n) 可能被 4 整除),这时无法直接计算 dd。需要“暴力拆锁”:
-
分解 nn 得到 pp 和 qq(题目已给出)。
-
分别在模 pp 和模 qq 下解方程:
-
解 m4≡cmod pm4≡cmodp
-
解 m4≡cmod qm4≡cmodq
-
-
用中国剩余定理(CRT)组合所有可能的解,再筛选出有意义的明文(比如以
NSSCTF{
开头)。
通俗总结
RSA 就像用两个大质数造了一把数学锁,加密是“用公开的开关把信息锁住”,解密是“用隐藏的钥匙解开”。如果钥匙的设计有问题(比如 ee 选得不好),就需要拆开锁的内部结构(分解 nn),在更小的锁芯(模 pp 和 qq)里逐个破解,最后拼出完整的钥匙。