上一篇文章介绍了RSA加密原理以及自己的一些理解,现在我们就来实际操作一下,使用python语言如何来实现RSA的加密—解密—签名—验签这一系列过程。

##一、生成公钥、私钥对
使用openssl工具生成RSA公钥、私钥对。

1.下载openssl工具。点我下载一,点我下载二
2.打开 openssl 文件夹下的 bin 文件夹,执行 openssl.exe 文件;
3.生成RSA私钥命令:

这里生成的密钥文件是2048比特。

genrsa -out rsa_private_key.pem 2048

4.生成RSA公钥命令:
注意,公钥和私钥是成对的,所以你在生成一个后,另一个的生成是基于前一个的文件名,否则生成的不是一对哦!!

rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

生成后的文件应该在你的用户目录下,或者在openssl的bin文件夹下(有时候在有时又不在,真是搞不懂,反正你就在这两个地方都找一下,肯定在的)。

**5.这里介绍一下RSA密钥文件的规律,**文件名都是以.pem为后缀,生成的RSA密钥,可以看到都是
-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的 RSA 私钥。

##二、安装python支持的加密库—pycryptodome

我用的python3.6版本,网上搜了一下,在python3.6之前的版本大部分是用pycrypto来进行加密的,而在python3.6之后,因无人维护pycrypto,所以改名为pycryptodome,这个库的强大之处在于,他是pycrypto库的扩展,用起来更加方便,更灵活啊~~功能杠杠滴

###1.安装pycryptodome
如果你安装了pip,那么就很简单了。

pip3 install pycryptodome

###2.将密钥文件导入到程序中。

from Crypto.PublicKey import RSA# 读取标准的rsa公私钥pem文件
def load_rsa_file(fn):key = Nonetry:key = RSA.importKey(open(fn).read())except Exception as err:print('导入rsa的KEY文件出错', fn, err)return key# 标准字符串密钥转rsa格式密钥
def rsa_key_str2std(skey):ret = Nonetry:ret = RSA.importKey(skey)except Exception as err:print('字符串密钥转rsa格式密钥错误', skey, err)return ret

###3.RSA加密

from Crypto.Cipher import PKCS1_OAEP# RSA_加密
def rsa_enc(data, rsa_key):ciphertext = b''try:cipher = PKCS1_OAEP.new(rsa_key)ciphertext = cipher.encrypt(data)except Exception as err:print('RSA加密失败', '', err)return ciphertext

由于RSA在加密过程中,每次加密只能加密最大长度的字符串,如果你的加密数据超长,在加密过程中需要分段加密,同理,解密也是分段解密的。

1024位的证书,加密时最大支持117个字节,解密时为128;
2048位的证书,加密时最大支持245个字节,解密时为256。

加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)
其中,11位字节为保留字节。
上面我的密钥文件是2048比特,所以加密分块长度为245字节。

###4.加密分块


# 根据key长度计算分块大小
def get_block_size(rsa_key):try:# RSA仅支持限定长度内的数据的加解密,需要分块# 分块大小block_reversed_size=11reserve_size = block_reversed_sizekey_size = rsa_key.size_in_bits()if (key_size % 8) != 0:raise RuntimeError('RSA 密钥长度非法')# 密钥用来解密,解密不需要预留长度if rsa_key.has_private():reserve_size = 0bs = int(key_size / 8) - reserve_sizeexcept Exception as err:print('计算加解密数据块大小出错', rsa_key, err)return bs# 返回块数据
def block_data(data, rsa_key):bs = get_block_size(rsa_key)for i in range(0, len(data), bs):yield data[i:i + bs]

RSA在解密分段时与加密时用的分段大小无关,都是按照密钥长度/8来分段解密的。

###5.RSA解密

from Crypto.Cipher import PKCS1_OAEP# RSA解密
def rsa_dec(data, rsa_key):ret_data = b''try:cipher = PKCS1_OAEP.new(rsa_key)ret_data = cipher.decrypt(data)except Exception as err:print('RSA解密失败', '', err)return ret_data

