python RSA 密钥对的获取 数据加解密 加签验签

RSA加密算法是一种非对称加密算法。在公开密钥中RSA被广泛使用。

加密原理:数据使用公钥进行加密,只能使用对应的私钥才能进行解密数据。

加签验签的原理:数据进行私钥加签后,需使用公钥进行验签,加签使用的算法有:

SHA-1,SHA-224,SHA-224,SHA-256,SHA-384,SHA-512,MD5

1、python 中的rsa库安装

#在线安装rsa库
pip install rsa

2、rsa中获取一对公私钥

#rsa.newkeys(keySize)
#keySize定义密钥的长度
(publicKey, privateKey) = rsa.newkeys(1024)

3、保存密钥

#密钥保存 密钥保存为base64加密后的铭文
publicKey.save_pkcs1()
privateKey.save_pkcs1()

4、加载公私钥

#公钥加载
rsa.PublicKey.load_pkcs1(publicKey)
#私钥加载
rsa.PrivateKey.load_pkcs1(privateKey)

5、加密方式为使用公钥加密

#使用公钥加密  返回的数据为密文
enMessage = rsa.encrypt(message, publicKey)

6、解密方式为使用对应的私钥进行解密

#使用私钥进行解密 
message = rsa.decrypt(enMessage, privateKey)

7、加签方式是使用私钥进行加签

#加签 hash_method 加签的方式 SHA-1,SHA-224,SHA-224,SHA-256,SHA-384,SHA-512,MD5
#返回的数据为密文
signMessage = rsa.sign(message, privteKey, hash_method)

8、验签的方式使用公钥进行验签

#公钥验签 返回的是加签的方式
method = rsa.verify(message, signMessage, publicKey)

更具这这方法可以扩展写成一些工具方法,下面是小编写的一部分

# -*- coding:utf-8 -*-
import rsa
import base64



def getRSAKey(keySize=1024):
    """
    获取一对公私钥
    :param keySize: 生成密钥的长度默认1024
    :return:publicKey,privateKey
    """
    (publicKey, privateKey) = rsa.newkeys(keySize)
    print "生成一对公私钥长度为%s字节"%(keySize)
    print "公钥为:%s"%(publicKey)
    print "私钥为:%s"%(privateKey)
    return publicKey,privateKey

def getRSAKeyFile(filePath=".",publicKeyFileName="publicKey.pem",privateKeyFileName="privateKey.pem",keySize=1024):
    """
    获取公私钥文件
    :param filePath:文件路径
    :param publicKeyFileName: 公钥文件名称
    :param privateKeyFileName: 私钥文件名
    :param keysize: 密钥长度默认1024字节
    :return:
    """
    publicKey,privateKey = getRSAKey(keySize)
    publicKeyFile = filePath+"/"+publicKeyFileName
    privateKeyFile = filePath + "/" + privateKeyFileName
    #创建文件
    pubfile = open(publicKeyFile, 'w+')
    #save_pkcs1会将密钥进行base64进行加密
    pubfile.write(publicKey.save_pkcs1())
    pubfile.close()
    print "生成公钥文件:%s"%(publicKeyFile)
    prifile = open(privateKeyFile, 'w+')
    prifile.write(privateKey.save_pkcs1())
    prifile.close()
    print "生成私钥文件:%s" % (privateKeyFile)
    return publicKeyFile,privateKeyFile

def readPublicKey(file):
    """
    读取公钥文件
    :param file: 文件
    :return: publicKey
    """
    key = open(file)
    pubkey = key.read()
    publicKey = rsa.PublicKey.load_pkcs1(pubkey)
    key.close()
    print "读取公钥为:%s"%(publicKey)
    return publicKey

def readPrivteKey(file):
    """
    读取私钥文件
    :param file: 文件
    :return: privateKey
    """
    key =  open(file)
    prikey = key.read()
    privateKey = rsa.PrivateKey.load_pkcs1(prikey)
    key.close()
    print "读取私钥为:%s"%(privateKey)
    return  privateKey

def encodeByPublicKey(message="",publicKey="",isBase64="1"):
    """
    使用未加密的公钥加密数据
    :param message: 加密数据
    :param publicKey: 公钥
    :param isBase64 数据加密后转换为base64 0-是  1-否
    :return:
    """
    enMessage = rsa.encrypt(message, publicKey)
    if isBase64 == "0":
        enMessage = base64.b64encode(enMessage)
    return enMessage

