背景:原有實作是通過OpenSSL命令,現在要將一端用python實作。
原有命令如下:
#對檔案用sha256得到hash
openssl dgst -sha256 -binary -out $DEC_FILE $IN_FILE
#對得到的hash進行簽名
openssl rsautl -sign -inkey $RSA_KEY -in $DEC_FILE -out $ENC_FILE -pkcs
目前我用以下的方法進行實作:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
......
txt = text + "\n"
sha = SHA256.new()
sha.update(txt.encode('utf8'))
print("message:")
print(txt)
print("hexdigest:")
print(sha.hexdigest())
# 從PEM檔案中讀取私鑰資料
key_file = open(prikey, 'rb')
key_data = key_file.read()
key_file.close()
# 從PEM檔案資料中加載私鑰
private_key = serialization.load_pem_private_key(
key_data,
password=None,
backend=default_backend()
)
# 使用私鑰對資料進行簽名
# 指定填充方式為PKCS1v15
# 指定hash方式為sha256
sha_sig = private_key.sign(
sha.digest(),
padding.PKCS1v15(),
hashes.SHA256()
)
......
結果:
發現我實作后解出來的簽名都會帶上格式,如下:
3031300d0609608648016503040201050004201525c08fdeec19e24ddd558373408358b59e18455a3cdd80208f255ad0a9a319
原來用OpenSSL命令解出來是后面的64位元組,如下:
1525c08fdeec19e24ddd558373408358b59e18455a3cdd80208f255ad0a9a319
注意:這里使用的是openssl rsautl -sign,而不是openssl dgst -sha1 -sign。
問題:針對這種情況,我在不讓對方修改的前提下,用python是否有類可以實作原有用OpenSSL加密的結果,也就是簽名的結果只包含hash內容,不帶有簽名格式那些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/207314.html
