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