RSA算法与Python实现

RSA算法与Python实现

yangtf

功能

RSA加密是最常见的非对称加密算法,基于大数分解难题。 两个很大的素数相乘很容易,但想根据成绩解出因子则很难。

如果数不够大,还是很容易分解的。

素数

素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

互质数(或互素数)

公约数只有1的两个数,叫做互质数

模指数运算

取模就是 做一个整除,取余数作为结果,如 13 % 3 = 1 ,因为13除以3,余1
模指数运算就是先做指数运算,取其结果再做模运算。

RSA算法

(1)先随机选择两个足够大的素数

(2)计算乘积 n = pq ,这个n就是那个很难分解的大数,如果pq太小就尴尬了,很容易被爆破。

(3)计算f(n) = (p-1)*(q-1) ,p和q 不能让任何人知道。n是公开的。

(4)找到一个与f(n)互质的数e,使其1

import math
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e=65537
c=83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n=p*q



fn=long((p-1)*(q-1))

# 计算d,使得 de≡1 mod f(n)    
# 意思是  d*e % fn == 1 。 d和e的乘积取模等于1 
# 也就是说 d*e = 1 + fn*i  (i为整数,就是 d*e / fn 的商)
# 下面的算法是  ( fn*i+i ) % e  如果结果为零,得到结果就是d  

i = 1
while(True):
    x=(i*fn)+1
    if(x%e==0):
        d=x/e
        break
    i=i+1

print "d=", d
print "i=",i

# 另外一个等价公式是  d ≡e-1 mod f(n)   , 意思为 d % f(n) == (e-1)%f(n) , 也就是说 (e-1)+ j*fn = d + f(n)*i 
# 这个比较难算了。
d= 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
i= 32394
KU = (e,n) # 公钥
PU = (d,n) # 私钥
M = 5577446633554466577768879988 # 明文
C = pow(M,e,n ) # M的e次方 模上n
print "C = " , C
C =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
MC = pow(C,d,n)
print "MC = ",MC
MC =  5577446633554466577768879988
M == MC
True

可以看到解密后的MC和原文M相等

Cite :

https://www.cnblogs.com/jiftle/p/7903762.html

http://www.shiyanbar.com/ctf/1979

https://blog.csdn.net/sinat_33769106/article/details/79999090

还有另外一个计算D的方法,试一下。

def computeD(fn, e):
    (x, y, r) = extendedGCD(fn, e)
    if y < 0:
        return fn + y
    return y

def extendedGCD(a, b):
    if b == 0:
        return (1, 0, a)
    x1 = 1
    y1 = 0
    x2 = 0
    y2 = 1
    while b != 0:
        q = a / b
        r = a % b
        a = b
        b = r
        x = x1 - q*x2
        x1 = x2
        x2 = x
        y = y1 - q*y2
        y1 = y2
        y2 = y
    return(x1, y1, a)

D = computeD(fn,e)
print D
56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
D == d
True

简单的证明

C=Me%n C = M e % n
M=Cd%n=Med%n=M1%n=M M = C d % n = M e d % n = M 1 % n = M
为什么ed = 1 ,在整个公式里,都是做的模运算 ,生成过程决定了 ed % n = 1
上述公式用latex表述。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA算法是一种非常常见的加密算法,它可以用于数据加密和数字签名等场景。下面是RSA算法Python实现: ```python import random import math # 生成指定位数的质数 def get_prime(nbits): while True: # 随机生成一个nbits位的奇数 p = random.getrandbits(nbits) | (1 << nbits - 1) | 1 if is_prime(p): return p # 判断一个数是否为质数 def is_prime(n): if n <= 1: return False if n <= 3: return True if n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6 return True # 求两个数的最大公约数 def gcd(a, b): if b == 0: return a return gcd(b, a % b) # 求模反元素 def mod_inverse(a, m): g, x, y = extended_euclid(a, m) if g != 1: return None else: return x % m # 扩展欧几里得算法 def extended_euclid(a, b): if b == 0: return a, 1, 0 else: g, x, y = extended_euclid(b, a % b) return g, y, x - (a // b) * y # 生成RSA密钥对 def generate_keypair(nbits): p = get_prime(nbits // 2) q = get_prime(nbits // 2) n = p * q phi = (p - 1) * (q - 1) e = 65537 d = mod_inverse(e, phi) return (n, e), (n, d) # RSA加密 def encrypt(m, public_key): n, e = public_key c = pow(m, e, n) return c # RSA解密 def decrypt(c, private_key): n, d = private_key m = pow(c, d, n) return m # 测试代码 if __name__ == '__main__': nbits = 2048 public_key, private_key = generate_keypair(nbits) m = 123456789 c = encrypt(m, public_key) m1 = decrypt(c, private_key) if m == m1: print("RSA encryption and decryption succeed!") else: print("RSA encryption and decryption failed!") ``` 以上代码实现RSA算法的密钥生成、加密和解密过程,可以自行修改`nbits`来指定生成的RSA密钥的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值