RSA算法

文章目录

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)
上一篇:git 添加ssh公钥


下一篇:利用ssh key实现Linux免密访问github