def decodeByPrivateKey(enMessage="",privateKey="",isBase64="1"):
    """
    未加密的私钥解密数据
    :param enMessage: 解密数据
    :param privateKey:私钥
    :param isBase64 数据转换为base64解密 0-是  1-否
    :return:
    """
    if isBase64 == "0":
        enMessage = base64.b64decode(enMessage)
    message = rsa.decrypt(enMessage, privateKey)
    return message

def signByPrivateKey(message="",privteKey="",hash_method="SHA-1",isBase64="1"):
    """
    用私钥签名认证
    :param message: 加签的数据
    :param privteKey: 私钥
    :param hash_method 加签的方式 SHA-1,SHA-224,SHA-224,SHA-256,SHA-384,SHA-512,MD5
    :param isBase64: 加签后的数据是否base64加密 0-是 1-否
    :return:signMessage 加签数据,hash_method :加签的方式
    """
    signMessage = rsa.sign(message, privteKey, hash_method)
    if isBase64 == "0":
        signMessage = base64.b64encode(signMessage)
    return signMessage,hash_method



def verifyByPublicKey(message="",signMessage="",publicKey="",hash_method="SHA-1",isBase64="1"):
    """
    用公钥进行验签
    :param message: 验签参照数据
    :param signMessage: 验签的数据
    :param publicKey: 公钥
    :param hash_method: 验签的方式
    :param isBase64:  验签的数据为bae64加密数据
    :return: boolean 验签结果  method 数据加签的方式
    """
    if isBase64 == "0":
        signMessage = base64.b64decode(signMessage)
    method = rsa.verify(message, signMessage, publicKey)
    if method == hash_method:
        return True,method
    else:
        print "验签失败:加签方式为%s"%method
        return False,method



if __name__=="__main__":

    print "测试获取密钥"
    pub,pri = getRSAKey()

    print "测试获取密钥文件"
    getRSAKeyFile()

    print "测试获取公钥"
    readPublicKey("publicKey.pem")
    readPrivteKey("privateKey.pem")

    print "测试加解密"
    message = "1111"
    enM = encodeByPublicKey(message,pub,"0")
    print "加密后:%s"%enM
    me = decodeByPrivateKey(enM,pri,"0")
    print "解密后:%s"%me


    print "测试加签验签"
    message = "1234567890"
    signMessage,signMethod = signByPrivateKey(message,pri,isBase64="0")
    print "加签后的数据:%s"%(signMessage)
    print verifyByPublicKey(message,signMessage,pub,isBase64="0")


 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Python 进行 RSA 密和解密,我们需要使用 `pycryptodome` 库。可以通过 `pip` 安装: ``` pip install pycryptodome ``` 下面是一个简单的示例,演示如何使用 RSA 进行文件密和解密: ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成RSA密钥key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() # 将公钥和私钥保存到磁盘 with open('private_key.pem', 'wb') as f: f.write(private_key) with open('public_key.pem', 'wb') as f: f.write(public_key) # 从磁盘载公钥和私钥 with open('private_key.pem', 'rb') as f: private_key = RSA.import_key(f.read()) with open('public_key.pem', 'rb') as f: public_key = RSA.import_key(f.read()) # 密文件 def encrypt_file(filename, public_key): with open(filename, 'rb') as f: data = f.read() cipher_rsa = PKCS1_OAEP.new(public_key) encrypted_data = cipher_rsa.encrypt(data) with open(filename + '.enc', 'wb') as f: f.write(encrypted_data) # 解密文件 def decrypt_file(filename, private_key): with open(filename, 'rb') as f: encrypted_data = f.read() cipher_rsa = PKCS1_OAEP.new(private_key) data = cipher_rsa.decrypt(encrypted_data) with open(filename[:-4], 'wb') as f: f.write(data) # 密文件 encrypt_file('plaintext.txt', public_key) # 解密文件 decrypt_file('plaintext.txt.enc', private_key) ``` 在这个示例中,我们首先生成了一个 RSA 密钥对,并将公钥和私钥保存到磁盘。然后,我们使用 `PKCS1_OAEP` 密方案,将明文文件密,并将密后的数据保存到磁盘。最后,我们使用相同的私钥对密后的文件进行解密,并将解密后的数据保存到磁盘。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值