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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章