ailixiyaji / re0-rsa- Goto Github PK
View Code? Open in Web Editor NEW好难啊qwq
好难啊qwq
公钥(public key)私钥(private key)
public modulus(模数) 随机选择两个不同大质数 p 和 q,计算 N=p×q
φ(N)=φ(p)φ(q)=(p-1)(q−1)
e
k
padding
mod()
建立矩阵(matrix)
选择一个小于 φ(N) 的整数 e,使 e 和 φ(N)互质。并求得 e 关于 φ(N) 的模反元素,命名为 d,有 ed≡1(modφ(N))
在数论中,如果两个或两个以上的整数的最大公约数是 1 ,则称它们为互质。
此时,(N,e) 是公钥,(N,d) 是私钥。
为了加快解密速度,实现时通常不直接计算 ,而是使用**余数定理(CRT)
RSA-CRT 将指数 分成两部分 dp = d mod (p − 1)和dq = d mod (q − 1)。
借助预先计算出的值d qinv = q^−1 mod p,通过计算就可以恢复信息。
利用加纳公式( Garner’s formula)m = mpqqp + mq(1 − qqp) = (mp − mq)qqinv + mq mod N
Encryption(加密) 将消息 以一个双方约定好的格式转化为一个小于 N,且与 N 互质的整数 m。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:m^e≡c(modN)
Signatures(解密) cd≡m(modN)
我们知道 d < (p − 1)(q − 1),所以 k < e。攻击者不知道 k的值,但由于在实践中一般是e ≤ 65537,因此对 k的所有可能值进行暴力破解是有效的。
假设模数(mod)为 N ,N 具有一个因子 b≥Nβ,0<β≤1。
多项式(polynomial) F 的次数为 δ。
该方法可以找到该多项式所有的整数根(integral root)x0,要求 |x0|<cN^(β^2/δ) 。
目标是找到在modN 意义下多项式所有的根,LLL(没看懂)方法找到
1.与该多项式具有相同根 x0
2.更小系数
3.定义域为整数域的多项式g,两个多项式在mod意义下的整数跟相同。
使用连续比特恢复 RSA 密钥的主要算法技术是将问题表述为寻找一个整数多项式的小根,然后使用格基还原法(lattice basis reduction)解决这个问题。
攻击者知道公共模N 、密文C 以及在加密前预先添加到未知信息m 中的填充 。攻击a者希望恢复 m。
对于未知的m ,我们有 c =(a+ m)3 mod N。让f(x) = (a+x)3 −c ;我们设置的问题是希望找到一个满足f(m) ≡ 0 mod N的多项式的小根 。
构建网格设 f的系数为f(x) = x^3 +f2x^2 +f1x+f0 。设 M = 2^16为根m 大小的上限。我们构建矩阵
然后,我们对矩阵应用 LLL 格基还原算法从网格中提取多项式并找出它的根。然后,我们构建多项式v =(−0x66543dd72697M3, −0x35c39ac91a11c04M2, 0x3f86f973d67d25eae138M,− 0x10609161b131f d102bc2a8)多项式 有一个整数根,即0x42 ,它是 m的理想解。
这种特定的44 网格结构可以找到最大大小为N^(1/16) 的根。对于我们在示例中使用的小密钥大小,这只是16 比特,但由于它直接随模的大小扩展,因此对于 1024 位 RSA 模,同样的网格结构足以学习 170 未知比特的信息,或者对于 2048 位 RSA 模,足以学习 341 比特的信息。在44 网格基础上的网格缩减是瞬时的。
这个矩阵的行对应于多项式f(x) 和Nx^2、Nx的系数向量。我们知道这些多项式中的每一个在 x=m处求值都将是 0 moduloN 。每一列都按 M的幂进行缩放,因此该网格中任何向量的l1 准则都是在r 处求值的相应(未缩放)多项式值的上界。对于网格中的一个向量r v = (v3M3, v2M2, v1M, v0)
|f(m)| = |v3m3 + v2m2 + v1m + v0| ≤ |v3M3| + |v2M2| + |v1M| + |v0| = |v|1for any |m| ≤ M
给定 N=pq的连续已知最有效位的因式分解p 。
让 成为一个 RSA 模,其中 p和 q大小相等。选择一个数字小到足以fit on the page,我们就有了一个 240 位的 RSA 模.我们假设N 已知。假设我们知道p 的最重要bit ** b** 的大部分连续位,因此p=a+r,其中我们不知道 r,但知道 a = (2^l)b 的值。这里 l=30是未知位的bits,或者说是已知位的左移。
a = 0x68323401cb3a10959e7bfdc0000000
有某个值 f(x) = a+x,使得f(r) = p ≡ 0 。
未知的r 是很小的,特别是对于已知的某个边界R ,|r|<R 。这里,R=2^30 。
v =(−0x0x17213d8bc94R2, −0x1d861360160a4f86181R,0xf9decdc1447c3f3843819a5d)
可以重建 a + r并验证gcd(a + r, N) 因数N 。
这种3*3 网格结构适用于任何|r| < p^1/3 ,并随着p的增加而直接扩展。在我们的示例中,我们选择了p和q ,因此它们有 120 位,而 r有 30 位。然而,同样的结构可以从 1024 位 RSA 模的 512 位因子中恢复170 位,或从 2048 位 RSA 模的 1024 位因子中恢复 341 位。
如果该未知位从l 位开始,则输入多项式的形式为f(x) = (2^l)x + a 。这个多项式可以乘以2^(-l)mod N
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.