RSA加密算法python

RSA加密算法

欢迎访问本人私人博客,审核未通过文章将发布至个人博客:www.xuanworld.top

一、RSA简单介绍

RSA密码体制是根据PKC算法,并由美国麻省理工学院(MIT)的研究小组提出的,该体制的名称是用了3位作者Rivest,Shamir,Adleman英文名字的第一个字母拼合而成。该体制的理论基础是数论中的下述论断:要求得到两个大素数(如大到100位)的乘积在计算机上很容易实现,但要分解两个大素数的乘积在计算机上几乎不可能实现,即为单向函数

介绍来自度娘~

二、加密过程

  1. 选择一对不相等且足够大的质数,列如:选z1和z2为较大的两个质数
  2. 计算z1和z2的乘积,n=z1*z2
  3. 计算n的欧拉函数 ϕ ( n ) = ( z 1 − 1 ) ∗ ( z 2 − 1 ) \phi(n)=(z1-1)*(z2-1) ϕ(n)=(z11)(z21)
  4. 选一个与 ϕ ( n ) \phi(n) ϕ(n)互质的整数e,且 e < ϕ ( n ) e<\phi(n) e<ϕ(n)
  5. 算出e对于 ϕ ( n ) \phi(n) ϕ(n)的模反元素d
  6. 公钥:KU=(e,n),e和n是成对的,共同组成公钥
  7. 私钥:KR=(d,n),同上

使用方法:

明文M 加密 M e m o d      n = C M^e\mod\ n =C Memod n=C

密文C 解密 C d m o d      n = M C^d\mod\ n=M Cdmod n=M

三、概念解释

欧拉函数:

ϕ ( n ) \phi(n) ϕ(n)是小于n的正整数中与n互质的数的数目,注意:是互质数的个数,不是质数的个数

如果z1、z2都是质数,则 ϕ ( n ) = ( z 1 − 1 ) ∗ ( z 2 − 1 ) \phi(n)=(z1-1)*(z2-1) ϕ(n)=(z11)(z21)

互质

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

模反元素

如果两个正整数互质,如e和 ϕ ( n ) \phi(n) ϕ(n),那么一定可以找到一个整数d,使e*d-1被 ϕ ( n ) \phi(n) ϕ(n)整除,d就叫e的模反元素。

可写作:e*d-1=k* ϕ ( n ) \phi(n) ϕ(n)

或:e*d mod ϕ ( n ) = 1 \phi(n)=1 ϕ(n)=1

四、举例

例题一

RAS算法中,若选取两奇数p=5,q=3,公钥e=7,则私钥d为多少?

  1. 由p与q计算n,可得n=15
  2. 计算欧拉函数,得 ϕ ( n ) = ϕ ( 15 ) = 8 \phi(n)=\phi(15)=8 ϕ(n)=ϕ(15)=8
  3. 由e*d-1=k*8,k为正整数,得d=7

例题二

已知:

p = 3487583947589437589237958723892346254777

q = 8767867843568934765983476584376578389

e = 65537

求:

d=?

import gmpy2 as gm
p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
d = gm.invert(e,(p-1)*(q-1)) #invert函数第一个参数为e,第二个为$\phi$
print(d)
验证
import gmpy2 as gm

p = 3487583947589437589237958723892346254777
q = 8767867843568934765983476584376578389
e = 65537
d = gm.invert(e, (p - 1) * (q - 1))
print("d:", d)
M = gm.mpz(114514)  # mpz将其压缩
C = pow(M, e, p * q)
print("C", C)
C = gm.mpz(C)
m = pow(C, d, p * q)
print("更改后", m)

成功输出加密文本:114514

验证成功!

结果

img
来我博客!来我博客!www.xuanworld.top

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,用于加密的密钥和用于解密的密钥不是同一个。RSA可以根据密钥的大小改变分组大小,如果加密的数据不是分组大小的整数倍,则会根据具体的应用方式增加额外的填充位。在Python中,可以使用Crypto库实现RSA加密算法。具体实现过程包括生成公钥和私钥,加密数据和解密数据,签名和解签等步骤。可以参考以下代码实现RSA加密算法: ```python from Crypto import Random from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 # 生成随机偏移量 random_generator = Random.new().read # 生成一个私钥 rsa = RSA.generate(2048, random_generator) # 导出私钥 private_key = rsa.exportKey() # 生成私钥所对应的公钥 public_key = rsa.publickey().exportKey() # 将私钥内容写入文件中 with open('rsa_private_key.pem', 'wb')as f: f.write(private_key) # 将公钥内容写入文件中 with open('rsa_public_key.pem', 'wb')as f: f.write(public_key) # 加密数据 message = 'Hello, world!' with open('rsa_public_key.pem', 'rb') as f: key = f.read() rsakey = RSA.importKey(key) cipher = Cipher_pkcs1_v1_5.new(rsakey) cipher_text = cipher.encrypt(message.encode()) # 解密数据 with open('rsa_private_key.pem', 'rb') as f: key = f.read() rsakey = RSA.importKey(key) cipher = Cipher_pkcs1_v1_5.new(rsakey) text = cipher.decrypt(cipher_text, random_generator) # 签名 with open('rsa_private_key.pem', 'rb') as f: key = f.read() rsakey = RSA.importKey(key) signer = Signature_pkcs1_v1_5.new(rsakey) digest = SHA.new() digest.update(message.encode()) sign = signer.sign(digest) # 验证签名 with open('rsa_public_key.pem', 'rb') as f: key = f.read() rsakey = RSA.importKey(key) verifier = Signature_pkcs1_v1_5.new(rsakey) digest = SHA.new() digest.update(message.encode()) is_verify = verifier.verify(digest, sign) print('加密后的数据:', cipher_text) print('解密后的数据:', text.decode()) print('签名:', sign) print('验证签名结果:', is_verify) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值