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
在一次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)
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)