データは、ネットワーク送信時に暗号化されます。一般的な暗号化アルゴリズムは次のとおりです。
1.md5
1.文字列md5
import hashlib
if __name__ == '__main__':
username = "test"
username_md5 = hashlib.md5(username.encode(encoding='UTF-8')).hexdigest()
print(username_md5)
hashlibには、shaのさまざまな暗号化方式もあり、呼び出しはmd5と同じです。md5をsha1に置き換えるだけで、自分で試すことができます。
2.ファイルmd5
import hashlib
if __name__ == '__main__':
username = "./test.txt"
m = hashlib.md5()
n = 1024 * 4
inp = open(username, 'rb')
while True:
buf = inp.read(n)
if buf:
m.update(buf)
else:
break
print(m.hexdigest())
2.base64
Base64暗号化方式
import base64
if __name__ == '__main__':
username = "test"
username_encode = base64.b64encode(username.encode(encoding='UTF-8'))
print(username_encode)
username_decode = base64.b64decode(username_encode)
print(username_decode)
3.AES
- 秘密鍵:暗号化するときに秘密鍵を使用し、復号化するときに復号化するには同じ秘密鍵が必要です
- プレーンテキスト:暗号化する必要があるパラメーター
- モード:aes暗号化で一般的に使用されるECBおよびCBCモード(私はこれら2つのモードのみを使用しました。他のモードもあります)
- ivオフセット:このパラメーターはECBモードでは不要ですが、AESモードでは必須です。
- AES CBC暗号化:
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
if len(text.encode('utf-8')) % 16:
add = 16 - (len(text.encode('utf-8')) % 16)
else:
add = 0
text = text + ('\0' * add)
return text.encode('utf-8')
# 加密函数
def encrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_CBC
iv = b'qqqqqqqqqqqqqqqq'
text = add_to_16(text)
cryptos = AES.new(key, mode, iv)
cipher_text = cryptos.encrypt(text)
# 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
return b2a_hex(cipher_text)
# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
key = '9999999999999999'.encode('utf-8')
iv = b'qqqqqqqqqqqqqqqq'
mode = AES.MODE_CBC
cryptos = AES.new(key, mode, iv)
plain_text = cryptos.decrypt(a2b_hex(text))
return bytes.decode(plain_text).rstrip('\0')
if __name__ == '__main__':
e = encrypt("hello world") # 加密
d = decrypt(e) # 解密
print("加密:", e)
print("解密:", d)
2.AES ECB暗号化
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
def add_to_16(text):
if len(text.encode('utf-8')) % 16:
add = 16 - (len(text.encode('utf-8')) % 16)
else:
add = 0
text = text + ('\0' * add)
return text.encode('utf-8')
# 加密函数
def encrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_ECB
text = add_to_16(text)
cryptos = AES.new(key, mode)
cipher_text = cryptos.encrypt(text)
return b2a_hex(cipher_text)
# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
key = '9999999999999999'.encode('utf-8')
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
plain_text = cryptor.decrypt(a2b_hex(text))
return bytes.decode(plain_text).rstrip('\0')
if __name__ == '__main__':
e = encrypt("hello world") # 加密
d = decrypt(e) # 解密
print("加密:", e)
print("解密:", d)
4.もし
rsaの暗号化と復号化には公開鍵と秘密鍵が必要です。通常、クライアントは暗号化に公開鍵を使用し、サーバーは復号化に秘密鍵を使用して正当性を確認します。
上記の2つのコマンドをubuntuで実行して、private.keyとpublic.keyの2つのファイルを生成します。
openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key
次のように、上記の2つのファイルを暗号化および復号化テストに使用します。
import rsa
if __name__ == '__main__':
username = "test"
with open("./public.key", mode="rb") as f:
public_key = f.read()
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
username_rsa = rsa.encrypt(username.encode(), pubkey)
print(username_rsa.hex())
print(len(username_rsa))
with open("./private.key", mode="rb") as f:
private_key = f.read()
prikey = rsa.PrivateKey.load_pkcs1(private_key)
username = rsa.decrypt(username_rsa, prikey)
print(username)