赞
踩
密钥是一种参数,它是在明文转换为密文或密文转换为明文时算法的输入参数。可以理解成密码的钥匙。
常见的数字加密方式分为两类:对称加密 和 非对称加密。
对称加密,又称为私钥加密,指的是加密和解密使用同一个密钥的方式。其特点是加密和解密过程简单、快速,并且只需要一个密钥。常见的对称加密算法包括DES、AES等。然而,由于使用的是同一个密钥,如果密钥被黑客拦截,信息就很容易被破译。
非对称加密,又称为公钥加密,是指使用一对非对称密钥进行加密的方式,其中一个密钥是公钥(可以公开的密钥),另一个密钥是私钥(只有密钥的持有者知道的密钥)。公钥可以用来加密信息,而私钥可以用来解密信息。因为使用的是两个不同的密钥,所以这种算法称为非对称加密算法。私钥不通过网络发送出去,所以非对称加密的安全性很高。最常用的非对称加密算法是RSA算法。
总结来说,对称加密和解密速度快,但安全性相对较低;而非对称加密虽然安全性高,但解密速度慢。在实际应用中,可以根据具体需求选择合适的加密方式。
(源于RSA —— 经典的非对称加密算法 - 知乎 (zhihu.com))
欧拉函数,记作φ(n),在数论中表示小于n的正整数中与n互质的数的数目。
对于正整数N,少于或等于N的正整数中与N互质的正整数(包括1)的个数记作φ(n)。例如,φ(10)=10×(1-1/2)×(1-1/5)=4,其中p(1)=2,p(2)=5是10的所有质因数。
欧拉函数的性质包括:
这个性质对于互质的数来说是成立的,因为互质的两个数没有其他公约数除了1以外,所以它们的欧拉函数值是独立的。)
欧拉函数φ(n)的公式取决于n的质因数分解。
如果n是质数p的k次方,那么φ(n)= p^k - p^(k-1)。
如果n没有形如p^k的质因数,那么φ(n)= n*(1-1/p1)(1-1/p2)...(1-1/pk),其中p1, p2, ..., pk是n的所有质因数。
逆元是指一个可以取消另一给定元素运算的元素。在数学中,逆元素被广义化为加法中的加法逆元和乘法中的倒数。具体来说,如果存在一个数x满足ax%m=1,那么x就是a的逆元。逆元定理允许我们将公式(a/b)%c转换为乘法运算,从而避免由于b值过大而导致的精度问题。逆元有多个求法,包括费马小定理和欧拉定理等。每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n)。一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在。
在RSA算法中,d是e的模φ(n)下的乘法逆元。这意味着e和φ(n)互素,并且因为模运算的性质,它的乘法逆元一定存在。d被称为私钥,而e被称为公钥。加密时,使用公钥e和模n对明文进行加密,得到密文。解密时,使用私钥d和模n对密文进行解密,得到明文。这种加密和解密的方式基于数论中的一些基本性质,可以提供一种安全的方式来保护信息。因此,在RSA算法中,计算逆元d是非常重要的。
模运算是一种数学运算,通常表示为“取模”或“模运算”。在计算机编程中,模运算被广泛应用于各种算法和数据结构中,因为它可以提供快速高效的整数除法操作。
模运算的基本概念是将一个数除以另一个数,并取余数。这个余数就是模运算的结果。例如,在计算a mod n时,表示将a除以n并取余数。同样地,在计算b mod n时,表示将b除以n并取余数。
模运算的性质包括:
- 模运算具有反交换律和反结合律,即a mod n = b mod n当且仅当a=b(反交换律),以及(a+b) mod n = (a mod n + b mod n) mod n(反结合律)。
- 模运算可以用于判断一个数是否是另一个数的倍数,即如果a mod n=0,则a是n的倍数。
- 模运算可以用于实现循环移位操作,即将一个数循环右移或左移若干位。
- 在计算机编程中,模运算被广泛应用于各种算法和数据结构中,例如快速排序、二分搜索、哈希表等。
c = pow(m,e,n)
m = pow(c,d,n)
RSATool2v17.exe
注意:
1.辨别base10/16
2.e要转换为hex
1. 一个大于1的整数p,若除1和起本身之外没有其他正整数因数(约数),称P为素数。
2. 若整数a和b最大公约数为1,则称a,b互素,记为(gcd(a,b)= 1)。
3. 设n为正整数,a和b为整数,若a和b被n除后所得余数相同,称a和b模n同余,记为a≡b(mod n)。此式被称为同余式。若n能整除a则同余式表示为a≡0(mod n)。
两个整数模n同余的等价说法有:a和b被n除余数相同。a-b被n整除。a和b在模n的同一个剩余类中。存在整数s使得a=sn+b。
4. 同余式的一些运算性质,
(1) 若a≡b(mod n),c≡d(mod n)则有ac≡bd(mod n)。特别的有,ka≡kb(mod n),k为任意整数。
(2) 若a≡b(mod n),d是a,b,n的公因数,则(a/d) ≡(b/d)(mod n/d)。特别的有an≡bn(mod n),n为正整数。[微软中国2]
(3) 若ka≡kb(mod n),且k与n互素时,有a≡b(mod n)。(同余式消去律)
5. 设n为正整数 ,则任何一个整数被n除 ,余数必为0,1,2,…,n-1中的某一个,把整数集中被n除余数相同的数分别归为一类,记为[0],[1],[2]…,[n-1],这样就按模是否同余把整数集分成n类,其中每一类都称为模n的一个剩余类。显然,每个整数必属于上述类中的一类,被n除余数不同的数必属于上述的不同类中。若a0,a1,a3…,an-1分别取自上述类的不同类中,称a0,a1,a3…,an-1为模n的一个完全剩余系,该剩余系中的数两两模n不同余。
6. 含有未知量的同余式称为同余方程。一次同余方程是最简单的一种,其一般形式为ax≡b(mod n)。若a,n的最大公约数d能整除b,则ax≡b(mod n)有解。且恰有d个解。若a,n的最大公约数d不能能整除b,则ax≡b(mod n)无解。例如同余方程7x≡1(mod 5)。7与5最大公约数为1,能被b=1整除,故有一个解。7x≡1(mod 5)≡6≡11≡21(mod5)。由于7与5互素有消去律得x=3。.[微软中国3]
一般地 解同余方程的步骤为 ①判断解的情况 ②当同余方程的a,b,n有公因数时 ,约去公因数化简方程 ③利用同余的定义和消去律求方程的解。
7. 费马小定理:设任意整数a和素数p互素[微软中国4] ,则ap-1 ≡1(mod p)。
8. 欧拉定理:若n,a为正整数,且n,a互质,(a,n) = 1,则a^φ(n) ≡ 1 (mod n)。
9. 模运算极其性质:
基本概念:
给定一个正整数p,任意一个整数n,一定存在等式 n = kp + r ;
其中k、r是整数,且 0 ≤ r < p,称呼k为n除以p的商,r为n除以p的余数。
对于正整数p和整数a,b,定义如下运算:
取模运算:a % p(或a mod p),表示a除以p的余数。
模p加法:(a + b) % p ,其结果是a+b算术和除以p的余数,也就是说,(a+b) = kp +r,则(a + b) % p = r。
模p减法:(a-b) % p ,其结果是a-b算术差除以p的余数。
模p乘法:(a * b) % p,其结果是 a * b算术乘法除以p的余数。
说明:
1. 同余式:正整数a,b对p取模,它们的余数相同,记做 a ≡ b % p或者a ≡ b (mod p)。
2. n % p得到结果的正负由被除数n决定,与p无关。例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。
(1)若p|(a-b),则a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)
(2)(a % p)=(b % p)意味a≡b (% p)
(3)对称性:a≡b (% p)等价于b≡a (% p)
(4)传递性:若a≡b (% p)且b≡c (% p) ,则a≡c (% p)
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
(a^b) % p = ((a % p)^b) % p (4)
结合率: ((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
交换率: (a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配率: ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)
重要定理
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
若a≡b (% p),则对于任意的c,都有ac≡ bc (%p); (13)
(取自RSA算法以及数学基础_rsa的加密过程和解密过程互逆吗-CSDN博客)
- import libnum
- from Crypto.Util.number import long_to_bytes
-
- c = 0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86
- n = 108539847268573990275234024354672437246525085076605516960320005722741589898641
- #n = int("",16)
- e = 65537
- #e = int("",16)
- q = 333360321402603178263879595968004169219
- p = 325593180411801742356727264127253758939
-
- d = libnum.invmod(e, (p - 1) * (q - 1))
- m = pow(c, d, n) # m 的十进制形式
- string = long_to_bytes(m) # m明文
- print(string) # 结果为 b‘ m ’ 的形式
当题目给我们很多组c和e,但它们加密使用的模数n相同时,我们可以考虑共模攻击,当e1,e2互质,有gcd(e1,e2)=1,根据扩展欧几里得算法,一定存在整数x,y使得e1*x+e2*y=1。我们可以调用gmpy2.gcdext()来使用扩展欧几里得算法,以此求出x和y。
又根据加密过程,c1=pow(m,e1,n)、c2=pow(m,e2,n)。所以
(c1^s1*c2^s2)%n = ((m^e1%n)^s1(m^e2%n)^s2)modn
又经过一堆化简之后就可以得到:m = (c1^x*c2^y)modn,得到明文。
gmpy2.gcdext( , ):
gmpy2.gcdext(e1, e2)
是gmpy2
库中的一个函数,它用于计算两个整数e1
和e2
的扩展欧几里得算法(Extended Euclidean Algorithm)。这个算法不仅返回e1
和e2
的最大公约数(GCD),还返回两个额外的整数x
和y
,它们满足贝祖等式(Bézout's identity):x * e1 + y * e2 = gcd(e1, e2)
适用情况:n很大但是e很小,一般e=3
n很大时我们就不能因式分解了,当然还有其他思路,例如当e很小时,比如e=3,有
,我们可以对k进行爆破,直到
可以开根,借此得到m。
gmpy2.iroot( , )
gmpy2.iroot(m, e)
是gmpy2
库中的一个函数,用于计算整数m
的e
次方根。这个函数尝试找到一个整数x
和一个整数y
(通常是 0),使得x^e + y
尽可能接近m
,且x^e
不超过m
。在大多数情况下,y
会是 0,除非你请求一个非常高的次方根且m
不足以被完美地表示为某个整数的e
次方。函数的返回值是一个元组
(x, True/False)
,其中x
是m
的e
次方根(作为整数),而布尔值True/False
表示x
是否是一个完美的e
次方根(即x^e
是否严格等于m
)。
适用情况:e很大
和低加密指数攻击相反,当e很大的时候我们怎么办呢,这里就要用到低解密指数攻击。当e很大时,相对的d就会很小。这里我们用到github上一个wienerHacker脚本
git clone https://github.com/pablocelayes/rsa-wiener-attack
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。