Python 私鑰生成簽名和公鑰驗籤的兩種方式

2021-08-20 09:47:59 字數 2599 閱讀 3752

import os

import base64

import rsa

# 安裝pycrypto

from crypto import random

from crypto.hash import sha256

from crypto.publickey import rsa

from crypto.signature import pkcs1_v1_5 as signature_pkcs1_v1_5

"""function 2:

openssl genrsa -out ./myprivatekey.pem -passout pass:"密碼" -des3 2048

openssl rsa -pubout -in ./myprivatekey.pem -passin pass:"密碼" -out ./mypublickey.pem

"""def gen_sign(unsign_data, secret):

"""兩種方式生成簽名:

這是第一種

1. 開啟檔案方式,見所有被注釋的部分,檔案為.pem

2. passphrase 的引數為檔案加密的密碼

:return: 簽名資料

"""path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

doc = os.path.join(path, 'myprivatekey.pem')

with open(doc) as pk:

key_data = pk.read()

rsakey = rsa.importkey(key_data, passphrase=密碼)

signer = signature_pkcs1_v1_5.new(rsakey)

digest = sha256.new()

digest.update(unsign_data.encode('utf8'))

sign = signer.sign(digest)

signature = base64.b64encode(sign)

print(signature)

return signature

def gen_sign(private_key, unsign_data, secret):

"""兩種方式生成簽名:

1. 是直接讀取私鑰的方式和未加籤的資料

:return: 簽名資料

"""rsakey = rsa.importkey(base64.b64decode(private_key), passphrase=secret)

signer = signature_pkcs1_v1_5.new(rsakey)

digest = sha256.new()

digest.update(unsign_data.encode('utf8'))

sign = signer.sign(digest)

signature = base64.b64encode(sign)

print(signature)

return signature

def verify_sign(data, sign, secret):

"""讀取公鑰檔案,驗籤

"""path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

doc = os.path.join(path, 'myprivatekey.pem')

with open(doc) as pk:

key_data = pk.read()

rsakey = rsa.importkey(key_data, passphrase=b'密碼')

verifier = signature_pkcs1_v1_5.new(rsakey)

digest = sha256.new()

digest.update(data.encode('utf8'))

is_verify = verifier.verify(digest, base64.b64decode(sign))

print(is_verify)

return is_verify

def verify_sign(pubkey, data, sign, secret):

"""直接傳公鑰方式

"""rsakey = rsa.importkey(base64.b64decode(pubkey), passphrase=secret)

verifier = signature_pkcs1_v1_5.new(rsakey)

digest = sha256.new()

digest.update(data.encode('utf8'))

is_verify = verifier.verify(digest, base64.b64decode(sign))

print(is_verify)

return is_verify

if __name__ == '__main__':

pass

pass

公鑰,私鑰,加密和簽名

加密和簽名是兩個不同的概念,又都涉及公鑰和私鑰的概念。公鑰和私鑰相當於鑰匙和鎖,鎖可以用來鎖住東西,鑰匙可以用來開啟對應的鎖,一把鑰匙只能開一把鎖,當然鑰匙和鎖都可以複製。加密相當於我自己生成一把鎖和一把鑰匙,然後把鎖發給你,你用我的鎖把想發給我的東西鎖上再發給我,我收到之後用鑰匙開啟鎖。天下人都能...

公鑰加密和私鑰簽名

本文 自感謝逆水行舟,不進則退的分享。一 公鑰加密 假設一下,我找了兩個數字,乙個是1,乙個是2。我喜歡2這個數字,就保留起來作為私鑰,不告訴你們,然後我告訴大家,1是我的公鑰。我有乙個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以用...

生成公鑰和私鑰

和第三方服務互動的時候。經常需要生成私鑰和公鑰。用git bash開啟之後。使用命令生成。openssl genrsa out allinpay.key 1024 openssl req new x509 key allinpay.key out allinpay.cer 依次填寫相關資訊。生成兩個...