###6.RSA签名

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256# RSA签名
def rsa_sign(data, rsa_key):signature = ''try:h = SHA256.new(data)signature = pkcs1_15.new(rsa_key).sign(h)except Exception as err:print('RSA签名失败', '', err)return signature

###7.RSA验签名

# RSA签名验证
def rsa_sign_verify(data, sig, rsa_key):try:h = SHA256.new(data)pkcs1_15.new(rsa_key).verify(h, sig)ret = Trueexcept (ValueError, TypeError):ret = Falsereturn ret

###8.RSA加解密类(我将RSA加解密封装成一个类,方便后续直接调用),完整代码如下:

# -*- coding: utf-8 -*-
import Crypto.Cipher as Cipher
import Crypto.Signature as Sign
import Crypto.Hash as Hash
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_v1_5_cipper
from Crypto.Signature import PKCS1_v1_5 as PKCS1_v1_5_sign
from Crypto.Hash import SHA1class Rsa:"""RSA加解密签名类"""def __int__(self, ciper_lib=PKCS1_v1_5_cipper, sign_lib=PKCS1_v1_5_sign, hash_lib=SHA1,pub_file=None, pri_file=None, pub_skey=None, pri_skey=None, pub_key=None, pri_key=None,reversed_size=11):# 加解密库self.ciper_lib = ciper_libself.sign_lib = sign_libself.hash_lib = hash_lib# 公钥密钥if pub_key:self.pub_key = pub_keyelif pub_skey:self.pub_key = RSA.importKey(pub_skey)elif pub_file:self.pub_key = RSA.importKey(open(pub_file).read())if pri_key:self.pri_key = pri_keyelif pri_skey:self.pri_key = RSA.importKey(pri_skey)elif pri_file:self.pri_key = RSA.importKey(open(pri_file).read())# 分块保留长度self.block_reversed_size = reversed_size# 根据key长度计算分块大小def get_block_size(self, rsa_key):try:# RSA仅支持限定长度内的数据的加解密,需要分块# 分块大小reserve_size = self.block_reversed_sizekey_size = rsa_key.size_in_bits()if (key_size % 8) != 0:raise RuntimeError('RSA 密钥长度非法')# 密钥用来解密,解密不需要预留长度if rsa_key.has_private():reserve_size = 0bs = int(key_size / 8) - reserve_sizeexcept Exception as err:print('计算加解密数据块大小出错', rsa_key, err)return bs# 返回块数据def block_data(self, data, rsa_key):bs = self.get_block_size(rsa_key)for i in range(0, len(data), bs):yield data[i:i + bs]# 加密def enc_bytes(self, data, key=None):text = b''try:rsa_key = self.pub_keyif key:rsa_key = keycipher = self.ciper_lib.new(rsa_key)for dat in self.block_data(data, rsa_key):cur_text = cipher.encrypt(dat)text += cur_textexcept Exception as err:print('RSA加密失败', data, err)return text# 解密def dec_bytes(self, data, key=None):text = b''try:rsa_key = self.pri_keyif key:rsa_key = keycipher = self.ciper_lib.new(rsa_key)for dat in self.block_data(data, rsa_key):if type(self.ciper_lib) == Cipher.PKCS1_OAEP:cur_text = cipher.decrypt(dat)else:cur_text = cipher.decrypt(dat, '解密异常')text += cur_textexcept Exception as err:print('RSA解密失败', data, err)return text# RSA签名def sign_bytes(self, data, key=None):signature = ''try:rsa_key = self.pri_keyif key:rsa_key = keyh = self.hash_lib.new(data)signature = self.sign_lib.new(rsa_key).sign(h)except Exception as err:print('RSA签名失败', '', err)return signature# RSA签名验证def sign_verify(self, data, sig, key=None):try:rsa_key = self.pub_keyif key:rsa_key = keyh = self.hash_lib.new(data)self.sign_lib.new(rsa_key).verify(h, sig)ret = Trueexcept (ValueError, TypeError):ret = Falsereturn retdef main():passif __name__ == '__main__':main()

创作不易,喜欢的话给喵喵赏点吧~(可怜眼神)

