文章目录
RSA算法
一、生成公钥和私钥
1、随机生成两个随机素数P,Q
2、将P、Q两个素数相乘得到一个数N,即N=PQ(需要公开)
3、将P、Q分别减1再相乘得到一个数T,即T=(P-1)(Q-1)
4、选择一个数E,E满足和T互质且E小于T
5、根据DE mod T = 1计算出密钥D
6、通过以上步骤可以得到N,E,D这3个数字,其中(N、E)作为公钥,(N、D)作为私钥(公钥和私钥可以互换)
二、加密和解密
接受方将生成的公钥(N,E)对外发布
1、用公钥加密
发送方用接受到的公钥(N,E)对密文M加密
密文:M
加密:ME mod N = C
明文:C
2、用私钥解密
接受方用持有私钥(N,D)对明文C解密
明文:C
解密:CD mod N = M
密文:M
摘自https://blog.csdn.net/qq_22038259/article/details/112712260
例题(难度由浅入深,笔者能力有限,之后学会难的会继续不上)
例题 1
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交
def ext_gcd(a, b):
if b == 0:
return 1, 0, a
else:
x, y, gcd = ext_gcd(b, a % b) # 递归直至余数等于0(需多递归一层用来判断)
x, y = y, (x - (a // b) * y) # 辗转相除法反向推导每层a、b的因子使得gcd(a,b)=ax+by成立
return x, y, gcd
def computeD(T, e):
(x, y, r) = ext_gcd(T, e)
#y maybe < 0, so convert it
if y < 0:
return T + y
return y
p = 473398607161
q = 4511491
T=(p-1)*(q-1)
e=17
D=computeD(T,e)
print(D)
例题2
Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
Use RSA to find the secret message
from gmpy2 import *
from Crypto.Util.number import *
def ext_gcd(a, b):
if b == 0:
return 1, 0, a
else:
x, y, gcd = ext_gcd(b, a % b) # 递归直至余数等于0(需多递归一层用来判断)
x, y = y, (x - (a // b) * y) # 辗转相除法反向推导每层a、b的因子使得gcd(a,b)=ax+by成立
return x, y, gcd
def decrypt(msg, d, n):
return pow(msg, d, n)
def computeD(T, e):
(x, y, r) = ext_gcd(T, e)
#y maybe < 0, so convert it
if y < 0:
return T + y
return y
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
t = (p-1)*(q-1)
n = p*q
d = computeD(t, e)
flag = decrypt(c, d, n)
print(flag)
标签:公钥,私钥,gcd,RSA,算法,return,例题 来源: https://blog.csdn.net/qq_55675216/article/details/121582120
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。