首页 > 编程语言 >python实现rsa加密

python实现rsa加密

时间:2024-10-19 09:44:33浏览次数:6  
标签:公钥 加密 b64 python rsa private id key public

模拟效果:用户注册/登陆成功,返回自己的公钥,注册时候生成的私钥和公钥入库。下次进来的时候,加解密是动态的,也就是每个用户都不一样

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64
import sqlite3

# 生成私钥和公钥
def generate_keys():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()

    # 将公钥和私钥序列化为PEM格式,并进行Base64编码
    public_key_pem = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    private_key_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )
    public_key_b64 = base64.b64encode(public_key_pem).decode('utf-8')
    private_key_b64 = base64.b64encode(private_key_pem).decode('utf-8')

    return private_key_b64, public_key_b64

# 将公钥和私钥存储到数据库
def store_keys_in_database(user_id, private_key_b64, public_key_b64):
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    # 创建用户表,如果已存在则忽略
    c.execute('''CREATE TABLE IF NOT EXISTS users
                 (id INTEGER PRIMARY KEY, private_key TEXT, public_key TEXT)''')
    # 插入公钥和私钥
    c.execute('INSERT INTO users (id, private_key, public_key) VALUES (?, ?, ?)', (user_id, private_key_b64, public_key_b64))
    # 如果是自增id。
    # 获取最后插入行的自增ID
    # last_row_id = c.lastrowid
    # print(f'用户ID: {last_row_id}')
    conn.commit()
    conn.close()

# RSA加密(使用公钥)
def encrypt_with_public_key(public_key_b64, plaintext):
    public_key_pem = base64.b64decode(public_key_b64)
    public_key = serialization.load_pem_public_key(
        public_key_pem,
        backend=default_backend()
    )
    encrypted = public_key.encrypt(
        plaintext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return base64.b64encode(encrypted).decode('utf-8')

# RSA解密(使用私钥)
def decrypt_with_private_key(private_key_b64, ciphertext_b64):
    ciphertext = base64.b64decode(ciphertext_b64)
    private_key_pem = base64.b64decode(private_key_b64)
    private_key = serialization.load_pem_private_key(
        private_key_pem,
        password=None,
        backend=default_backend()
    )
    decrypted = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted.decode('utf-8')

# 主程序
def main():
    # 生成密钥对
    user_id = 2  # 假设用户ID为1
    private_key_b64, public_key_b64 = generate_keys()
    print("公钥(Base64):", public_key_b64)
    print("私钥(Base64):", private_key_b64)

    # 存储公钥和私钥到数据库,id唯一,主键
    #store_keys_in_database(user_id, private_key_b64, public_key_b64)
    print("生成完成 用户id:", user_id)

    # 从数据库检索公钥和私钥
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    c.execute('SELECT private_key, public_key FROM users WHERE id = ?', (user_id,))
    stored_private_key_b64, stored_public_key_b64 = c.fetchone()
    conn.close()

    # 要加密的明文
    plaintext = "Hello, World!"

    # 使用公钥加密
    encrypted_text_b64 = encrypt_with_public_key(stored_public_key_b64, plaintext.encode('utf-8'))
    print("加密(Base64):", encrypted_text_b64)

    # 使用私钥解密
    decrypted_text = decrypt_with_private_key(stored_private_key_b64, encrypted_text_b64)
    print("解密:", decrypted_text)

if __name__ == "__main__":
    main()

输出

公钥(Base64): xxxx
私钥(Base64): yyy
生成完成 用户id: 2
加密(Base64): xxyy
解密: Hello, World!

标签:公钥,加密,b64,python,rsa,private,id,key,public
From: https://www.cnblogs.com/qcy-blog/p/18475504

相关文章

  • python+uniapp微信小程序线上点餐管理信息系统java+nodejs-毕业设计
    前端开发框架:vue.js数据库mysql版本不限后端语言框架支持:1java(SSM/springboot)-idea/eclipse2.Nodejs+Vue.js-vscode3.python(flask/django)--pycharm/vscode4.php(thinkphp/laravel)-hbuilderx数据库工具:Navicat/SQLyog等都可以 随着科技的不断发展,移动互联网......
  • python+vue基于django/flask的在线投票管理系统java+nodejs-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • python+vue基于django/flask的美食分享推荐系统Java+nodejs-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • Nodejs java python php基于微信平台的二次元手办商场小程序
    目录项目介绍具体实现截图设计方法和思路技术介绍小程序框架以及目录结构介绍java类核心代码部分展示其他小程序项目推荐系统测试详细视频演示源码获取项目介绍小程序选用微信开者与Nodejsjavapythonphp语言,应用uniapp框架,MySQL为后台数据库。系统主要包括用户......
  • java Nodejs python php云台音乐网站系统 微信小程序
    目录项目介绍具体实现截图技术介绍HBuilderX协同过滤算法java类核心代码部分展示其他springboot项目推荐详细视频演示源码获取项目介绍云台音乐微信小程序的设计基于现有的智能手机上运行,可以实现服务端;首页、个人中心、用户管理、音乐分类管理、歌曲信息管理、音......
  • python火柴人毕业设计
    1.引言火柴人(StickFigure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作。火柴人不仅广泛应用于动画、漫画和涂鸦中,还可以作为图形学、人工智能等领域的教学和研究工具。本文旨在介绍如何使用Python实现火柴人的设计与绘制,通过编程的方式,让读者......
  • Python命名空间包
    python命名空间包pythonnamespacepackageWhatisaNamespacePackage?AnamespacepackageisatypeofpackageintroducedinPython3.3thatdoesnotrequirean__init__.pyfile.Unliketraditionalpackages,multipledirectories(oftenspreadacrossdifferen......
  • Python实现火柴人的设计与实现
    1.引言火柴人(StickFigure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作。火柴人不仅广泛应用于动画、漫画和涂鸦中,还可以作为图形学、人工智能等领域的教学和研究工具。本文旨在介绍如何使用Python实现火柴人的设计与绘制,通过编程的方式,让读者......
  • java Nodejs python php微信小程序的校园跑腿系统628
    目录项目介绍具体实现截图技术介绍HBuilderX协同过滤算法java类核心代码部分展示其他springboot项目推荐详细视频演示源码获取项目介绍伴随着社会以及科学技术的发展,小程序已经渗透在人们的身边,小程序慢慢的变成了人们的生活必不可少的一部分,紧接着网络飞速的发展,小......
  • 微信小程序python flask django火锅店点餐订餐系统
    目录项目介绍具体实现截图技术介绍HBuilderX协同过滤算法java类核心代码部分展示其他springboot项目推荐详细视频演示源码获取项目介绍火锅店点餐系统,主要包括管理员与用户二个权限角色,对于用户角色不同,所使用的功能模块相应不同。本文从管理员、用户的功能要求出发......