Pythonに基づくデータ暗号化
記事ディレクトリ
備考:この記事のコード例は、対応するパラメーターが渡される限り、直接コピーして使用できます~~便利で実用的です!
1.準備
重要:まず、暗号化するコンテンツがバイト形式であることを確認してください。
ここで説明している暗号化方法は、バイナリエンコーディング形式を暗号化します。したがって、暗号化する前に、暗号化するコンテンツがバイト形式であることを確認する必要があります。そうでない場合、エラーが報告されます。では、どのようにしてバイト形式を取得するのでしょうか。秘訣は、encode()メソッドとdecode()メソッドを使用することです。コードは次のとおりです。
str = 'I LOVE China! 我爱你中国!'
str_en = str.encode('utf-8') # 将内容变为 Bytes格式 ! 这样才可以加密!
print(str_en) # b'I LOVE China! \xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'
str_de = str_en.decode('utf-8') # 解密后,将内容变回字符串内容,这样才可读;
print(str_de) # I LOVE China! 我爱你中国!
暗号化と復号化の手順:
- 暗号化されたcontent.encode( 'utf-8')、暗号化されたコンテンツをバイト形式に変更します。
- 暗号化
- 復号化
- 復号化されたcontent.decode( 'utf-8')、復号化されたコンテンツが読み取り可能になります。
2.MD5暗号化
広く使用されている暗号化ハッシュ関数であるMD5メッセージダイジェストアルゴリズム(英語:MD5メッセージダイジェストアルゴリズム)は、情報送信を確実にするために128ビット(16バイト)のハッシュ値を生成できます。完全で一貫性があります。
2.1暗号化ルール
MD5アルゴリズムの原理は、次のように簡単に説明できます。MD5コードは512ビットグループを使用して入力情報を処理し、各グループは16個の32ビットサブグループに分割されます。一連の処理の後、アルゴリズムの出力は4つで構成されます。 32ビットパケットで構成されています.4つの32ビットパケットがカスケードされ、128ビットのハッシュ値が生成されます。
2.2アプリケーションシナリオ
-
パスワード管理:一般データベースに保存されているパスワードはすべてMD5で暗号化されています。この種の暗号化には復号化方法はありません。逆方向操作(復号化)ではなく、順方向操作(暗号化)のみを実行できます。したがって、管理者にパスワードを確認するように依頼すると、管理者は次のように通知します。この理由でのみパスワードをリセットできます。MD5には抜け穴がありますが、それでも比較的安全です。
-
電子署名:さまざまなファイルをダウンロードすると、ソフトウェアのダウンロードアドレスに加えて、ダウンロードページに長い文字列が表示されます。この文字列は、実際にはソフトウェアのMD5値です。その機能は、特別なソフトウェア(Windows MD5チェックなど)を使用して、ソフトウェアのダウンロード後にダウンロードしたファイルに対してMD5チェックを実行し、取得したファイルを確認することです。このサイトで提供されているものと同じファイルです。
2.3コード例
- 一般的なMD5暗号化
# 1. md5加密
import hashlib
str = 'I LOVE China! 我爱你中国!'
str_en = str.encode('utf-8')
h = hashlib.md5(str_en)
h_en = h.hexdigest()
print(h_en) # 1c07f68a93ec867b4b315b90f2098b24
- パラメータを使用したMD5暗号化MD5暗号化
は比較的安全ですが、ライブラリによって解読される可能性があります。セキュリティを強化するために、セキュリティを向上させるために別の暗号化を実行するのと同等の別のパラメータを渡すことができます。方法は次のとおりです。
# 增加自己的参数'admin',可以防止撞库破解密码;
str = 'I LOVE China! 我爱你中国!'
str_en = str.encode('utf-8')
h = hashlib.md5(str_en)
h.update('admin'.encode('utf-8'))
h_en = h.hexdigest()
print(h_en)
- ドキュメントを暗号化する
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:Zhang Kai time:2020/10/22
import hashlib
def get_file_md5(f):
str = hashlib.md5()
while True:
data = f.read(10240)
if not data:
break
str.update(data)
return str.hexdigest()
with open(File_Name, 'rb') as f:
file_md5 = get_file_md5(f) # 得到文件对应的加密值,下载结束后,对比此值,即可以判断是否为同一文件;
2.4sha1暗号化
SHA-1(英語:Secure Hash Algorithm 1、中国語名:Secure Hash Algorithm 1)は、MD5に基づいて国家安全保障局によって設計された暗号化ハッシュ関数ですが、MD5よりも安全であり、その使用法はMD5とまったく同じです。次のように:
import hashlib
str = 'I LOVE China! 我爱你中国!'
str_en = str.encode('utf-8')
h = hashlib.sha1(str_en)
h.update('admin'.encode('utf-8'))
h_en = h.hexdigest()
print(h_en) # ab4d75034500b6f6a8a152df7a1f67349ead6606,比MD5多8位;
3.Base64暗号化
Base64は、ネットワーク上で8ビットバイトコードを送信するために使用される最も一般的なエンコード方法の1つです。Base64は、64個の印刷可能な文字に基づいてバイナリデータを表す方法です。Base64エンコーディングは、バイナリから文字へのプロセスであり、HTTP環境でより長い識別情報を転送するために使用できます。Base64エンコーディングは読み取り不能であり、読み取る前にデコードする必要があります。上記の利点により、Base64はコンピューターのさまざまな分野で広く使用されています。
3.1暗号化ルール
- 3バイトを4バイトに変換します。
- 76文字ごとに新しい行の文字を追加します。
- 最終ターミネータも処理する必要があります。
3.2アプリケーションシナリオ
- Thunderによってダウンロードされた専用アドレスリンクは、Base64の「暗号化」を使用します。
- QQ Cycloneは、Base64の「暗号化」も使用します。
注:ここでの暗号化はすべて引用されています。これは、ルールに従ってデータをエンコードし、元々意味のあるコンテンツを、読み取るためにデコードする必要のあるコンテンツにエンコードするため、それほど暗号化されていないためです。
3.3コード例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:Zhang Kai time:2020/10/22
# 2. BASE64
import base64
str = 'I LOVE China! 我爱你中国!'
str_en = str.encode('utf-8')
b64_en= base64.b64encode(str_en)
print(b64_en) # b'SSBMT1ZFIENoaW5hISDmiJHniLHkvaDkuK3lm73vvIE='
b64_de = base64.b64decode(b64_en)
print(b64_de) # b'I LOVE China! \xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'
str_de = b64_de.decode('utf-8')
print(str_de) # I LOVE China! 我爱你中国!
4. AES
Advanced Encryption Standard(英語:Advanced Encryption Standard、略称:AES)は、暗号化ではRijndael暗号化とも呼ばれ、米国連邦政府によって採用されているブロック暗号化標準です。この規格は、元のDESを置き換えるために使用され、多くの関係者によって分析されており、世界中で広く使用されています。2006年、Advanced Encryption Standardは、対称キー暗号化で最も人気のあるアルゴリズムの1つになりました。
4.1暗号化ルール
AESで暗号化されたデータブロックとキーの長さは、128b、192b、および256bのいずれかになります。AES暗号化には、多くの繰り返しと変換があります。一般的な手順は次のとおりです。①キー拡張;②InitialRound;③ラウンド、繰り返される各ラウンドには、サブバイト(SubBytes)、行シフト(ShiftRows)、列が含まれます。ミキシング(MixColurmns)、ラウンドキー追加(AddRoundKey)、①最終ラウンド(最終ラウンド)などの操作。最終ラウンドには列ミキシング操作(MixColumns)はありません。
4.2アプリケーションシナリオ
AESアルゴリズムは、プレーンテキスト送信に適さないパケットを送信するために使用されます。
4.3コード例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:Zhang Kai time:2020/10/22
import base64
from Crypto.Cipher import AES
'''
采用AES对称加密算法
'''
# str不是16的倍数那就补足为16的倍数
def add_to_16(message):
while len(message) % 16 != 0:
message = str(message)
message += '\0'
# message = str(message)
return message # 返回bytes
# 加密方法
def encrypt_oracle(message,key_pri):
'''
加密函数,传入明文 & 秘钥,返回密文;
:param message: 明文
:param key_pri: 秘钥
:return:encrypted 密文
'''
# 初始化加密器
aes = AES.new(add_to_16(key_pri), AES.MODE_ECB)
# 将明文转为 bytes
message_bytes = message.encode('utf-8')
# 长度调整
message_16 = add_to_16(message_bytes)
#先进行aes加密
encrypt_aes = aes.encrypt(message_16)
#用base64转成字符串形式
encrypt_aes_64 = base64.b64encode(encrypt_aes)
return encrypt_aes_64
# 解密方法
def decrypt_oralce(message,key_pri):
'''
解密函数,传入密文 & 秘钥,返回明文;
:param message: 密文
:param key_pri: 秘钥
:return: encrypted 明文
'''
# 初始化加密器
aes = AES.new(add_to_16(key_pri), AES.MODE_ECB)
#优先逆向解密base64成bytes
message_de64 = base64.b64decode(message)
# 解密 aes
message_de64_deaes = aes.decrypt(message_de64)
message_de64_deaes_de = message_de64_deaes.decode('utf-8')
return message_de64_deaes_de
message = 'Tommorrow is another day!over!' # 待加密内容
key_pri = '123456' # 密码
content_en = encrypt_oracle(message,key_pri) # 加密
print('加密后,密文为:',content_en) # 加密后,密文为: b'LbzC28Y/ZIgvQ1SszLrlciocu1D8HNDTcLUaUXvCgvo='
content = decrypt_oralce(content_en,key_pri) # 解密
print('解密后,明文为:',content) # 解密后,明文为: Tommorrow is another day!over!
5.RSA
RSAは、1977年に、Ron Rivest、Adi Shamir、およびLeonardAdlemanによって提案されました。当時、3人全員がMITで働いていました。RSAは、姓の最初の文字で構成されています。
RSA公開鍵暗号システムは、さまざまな暗号化キーと復号化キーを使用する暗号化システムであり、既知の暗号化キーから復号化キーを導出することは計算上実行不可能です。RSAでは、公開鍵のサイズを選択できます。512ビットキーは安全でないと見なされます。768ビットキーは国家安全保障局(NSA)以外の何かによって危険にさらされることを心配する必要はありません。1024ビットキーはほぼ安全です。
5.1暗号化の原則
RSA公開鍵暗号システムの原理は次のとおりです。数値理論によれば、2つの大きな素数を見つけるのは比較的簡単ですが、それらの製品を因数分解することは非常に難しいため、製品を暗号化キーとして公に使用できます。
5.2コード例
# RSA
import rsa
def rsaEncrypt(message):
'''
RSA加密函数
传入需要加密的内容,进行RSA加密,并返回密文 & 私钥 & 公钥
:param message: 需要加密的内容,明文
:return: 密文 & 私钥 & 公钥
'''
key_pub,key_pri = rsa.newkeys(1024)
# print(key_pri)
# print(key_pub)
content = message.encode('utf-8')
crypto = rsa.encrypt(content,key_pub)
return (crypto,key_pri,key_pub)
def rsaDecrypt(message,key_pri):
'''
RSA 解密函数,传入密文 & 私钥,得到明文;
:param message: 密文
:param key_pri: 私钥
:return: 明文
'''
content = rsa.decrypt(message,key_pri)
return content.decode('utf-8')
# 公钥加密,私钥解密
message='I Love China. 我爱你中国!'
print('加密前:',message) # 加密前: I Love China. 我爱你中国!
crypto,key_pri,key_pub = rsaEncrypt(message)
print('加密后:',crypto) # 加密后: b';\x1fT\x0b\xa2\xc2t\x18\xf2z\x85p\t>\xdc@%\xd4\xf3>i1\xae\xe9=\x993>\xed!\xc9?F\xcb\xde\xe1\xa5\xf0\xe9\xde\xc3\x16\xf4W\x19;\x83B\x1c\xa7\xc8k\xc9EB\xdd\x94\xad7\xda\x7f{\xec\x9f\x99\xbfd\x87\xf0d\xbc\xfe\xef_\xd9;\x18s{l\xcb\xd5u\xb7/\xf4FX\xda\xd4\xa1\xe6\xce|\xe0[<\xe4\xe2j\xb9N\xc4\x93\x17\xe7J\xeey\xbd\x1a\xd8.\x0b)\xcb\x98\xc4\x96\xb9b\t\xdc\x18]2\xdfy'
print('秘钥为:',key_pri) # 秘钥为: PrivateKey(115288028345818733754881460912555806638911383959807908842585241310442843853213667112358247839422013848032677508051802527090846065467533765017680180661692630683981532520607475409309404078951405099846021972426884336220213989970308538119345752815652299922371343220268410359092002773721528507791837782603361434249, 65537, 72671372491785063554143583498765474892962268379138876088256082881055042532006497124961953957220544334895981514795123582047544773342223284047871955302686464986848482351432416996957016628407054177594256525025069157980131024957403886435812321512561610952210861350247053560059407031244790602637847816964556926465, 38939822841624334244626968212850549717962185656658548767156085704609096413636024697954233697763690441579951219223510491427663677756196233739375481382535403537584193, 2960671619249966096061431500671042485145295502851556909042124706260452571275538786999969819708964185223862037824834932783401994640273454183045193)
print('公钥为:',key_pub) # 公钥为: PublicKey(115288028345818733754881460912555806638911383959807908842585241310442843853213667112358247839422013848032677508051802527090846065467533765017680180661692630683981532520607475409309404078951405099846021972426884336220213989970308538119345752815652299922371343220268410359092002773721528507791837782603361434249, 65537)
content = rsaDecrypt(crypto,key_pri)
print('明文为:',content) # 明文为: I Love China. 我爱你中国!