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")