RSAの暗号化と復号化と署名の裏書テスト

暗号化をインストールするPIP暗号化を使用する暗号インストーラ

新しい二つのモジュールのrsautils.py、直接コードにrsatest.py、
rsautils.py


#!は/ usr / binに/のenvのpython3の
#コーディング= UTF-8
著者:Zhifengshi
"" "
create_rsa_key() - RSAキーの作成
暗号化と復号化の機能をテストする- my_encrypt_and_decryptを()
)((rsa_sign)&rsa_signverify -署名の検証と妥当性確認テスト機能をチェック
" ""

インポートBase64で
Crypto.HashインポートSHALから
RSA Crypto.PublicKeyインポートから
Crypto.Signatureインポートpkcs1_15から
Cipher_pkcs1_v1_5 AS Crypto.CipherインポートPKCS1_v1_5から
rsa_testインポートto_paraから、to_decrypt

pubkeyで= ''「BEGIN ----- PUBLIC KEY ----- RSA
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCaqlxNJpDUjMLGlzLglAub6SLZDP8HxfpHzqg
kecuVRpQ4OOlIOHSFGGHSRUyQ5F18vMzMcTWWzGaxV + bVHC8E0q9w1hUeUu954gn01wt6vK3N82o
D / N0R9ZbireOGZB / weaW8cw8jUHjc / j9N4o1pV + vcOYUsU2xt5vXRwFEGQIDAQAB
----- END RSA公開鍵----- '' '

のPrivateKey = ''' ----- BEGIN RSA PRIVATE KEY -----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIJqqXE0mkNSMwsaXMuCUC5vpItk
M / WFF + kfOqCR5y5VGlDg46Ug4dIUYYdJFTJDkXXy8zMxxNZbMZrFX5tUcLwTSr3DWFR5S73niCfT
XC3q8rc3zagP83RH1luKt44ZkH / B5pbxzDyNQeNz + P03ijWlX69w5hSxTbG3m9dHAUQZAgMBAAEC
gYBFUhKcpLw2enO9PBcE6VBbTmZk3S8wnQpllH7iKIt8OioRwWffNtoxgznP4g3NONMRocCZfqPE
2JZGUREfjEObP / jnPQFRd7r / XOwsWT80pbpBdo4csGnenbq5FVR1Ren0i1lyHeIdm + mZR3BuPoMN
QbAha + 3ggYBaSvEgfLGRrQJBANWrKQ7YHQRTf1JKDEeIQYT6Xuc1WVPZ9oNQg + G1yYK3vSxHAqEj
7pj7OYXETb7fPBsOYb3Z3OyRAJBnQhwbV + sCQQCcQSGBALdwLL6aGKfMJiEc2VTCY4 // K04L8dB1
これらの3つのパラメータは)秘密鍵を取得します。 4は、秘密鍵ファイルがディスクに書き込まれます。 図5は、チェーンの方法を使用すると、ディスク上のファイルに書き込まれた公開鍵を生成する公開鍵とexportKeyメソッドを呼び出します。 「」 "
















キー= RSA.generate(1024)
encrypted_key = key.exportKey(パスフレーズ=パスワード、PKCS = 8、保護= "scryptAndAES128-CBC")
:Fなどのオープン( "my_private_rsa_key.pem"、 "WB")と
f.write( encrypted_key)
(Fとして"my_rsa_public.pem"、 "WB"):オープンと
f.write(key.publickey()exportKey())。

デフencrypt_and_decrypt_test(メッセージ、パスワード= "123456"):
加载公钥用于加密
キー= pubkeyで
rsakey = RSA.importKey(鍵)
暗号= Cipher_pkcs1_v1_5.new(rsakey)
cipher_text = base64.b64encode(cipher.encrypt(メッセージ))
プリント( 'B "123456、abcdesd"对应的密文是:'、Cipher_Text)
#秘密鍵がロードされて復号化するために使用される
キー= PrivateKeyの
rsakey = RSA.importKey(キー)
= Cipher_pkcs1_v1_5.new暗号(rsakey)
テキスト= cipher.decrypt(base64.b64decode(Cipher_Text)、パスワード)
を印刷( '復号化されたテキストは次のとおりです。'、テキスト)


DEF rsa_sign(メッセージ、パスワード= "123456"):
読み取り承認のための秘密鍵の情報
PRIVATE_KEY = RSA.importKey(オープン( "my_private_rsa_key.pem")。リード()、パスフレーズ=パスワード)
hash_obj = SHA1.new(メッセージ)
#印刷(pkcs1_15.new(PRIVATE_KEY).can_sign( ))pkcs1_15の目的は、署名することができwheather #check
#Base64でエンコードされたプリント可視化
署名= base64.b64encode(pkcs1_15.new(PRIVATE_KEY).sign(hash_obj))
リターン署名


:DEF(メッセージ、署名)rsa_signverify
#公開鍵情報を読み取りますテストでは、チェックする
PUBLIC_KEY = RSA.importKey(オープン( "my_rsa_public.pem ")。読み())
#メッセージは「ハッシュ」処理、RSA署名ので、必要行う
hash_obj = SHA1.new(メッセージ)
:トライ
署名がbase64エンコーディングであるため、#を最初ここでそれを復号化し、次に確認するテスト
、pkcs1_15.new(PUBLIC_KEY).verify(hash_objをbase64.b64decode(署名))
を印刷( '有効な署名である。')
Trueを返す
(とValueError、TypeError例外)を除い:
印刷( '無効な署名である。')


__name__ == '__main__' IF:
メッセージ= B「123456、 dnclod "
create_rsa_key()
encrypt_and_decrypt_test(メッセージ)
dict_body = { 'certificate_no': '2019042955452554'、 'AUTH_CODE': '456789'}
encrypt_message = to_para(STR(dict_body))
プリント("辞書復号dict_body:%sの"%のto_decrypt(to_para(STR(dict_body))))
メッセージ1 = b'dsjdhsjds'
署名= rsa_sign(メッセージ)
プリント(rsa_signverify(メッセージ、署名))

rsatest.py


インポートのRSA 
インポートBASE64
Crypto.PublicKeyインポートRSAから
Cipher_pkcs1_v1_5としてCrypto.CipherインポートPKCS1_v1_5から

#需要安装pycrypto RSA
pubkeyで= '' '----- BEGIN RSA公開鍵-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCaqlxNJpDUjMLGlzLglAub6SLZDP8HxfpHzqg
kecuVRpQ4OOlIOHSFGGHSRUyQ5F18vMzMcTWWzGaxV + bVHC8E0q9w1hUeUu954gn01wt6vK3N82o
D / N0R9ZbireOGZB / weaW8cw8jUHjc / j9N4o1pV + vcOYUsU2xt5vXRwFEGQIDAQAB
----- END RSA公開鍵----- '' '

のPrivateKey = ''' ----- BEGIN RSA PRIVATE KEY -----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIJqqXE0mkNSMwsaXMuCUC5vpItk
M / WFF + kfOqCR5y5VGlDg46Ug4dIUYYdJFTJDkXXy8zMxxNZbMZrFX5tUcLwTSr3DWFR5S73niCfT
XC3q8rc3zagP83RH1luKt44ZkH / B5pbxzDyNQeNz + P03ijWlX69w5hSxTbG3m9dHAUQZAgMBAAEC
gYBFUhKcpLw2enO9PBcE6VBbTmZk3S8wnQpllH7iKIt8OioRwWffNtoxgznP4g3NONMRocCZfqPE
2JZGUREfjEObP / jnPQFRd7r / XOwsWT80pbpBdo4csGnenbq5FVR1Ren0i1lyHeIdm + mZR3BuPoMN
QbAha + 3ggYBaSvEgfLGRrQJBANWrKQ7YHQRTf1JKDEeIQYT6Xuc1WVPZ9oNQg + G1yYK3vSxHAqEj
7pj7OYXETb7fPBsOYb3Z3OyRAJBnQhwbV + sCQQCcQSGBALdwLL6aGKfMJiEc2VTCY4 // K04L8dB1
NSlzWYZSLMkfP7X + KKgdcmWQRx6Dwm6hKIIOWjQBi + CikzcLAkEAtszhqp6AbMQWyMsrKEPNcjxV
109QJiny + jN3MTK6vQf / Y5M5D63TIrTEaMoijaslHCy4uJlcplQD / IcrCyrlkwJABXA640uMFupn
W + NBy9gz5NYnnhBrDZ2LPN0wvTOZertN8oQ + h8jm4660kznNESV4iWt2AEPxquA22SruKZpoGwJB
ALrT5IiJs5RJs3 / uxjlDyg1A9NABkU9EM4xzvSxWHVSS0orF / SH / 218OphjH / D8GTFMfmySqpJVs
ZHd + IzzVa54 =
----- END RSA PRIVATE KEY ----- ''」


#加密
DEF to_para(プレーン):
rsa_key = RSA.importKey(pubkeyで)
X = rsa.encrypt(plain.encode()、rsa_key)
cipher_text = BASE64 .b64encode(X).decode()
cipher_textリターン


#解密
DEF to_decrypt(プレーン):
rsa_privkey = RSA.importKey(のPrivateKey)
暗号= Cipher_pkcs1_v1_5.new(rsa_privkey)
X = cipher.decrypt(base64.b64decode(プレーン)、「ERROR ")
プリント(x.decode())
戻りx.decode()


ByteToHex(ビン)DEF:
"""
それは、出力用の六角文字列表現の例ですにバイト文字列を変換する
"" "
復帰'' .join([" % 02X」%ビンにおけるxのX])。ストリップ()


デフHexToByte(hexstrの):
「」「
バイト文字列に文字列の六角バイト値に変換進バイト値があります。
またはスペース区切りではないかもしれない。
『』」
(hexstrのを)bytes.fromhex返す


デフhex_to_str(S):
リターン" 」.join([IN BのCHR(INT(B、16))[S [I:I + 2] iが範囲(0で、LEN(S)のために、2)]])


場合__name__ == '__main__' :
V = '182895d57f87530e854d9842ff02edaefc66fa1cca66c8f352111b6c5fbf22a9f057e5b74523cdd03f76424064df2c38ce45a68dd5492246e6b832c1b4edaacd8fb4e6050bed5a1a27ae7894d38b62e8453cd77fdbce3529d831e0278ac9e8ad3b8d6002ca82380b5ac61e7a19f773003136d64902c58f2ad563d04ce701c565'
B = bytes.fromhex(V)
、K = base64.b64encode(b)は、
プリント(to_decrypt(K))
 

おすすめ

転載: www.cnblogs.com/yichuncom/p/10973036.html