python使用RSA加密算法相关推荐

  1. Python实现RSA加密算法

    RSA介绍 RSA加密算法是由美国麻省理工学院的3名密码学者Rivest.Shamir.Adleman提出的一种基于大合数因式分解困难性的公共弄开密钥密码.由于它的安全.易懂,因此已成为目前应用最广的 ...

  2. 使用Python实现RSA加密算法及详解RSA算法

    代码已经放上github : https://github.com/chroje/RSA 一.非对称加密算法 1.乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. 2. ...

  3. python实现非对称加密算法_Python使用rsa模块实现非对称加密与解密

    Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公 ...

  4. RSA加密算法Python实现

    RSA加密算法Python实现 1.RSA算法简介 2.RSA算法涉及的数学知识 2.1互素 2.2 欧拉定理 2.3求模逆元 2.4 取模运算 2.5 最大公因数 2.6 最小公倍数 2.7 欧几里 ...

  5. RSA加密算法简单介绍以及python实现

    RSA加密算法简单介绍 注:本篇文章只是本人在学完RSA加密之后的个人总结,若有不正确的地方,欢迎指正OVO RSA是一种公钥加密算法,它具有公钥和私钥两种密钥:公钥用来加密,并且是公开的,私钥是用来 ...

  6. python实现rsa加密源代码_python实现RSA加密(解密)算法

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠 ...

  7. python实现rsa数据加密_python实现RSA与AES混合加密

    RSA加密 这是一种非对称加密算法,密钥分为公钥和私钥.通常私钥长度有512bit,1024bit,2048bit,4096bit,长度越长,越安全,但是生成密钥越慢,加解密也越耗时.一般公钥用来加密 ...

  8. python实现rsa加密解密代码_使用python实现rsa算法代码

    RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名. 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息.她可以 ...

  9. 快速了解什么是RSA加密算法

    1.什么是RSA 加密算法有对称加密和非对称加密. 对称加密是指发送方和接收方使用相同的一种规则对信息进行处理,因为双方使用的是相同的规则和密钥,所以一旦密钥泄露,那么再强大的加密也将毫无用处. 所有 ...

最新文章

  1. AWS无服务开发Lambda系列之本地上传包至Lambda
  2. 将JavaFX 2.0与Swing和SWT集成
  3. springboot 注解动态赋值_SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值
  4. note.. redis五大数据类型
  5. masm32环境配置
  6. 如何写毕业设计——开题报告
  7. 计算机Excel设置透视图,excel共享表格数据-EXCEL在共享模式中,如何让数据透视表能够自动刷新?...
  8. 数字孪生的主要应用领域
  9. ceph rbd扩容
  10. Python xlwt 操作 excel 表格基础(二):冻结窗口、设置加密保护、打印设置等
  11. 【win7安装composer错误】:The quot;https://getcomposer.org/download/1.6.2/composer.phar.sigquot; file cou
  12. 实现TCP协议端到端的可靠传输 RDT
  13. pyton 内置模块
  14. 贪心算法实例(一):多任务分配问题
  15. unity移动端材质丢失呈洋红色问题记录
  16. 分治算法--L型骨牌棋盘覆盖
  17. TensorFlow练习6: 基于WiFi指纹的室内定位(autoencoder)
  18. oracle 11g rac suse,suse linux 11 + 多路径+udev+oracle11g rac
  19. 简单易懂的自动化测试进阶版【建议收藏】
  20. 雅马哈机械手的基本操作,与上位机通讯程序编写

热门文章

  1. TI-DSPC6657、C6678多核开发OpenMP示例
  2. 纯净正版 WIN10 安装文件官方下载
  3. 如何在网站集成Payssion的国外支付方式?
  4. 25-javaweb接入支付宝支付接口
  5. Microsoft SQL Server笔记整理
  6. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
  7. 这玩意儿叫H5编辑器??不应该叫H5全能王吗?
  8. Serenity框架官方文档翻译3.2(多租户)
  9. 银达汇智 智慧综合管理平台 FileDownLoad.aspx 任意文件读取漏洞
  10. python微博自动评论转发_「Python」 - 自动删除微博评论