本帖最后由 natural 于 2022-7-26 13:47 编辑
先上一张图:
首先是两个比较大的质数一般记为p或者q(两者不能相等)
然后还有个数是可以公开出来的。为N=p*q
根据欧拉函数?质数的欧拉函数是φ(n)=n-1(φ(n)是一个函数,值的意义是与n互质的小于n的整数个数。)
然后我们根据p和q可以得到一个关键数字r=φ(N)=φ(p)φ(q)=(p-1)*(q-1)
然后任取一个小于r并且与r互质的整数e,这是可以公开出来的,是公钥(N,e)
e关于r的模反元素d是私人所有的。私钥(N,d)
p和q是应该被销毁的
e*d-1=k*r(k为任意整数) or ed≡1(mod r) or e*d mod r≡1
知道e和r求d的操作:d=gmpy2.invert(e,r)
```
import gmpy2
#4*6 ≡ 1 (mod 23)
print(gmpy2.invert(4,23)) #6
```
加密的消息m应该满足m^e≡c (mod N) c是加密后的密文
通过密文解密的话。c^d≡m (mod N) m是原来的明文嘛
通过Python内置的脚本很容易实现。
加密:pow(m,e,N)
解密:pow(c,e,N)
逆元的定义:正整数 a, n,如果有 ax ≡ 1(mod n),则称 x 的最小正整数解为 a 模 n的逆元。
<!--

-->
BUUCTF
Crypto-RSA
题目是这样的:
解题代码如下:掌握好RSA算法的基本原理就可以正常做出来了。
```
import gmpy2
# 4*6 ≡ 1 (mod 23)
# print(gmpy2.invert(4,23))
p=473398607161
q=4511491
e=17
r=(p-1)*(q-1)
d=gmpy2.invert(e,r)
print(d)
```

Crypto-rsarsa
```
import gmpy2
# 4*6 ≡ 1 (mod 23)
# print(gmpy2.invert(4,23))
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
# p和q是两个大质数
N=p*q
e=65537
# e是公钥之一
r=(p-1)*(q-1)
d=gmpy2.invert(e,r)
# d是私钥之一
print(d)
c=83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
print(pow(c,d,N))
```

Crypto-RSA1
RSA密钥一般是1024位(安全)
由p,q,dp,dq,c求明文的算法
dp≡d mod(p-1)
dq≡d mod(q-1)
```
import gmpy2
I = gmpy2.invert(q,p)
mp = pow(c,dp,p)
mq = pow(c,dq,q) #求幂取模运算
m = (((mp-mq)*I)%p)*q+mq #求明文公式
print(hex(m)) #转为十六进制
```
|