Python加密技术之RSA加密解密的实现


Posted in Python onApril 08, 2022

前言

  • 加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加密技术,在软件、网页中已得到广泛应用。本文将介绍RSA加密解密在python中的实现。
  • 原则:公钥加密,私钥解密
  • 解释:具体过程的解释请见代码前的注释

RSA加密实验基本流程:

一、选取两个大素数p、q,并计算得到n、phi_n

二、选取常用的e = 0x10001,方便将幂运算优化为左移,加快运算速度

三、计算d,使用了扩展欧几里得算法

四、输入明文a,将明文转化为可以用于计算的数字形式

五、对a使用快速幂取模,得到密文b,以16进制显示

RSA解密流程:

六、对b使用快速幂取模,得到明文a,以字符形式显示

一、安装模块

pip install pycryptodome

二、生成密钥对

  • 密钥对文件生成和读取
  • 代码:
from Crypto.PublicKey import RSA
def create_rsa_pair(is_save=False):
    '''
    创建rsa公钥私钥对
    :param is_save: default:False
    :return: public_key, private_key
    '''
    f = RSA.generate(2048)
    private_key = f.exportKey("PEM")  # 生成私钥
    public_key = f.publickey().exportKey()  # 生成公钥
    if is_save:
        with open("crypto_private_key.pem", "wb") as f:
            f.write(private_key)
        with open("crypto_public_key.pem", "wb") as f:
            f.write(public_key)
    return public_key, private_key

def read_public_key(file_path="crypto_public_key.pem") -> bytes:
    with open(file_path, "rb") as x:
        b = x.read()
        return b

def read_private_key(file_path="crypto_private_key.pem") -> bytes:
    with open(file_path, "rb") as x:
        b = x.read()
        return b

三、加密

  • 流程:输入文本(str)→字符串编码(默认utf-8)(bytes)→rsa加密(bytes)→base64编码(bytes)→解码为字符串(str)
  • 代码:
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA

def encryption(text: str, public_key: bytes):
	# 字符串指定编码(转为bytes)
	text = text.encode('utf-8')
	# 构建公钥对象
	cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key))
	# 加密(bytes)
	text_encrypted = cipher_public.encrypt(text) 
	# base64编码,并转为字符串
	text_encrypted_base64 = base64.b64encode(text_encrypted ).decode()
	return text_encrypted_base64 
	
if __name__ == '__main__':
	public_key = read_public_key()
	text = '123456'
	text_encrypted_base64 = encryption(text, public_key)
	print('密文:',text_encrypted_base64)

四、解密

  • 说明:解密流程与加密流程相反(按照加密流程逆序解密)
  • 流程:输入文本(str)→字符串编码(默认utf-8)(bytes)→base64解码(bytes)→rsa解密(bytes)→解码为字符串(str)
  • 代码:
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto import Random
from Crypto.PublicKey import RSA

def decryption(text_encrypted_base64: str, private_key: bytes):
	# 字符串指定编码(转为bytes)
	text_encrypted_base64 = text_encrypted_base64.encode('utf-8')
	# base64解码
	text_encrypted = base64.b64decode(text_encrypted_base64 )
	# 构建私钥对象
	cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key))
	# 解密(bytes)
	text_decrypted = cipher_private.decrypt(text_encrypted , Random.new().read)
	# 解码为字符串
	text_decrypted = text_decrypted.decode()
	return text_decrypted 
	
if __name__ == '__main__':
	# 生成密文
	public_key = read_public_key()
	text = '123456'
	text_encrypted_base64 = encryption(text, public_key)
	print('密文:',text_encrypted_base64)
	
	# 解密
	private_key = read_private_key()
	text_decrypted = decryption(text_encrypted_base64, private_key)
	print('明文:',text_decrypted)

五、完整代码

import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto import Random
from Crypto.PublicKey import RSA
# ------------------------生成密钥对------------------------
def create_rsa_pair(is_save=False):
    '''
    创建rsa公钥私钥对
    :param is_save: default:False
    :return: public_key, private_key
    '''
    f = RSA.generate(2048)
    private_key = f.exportKey("PEM")  # 生成私钥
    public_key = f.publickey().exportKey()  # 生成公钥
    if is_save:
        with open("crypto_private_key.pem", "wb") as f:
            f.write(private_key)
        with open("crypto_public_key.pem", "wb") as f:
            f.write(public_key)
    return public_key, private_key

def read_public_key(file_path="crypto_public_key.pem") -> bytes:
    with open(file_path, "rb") as x:
        b = x.read()
        return b

def read_private_key(file_path="crypto_private_key.pem") -> bytes:
    with open(file_path, "rb") as x:
        b = x.read()
        return b
# ------------------------加密------------------------
def encryption(text: str, public_key: bytes):
    # 字符串指定编码(转为bytes)
    text = text.encode('utf-8')
    # 构建公钥对象
    cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key))
    # 加密(bytes)
    text_encrypted = cipher_public.encrypt(text)
    # base64编码,并转为字符串
    text_encrypted_base64 = base64.b64encode(text_encrypted).decode()
    return text_encrypted_base64

# ------------------------解密------------------------
def decryption(text_encrypted_base64: str, private_key: bytes):
    # 字符串指定编码(转为bytes)
    text_encrypted_base64 = text_encrypted_base64.encode('utf-8')
    # base64解码
    text_encrypted = base64.b64decode(text_encrypted_base64)
    # 构建私钥对象
    cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key))
    # 解密(bytes)
    text_decrypted = cipher_private.decrypt(text_encrypted, Random.new().read)
    # 解码为字符串
    text_decrypted = text_decrypted.decode()
    return text_decrypted

if __name__ == '__main__':
    # 生成密钥对
    # create_rsa_pair(is_save=True)
    # public_key = read_public_key()
    # private_key = read_private_key()
    public_key, private_key = create_rsa_pair(is_save=False)

    # 加密
    text = '123456'
    text_encrypted_base64 = encryption(text, public_key)
    print('密文:', text_encrypted_base64)

    # 解密
    text_decrypted = decryption(text_encrypted_base64, private_key)
    print('明文:', text_decrypted)

Python加密技术之RSA加密解密的实现

总结

到此这篇关于利用Python实现RSA加密解密的文章就介绍到这了,更多相关Python RSA加密解密内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中引用与复制用法实例分析
Jun 04 Python
分享Python文本生成二维码实例
Jan 06 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
scrapy爬虫实例分享
Dec 28 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
python中使用while循环的实例
Aug 05 Python
python调用私有属性的方法总结
Jul 24 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
请求模块urllib之PYTHON爬虫的基本使用
用Python仅20行代码编写一个简单的端口扫描器
Python实现视频自动打码的示例代码
Apr 08 #Python
Python OpenCV实现图形检测示例详解
Python语法学习之进程的创建与常用方法详解
基于PyQt5制作一个群发邮件工具
You might like
用PHP来写记数器(详细介绍)
2006/10/09 PHP
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
javascript 异常处理使用总结
2009/06/21 Javascript
jQuery each()小议
2010/03/18 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
Node.js自定义实现文件路由功能
2017/09/22 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
原生JS实现天气预报
2020/06/16 Javascript
详解JS预解析原理
2020/06/16 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python标准库与第三方库详解
2014/07/22 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
Python编码类型转换方法详解
2016/07/01 Python
使用python接入微信聊天机器人
2020/03/31 Python
django下创建多个app并设置urls方法
2020/08/02 Python
中央空调节能方案
2014/06/15 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
话题作文之学会尊重
2019/12/16 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
php png失真的原因及解决办法
2021/10/24 PHP
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript