RSA加密

一、 概述

1、 简介

​ RSA是非对称的,也就是用来加密的密钥和用来解密的密钥不是同一个。和DES一样的是,RSA也是分组加密算法,不同的是分组大小可以根据密钥的大小而改变。如果加密的数据不是分组大小的整数倍,则会根据具体的应用方式增加额外的填充位

​ RSA作为一种非对称的加密算法,其中很重要的一特点是当数据在网络中传输时,用来加密数据的密钥并不需要也和数据一起传送。因此,这就减少了密钥泄露的可能性。RSA在不允许加密方解密数据时也很有用,加密的一方使用一个密钥,称为公钥,解密的一方使用另一个密钥,称为私钥,私钥需要保持其私有性

2、 签名

​ 数字签名是一种应用公钥加密方法,对数字信息进行鉴别的方法。分为数字签名和验证两部分。其中RSA数字签名基于RSA加密体制。

​ 使用私钥生成签名,并没有对数据进行加密,另一方在获取数据后,可以利用签名进行验证,如果数据传输的过程中被篡改了,那么签名验证就会失败。你可能已经想到了一种可能性,原始数据被篡改了,签名也同时被篡改了,这样验证就通过了。如果这种情况真的发生了,就说明篡改数据的人已经获取了私钥并利用私钥对篡改后的数据生成新的签名,否则,绝没有可能在没有私钥的情况下准确的篡改签名还能通过验证。如果篡改者能够获取私钥这种高度机密的信息,那么,防篡改已经没有意义了,因为人家已经彻底攻破了你的系统。 注意,签名只是验证作用,不能返回原内容。

3、 环境配置

安装

pip install pycrypto

导入

from Crypto import Random  # 导入随机模块
from Crypto.Hash import SHA  # 导入sha加密
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5  # 加密数据和解密数据
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5  # 签名和解签
from Crypto.PublicKey import RSA  # 实现rsa加密

二、 算法实现

1、 公钥和私钥

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/4/25 6:22
from Crypto import Random
from Crypto.PublicKey import RSA

random_generator = Random.new().read  # 生成随机偏移量
# print(random_generator)
rsa = RSA.generate(2048, random_generator)  # 生成一个私钥
# print(rsa)
# 生成私钥
private_key = rsa.exportKey()  # 导出私钥
# print(private_key.decode())  
# 生成公钥
public_key = rsa.publickey().exportKey()  # 生成私钥所对应的公钥
# print(public_key.decode())

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)  # 将公钥内容写入文件中

生成的秘钥,需要写入到文件中,这样便于保存,毕竟,公钥是需要交给其他人使用,你自己手里同时拿着私钥和公钥是没有意义的,和你进行数据交互的人需要公钥来验证数据是否安全

2、 加密和解密

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/4/25 6:22
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher  


def get_key(key_file):
    with open(key_file) as f:
        data = f.read()  # 获取,密钥信息
        key = RSA.importKey(data)
    return key


def encrypt_data(msg):
    public_key = get_key('rsa_public_key.pem')  # 读取公钥信息
    cipher = PKCS1_cipher.new(public_key)  # 生成一个加密的类
    encrypt_text = base64.b64encode(cipher.encrypt(msg.encode()))  # 对数据进行加密
    return encrypt_text.decode()  # 对文本进行解码码


def decrypt_data(encrypt_msg):
    private_key = get_key('rsa_private_key.pem')  # 读取私钥信息
    cipher = PKCS1_cipher.new(private_key)  # 生成一个解密的类
    back_text = cipher.decrypt(base64.b64decode(encrypt_msg), 0)  # 进行解密
    return back_text.decode()  # 对文本内容进行解码


msg = "A.L.Kun"
encrypt_text = encrypt_data(msg)  # 加密
decrypt_text = decrypt_data(encrypt_text)  # 解密
print(decrypt_text, encrypt_text)

3、 签名和解签

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : test.py
# @time : 2022/4/25 6:22
import base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature


def get_key(key_file):
    with open(key_file) as f:
        data = f.read()
        key = RSA.importKey(data)
    return key


def rsa_private_sign(data):
    private_key = get_key('rsa_private_key.pem')  # 导入私钥
    signer = PKCS1_signature.new(private_key)  # 设置签名的类
    digest = SHA.new()  # 创建sha加密的类
    digest.update(data.encode())  # 将要加密的数据进行sha加密
    sign = signer.sign(digest)  # 对数据进行签名
    # 对签名进行处理
    signature = base64.b64encode(sign)  # 对数据进行base64加密
    signature = signature.decode()  # 再进行编码
    return signature  # 返回签名


def rsa_public_check_sign(text, sign):
    publick_key = get_key('rsa_public_key.pem')  # 导入公钥
    verifier = PKCS1_signature.new(publick_key)  # 生成验证信息的类
    digest = SHA.new()  # 创建一个sha加密的类
    digest.update(text.encode())  # 将获取到的数据进行sha加密
    return verifier.verify(digest, base64.b64decode(sign))  # 对数据进行验证,返回bool值


msg = 'A.L.Kun'
sign = rsa_private_sign(msg)
print(rsa_public_check_sign(msg, sign))

签名和密文一起使用,私钥对密文进行签名,将密文和签名发送给公钥方,公钥方利用公钥对签名进行验证,签名通过后,再对数据进行解密

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