密码学(一):RSA加密长文

9 篇文章 5 订阅
2 篇文章 0 订阅

简介:

RSA简介: RSA加密是一种非对称加密,至于它底层实现比较复杂,说实话我说不清楚可能把你带沟里去了,感兴趣的同学可以去看看这篇博文:点击这里,或者可以看看漫画更容易理解:点击这里今天我们要说的不是他的实现原理,你们用RSA进行一次性加密长文是不被允许的,我们今天重点的话题是用它加密长文!!!

RSA组成:

RSA是由公钥和私钥组成的一对密钥,密钥分成公钥和私钥,公钥是公开的而私钥自己持有的,私钥是用来加密的,加密后的内容叫做密文,公钥是给别人用来对你加密后的密文进行解密,解密后的内容叫做明文。

正文:

一、生成密钥代码:

from Cryptodome.PublicKey import RSA


# 生成密钥
rsa = RSA.generate(1024)
print(rsa.export_key())
print(rsa.publickey().export_key())
with open('pri.bin', mode='wb') as f:
    f.write(rsa.export_key())
with open('pub.pem', mode='wb') as f:
    f.write(rsa.publickey().export_key())

私钥:
在这里插入图片描述
公钥:
在这里插入图片描述
说明:
先说下代码,代码总的逻辑是生成密钥对并保存,记住RSA密钥是成对出现的,代码里面的RSA.generate(1024)是关键,而后面的1024是bit单位,可用去看看源码里面的说明。再说一下公钥和私钥,密钥的开头可用来区分公钥和私钥,看上面两图。

二、加密代码:

from Cryptodome.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


text = '一只快死的猿'
# 加载秘钥
pub_key = open('pub.pem').read()
# 实例化一个秘钥对象
key = RSA.import_key(pub_key)
# 生成加密对象
cipher = PKCS1_v1_5.new(key)
# 加密
encode_rsa_data = cipher.encrypt(text.encode())
# 解码
b64_data = base64.b64encode(encode_rsa_data)
print(b64_data.decode())

说明:
加密后的密文:ETWDk+DngrXX2OoK6cusKZ90oLX3l1NcTFwfkrafSvs5OBjMDygCVo+Weiemy+5ORxJ2j8PXb8JEU3fQjO8UuF1edpTA8ZJ/8z9RY90I7tl3Cixp77yG/ml8anNn8FJwoUsa6aS2KOqYxpGM+AjQLh3JUBZPh7NQOnQEgyCAXik=

密文是一堆乱码,看不懂也不重要,重要的是看末尾的”=“,首先你要知道你生成密钥的时候指定的1024bit在这个地方起作用了,这时密文的长度固定是172,如果密文是2048bit,那么这时密文的程度固定是344,你可以多试试就可用发现它的规律了,而回过头看”=“,如果加密后的密文长度不足172的话,那它会在末尾补上”=“直到172的长度,这也就是为什么密文是固定的。

再说说代码:注意的地方就是明文加密之前要先进行b64编码

三、解密代码:

from Cryptodome.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


text = 'thTmi5mFXjtj3LSXO825EUtKOa6Tr03kVmCcSmS/LfJNtYxQ9xXeRar0Glr2p1FVQjITd0CoT8cQbZhyQjg05JCbso7YPi6M79o0UI9bfbZwEGJeh+En7mez1gJuJmA1jDUor0v38dudbvFZSm5ibi/mWsPFc+1KPJIBZMkX8Tk='
# 加载秘钥
pri_key = open('pri.bin').read()
# 实例化一个秘钥对象
key = RSA.import_key(pri_key)
data = base64.b64decode(text.encode())
# 生成解密对象
rsa = PKCS1_v1_5.new(key)
decode_rsa_data = rsa.decrypt(data, b'rsa')
print(decode_rsa_data.decode())

说明:解密后的明文就是"一只快死的猿",代码注意的点就是要进行b64解码,这里要注意加密和解码要进行B64处理后才可以进行加解密操作。

重点扩展: 好了上面说完了RSA的基本操作,后进入我们今天的重点,用RSA进行加密长文!

前面已经提到了几个重点:
1、是生成密钥的时候要指定密钥的长度为1024、2048 …
2、RSA只能加密短文本,比如我们的request_id,token或者一些重要的识标符,因为比较短,但是这里要说明一下,具体它能加密最大的文本长度我没研究过。
3、对应生成的密文长度的规律,前面提到的172和344
接下来要说的是怎么利用RSA来加密长文本的逻辑:其实就是把长文本分段切割成小字符串,然后再进行加密,这个是个技术活,需要找到它加密的规律,要怎么切割才能符合规则?

下面是我之前写的一个小demo用来处理长文本的,废话不多说直接上源码,代码里面有具体说明:
点击这里下载代码
上面是我的github地址,代码已经上传,感兴趣可以去看看哈

结语: 欢乐的学习时光总是短暂的,今天的内容就到此结束吧。如果这篇博文有帮到你或者,你觉得对RSA加密有了进一步的了解,那也请你不要吝啬你的一键三连,还有github记得收藏好东西都在上面了,有时间再分享其他的加密哈~~~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一份使用 Python 实现 RSA 加密解密的示例代码: ``` import rsa # RSA加密 def rsa_encrypt(plaintext, pub_key): # 加密 ciphertext = rsa.encrypt(plaintext.encode(), pub_key) # 返回密文 return ciphertext # RSA解密 def rsa_decrypt(ciphertext, pri_key): # 解密 plaintext = rsa.decrypt(ciphertext, pri_key).decode() # 返回明文 return plaintext # 生成公钥、私钥 (pub_key, pri_key) = rsa.newkeys(512) # 待加密明文 plaintext = "RSA encryption test" # 调用RSA加密函数,进行加密 ciphertext = rsa_encrypt(plaintext, pub_key) # 调用RSA解密函数,进行解密 decrypted_plaintext = rsa_decrypt(ciphertext, pri_key) # 输出结果 print("待加密明文:", plaintext) print("加密后的密文:", ciphertext) print("解密后的明文:", decrypted_plaintext) ``` 注意:本代码仅供参考,实际使用中可能需要对代码进行一定的修改。 ### 回答2: RSA加密是一种非对称加密算法,通过生成一对公钥和私钥来实现加密和解密的过程。以下是一个用Python实现RSA加密解密的示例代码: ```python import rsa # 生成RSA公私钥对 (pubkey, privkey) = rsa.newkeys(2048) # 明文 message = "Hello, World!" # 加密 crypto = rsa.encrypt(message.encode(), pubkey) # 解密 plain = rsa.decrypt(crypto, privkey).decode() print("加密后的密文:", crypto) print("解密后的明文:", plain) ``` 首先,我们导入了Python的rsa模块。然后,使用`rsa.newkeys(2048)`生成了一个2048位的RSA公私钥对。接下来,我们定义了一个明文字符串`message`。 使用`rsa.encrypt(message.encode(), pubkey)`进行加密。我们将明文进行编码并调用`rsa.encrypt()`方法来加密数据,其中`pubkey`是生成的公钥。 使用`rsa.decrypt(crypto, privkey).decode()`进行解密。我们调用`rsa.decrypt()`方法来解密加密后的数据,其中`crypto`是加密后的密文,`privkey`是生成的私钥。最后,我们将解密后的数据进行解码并打印出来。 以上代码简要演示了Python如何使用RSA加密解密数据。请注意,此示例仅用于介绍RSA加密的基本原理,实际应用中还需要进行更多的安全性验证和异常处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值