常用加密算法的python实现
0 背景
很多时候, 出于数据安全的角度考虑, 在信息传输的过程中, 需要对敏感的数据进行加密处理,防止数据泄露。比如姓名、手机号、身份证号(简称三要素)。
本文主要使用python实现一些加密算法, 以便于在一些场景中更快速的使用。
常用的加密算法可以分为以下几种:
哈希算法
如MD5、SHA1、SHA256算法等, 这种加密方式将原始数据, 转换为固定长度的散列值。这是一种消息摘要算法, 一种单向加密的过程, 就是数据一旦被加密, 就不能还原成原来的数据.
对称加密算法
像AES、DES等算法, 在加密和解密的过程中, 是使用相同的密钥进行数据的加密和解密。这个密钥通常被称为”对称密钥”或”共享密钥”。
非对称加密算法
像RSA、DSA等算法, 在加密和解密的过程中, 分别使用不同的密钥进行数据的加密和解密, 这两个密钥分别是公钥和私钥,这两个密钥是相关联的,但彼此不同。通常, 一个是公钥,用来公开分享,用于数据的加密, 另一个是私钥,自己保密, 不让别人知道, 用来进行数据的解密.
1 算法实现
md5
https://zhuanlan.zhihu.com/p/469144746
from hashlib import md5
def encrypt_md5(text):
m = md5()
m.update(text.encode())
return m.hexdigest()
或者
from hashlib import md5
md5('orange'.encode()).hexdigest()
# 'fe01d67a002dfa0f3ac084298142eccd'
或者
from hashlib import new
new('md5', '123'.encode()).hexdigest()
# 'fe01d67a002dfa0f3ac084298142eccd'
sha256
from hashlib import sha256
text = 'orange'
a = sha256(text.encode()).hexdigest()
# 1b4c9133da73a711322404314402765ab0d23fd362a167d6f0c65bb215113d94
base64
加密
from base64 import b64encode
def encrypt_base64(text):
return b64encode(text.encode()).decode()
解密
from base64 import b64decode
def decrypt_base64(text):
return b64decode(text.encode()).decode()
aes
AES mode
1 AES.MODE_ECB
3 AES.MODE_CFB
2 AES.MODE_CBC
8 AES.MODE_CCM
6 AES.MODE_CTR
9 AES.MODE_EAX
11 AES.MODE_GCM
12 AES.MODE_OCB
5 AES.MODE_OFB
10 AES.MODE_SIV
7 AES.MODE_OPENPGP
https://blog.csdn.net/qq_37144341/article/details/128371555
key
, text
都必须是16位的倍数
加密
不能用encodebytes!否则会每76个字符增加一个换行符,见:https://docs.python.org/zh-cn/3/library/base64.html
from Crypto.Cipher import AES
from base64 import encodebytes
def encrypt_aes(key, text):
app = AES.new(key.encode(), AES.MODE_ECB)
textEncrypt = encodebytes(app.encrypt(text.encode())).decode().strip()
# textEncrypt = b64encode(app.encrypt(text.encode())).decode().strip()
return textEncrypt
解密
from Crypto.Cipher import AES
from base64 import encodebytes, b64decode
def decrypt_aes(key,text):
app = AES.new(key.encode(),AES.MODE_ECB)
return app.decrypt(b64decode(text.encode())).decode()
填充
https://zhuanlan.zhihu.com/p/23276413
pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
pad = lambda x: x.encode() + b' ' * (16 - len(s) % 16)
from cryptography.hazmat.primitives import padding
from Crypto.Util import Padding
print(Padding.pad('aaaa'.encode(),16,'pkcs7'))
print(Padding.unpad(b'aaaax0cx0cx0cx0cx0cx0cx0cx0cx0cx0cx0cx0c',16,'pkcs7'))
iv值
https://www.runoob.com/python/python-func-chr.html
chr()
函数用法
In [101]: chr(1)
Out[101]: 'x01'
In [102]: chr(0)
Out[102]: 'x00'
In [103]: chr(9)
Out[103]: 't'
In [104]: chr(10)
Out[104]: 'n'
In [105]: chr(11)
Out[105]: 'x0b'
In [106]: chr(12)
Out[106]: 'x0c'
In [108]: chr(16)
Out[108]: 'x10'
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB
。从安全性角度推荐CBC加密方法,本文介绍了CBC
,ECB
两种加密方法的python实现。
CBC 和ECB模式的区别就是:
-
CBC加密需要一个 十六位的key
(密钥)和一个十六位iv
(偏移量) -
ECB加密不需要iv,只需要key(密钥)
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
def encrypt_aes(key,iv,text):
app = AES.new(key.encode(), AES.MODE_ECB, iv.encode())
textEncrypt = b64encode(app.encrypt(text.encode())).decode().strip()
return textEncrypt
def decrypt_aes(key,iv,text):
app = AES.new(key.encode(),AES.MODE_ECB, iv.encode())
return app.decrypt(b64decode(text.encode())).decode()
binascii
https://blog.csdn.net/iteye_20905/article/details/82642417
b2a_hex
: 将编码的字符串转换为16进制字节:b'e7613776fecc6db38d45ce9c0fe85bc5'
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
def encrypt_aes1(key,iv,text):
app = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
textEncrypt = b2a_hex(app.encrypt(text.encode())).decode()
return textEncrypt
# key = '1234567890abcdef'
# text = '1234567890aaaaaa'
# # textDescrypt = '52E3dv7MbbONRc6cD+hbxQ=='
# textDescrypt = 'e7613776fecc6db38d45ce9c0fe85bc5'
def decrypt_aes1(key,iv,text):
app = AES.new(key.encode(),AES.MODE_CBC, iv.encode())
return app.decrypt(a2b_hex(text.encode())).decode()
print(encrypt_aes1(key,key,text))
print(decrypt_aes1(key,key,textDescrypt))
rsa
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto import Random
from Crypto.PublicKey import RSA
def create_keys():
app = RSA.generate(2048)
keyPublic = app.public_key().export_key().decode()
keyPrivate = app.export_key('PEM').decode()
print(keyPrivate,keyPublic,sep='n')
# create_keys()
keyPublic = '''
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwM8V/KzcLL9Kz+SQa73D
8qC845upKFDbzOXQCK5IrlR52fGSH2uD36ZviGBP0IPGDjhnmJvdc+xvYSvvAYhK
H/cDCcDL580zB6LN81KuMcfPfwaUgprmmkNICtiI+HL9XdKB4W/U9ronJ80DfeJq
fDdZ/0y+ua7T8v0MjaAviryHtsuB6vIhuFvwD5WmJx+B/qBTNmmGhZNt1wNXSA0S
VfX5rImb2Zt030HgmrUSqDVKTgU5/B81kBRbgwTtGk4u+JHNC0+lk9xWakTC7YmO
1ICVP1hxJ935PmuNJaKaFxvDBWCpmoJ40/BvoL26MlfUAffZyWs26K+lvDWjpudi
JQIDAQAB
-----END PUBLIC KEY-----
'''.strip()
keyPrivate = '''
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwM8V/KzcLL9Kz+SQa73D8qC845upKFDbzOXQCK5IrlR52fGS
H2uD36ZviGBP0IPGDjhnmJvdc+xvYSvvAYhKH/cDCcDL580zB6LN81KuMcfPfwaU
gprmmkNICtiI+HL9XdKB4W/U9ronJ80DfeJqfDdZ/0y+ua7T8v0MjaAviryHtsuB
6vIhuFvwD5WmJx+B/qBTNmmGhZNt1wNXSA0SVfX5rImb2Zt030HgmrUSqDVKTgU5
/B81kBRbgwTtGk4u+JHNC0+lk9xWakTC7YmO1ICVP1hxJ935PmuNJaKaFxvDBWCp
moJ40/BvoL26MlfUAffZyWs26K+lvDWjpudiJQIDAQABAoIBAAFd1mGOlhbpGi4k
CBQDac6f7gbM9SN4gz5OCK3vEkvOBHkTeb4oRGyC4Pp9+ELZlD9Ijg9qV2T5cYam
SZDgtunIFejtSWSwsyJkOIJ3fQ2URXe4g7fzQhwoyutswnfEVOBj3BDNepxvEFT7
YoFzZ97Og6BIGnf1ccIgogSk9IFOtpwlqYb3v0RveNo9TbVKXh51pGPumWD0jKrO
o5G9P7TMw89QIpFLvuTzFmm6RYmexxspJZtqH1uR9sB6BV/HOQmJuERCkcQnCUBP
HUQLFVYn4AnH8/Bbq4wClJ09zwIXTSzN7krZJh12J3IfDBi5POY7mmJbeXWJzy/Q
k9KaWwECgYEAy1zMLKJvVRamG3C9Fv+LyQ+Ckv3B+45FekMw5u9zMgKe5ibhys9V
4cgiPGoR4Q36asfhdQvXtctuhYd1r6ZIB88njhaAgsAeVsw/63gN8W9GAZPK6hXx
l0zE9yVOworjDuLlryTB1YIdFQgBMtIWHr0at0y5OeOTVBF9JG8AwYECgYEA8rb9
CFQ1gvSF/8SDKbHec0+yFm6rx9YALLLKyoXk3CpL/kK5PjO1n+8tOEUz/q65O5i9
HIjQ2yZL0vv11R/sWf9jMFzJnDqjC9PUBn5iVD0nu0Px/Ncq/Pzg7+8CaacOZUPD
8yQ3s8rtCFOSzGTBxzJmTTi1ZXO9ZoqcCbprqqUCgYEApiqnMnlvmwkspRNTjm00
nQ8tVEpArPmtT5+DX8+cQurdR5XRvVP5CsnrH45UGZ7AVWwJjwgkNAmLv1PWF7Y4
+RiNa457Z1rv72Bpgk/QpMyVWUiX7voLM+OotYEof9HYghtoLdpM/9aXSM4HnK0J
IgjGwavRVbnccj7wEEsbRQECgYEAt2Cv3loZL/7lOu/TFW5wnnipGa+2E77I1Pyk
oMz2s601Sz5ITQmugM6pQKlwdky2YKOuxd9MxTay9Q4ulz6OSRTecQy5ulLHG0mJ
GPrl+bVWznKwYxKCRTAeFsli7kYsZzAC3TIQ78MywSa7c7fwfDrE9jURQDxo7g9t
gyAY9o0CgYAFMZmZPCMBeVVG+cWBYgzSnCV53FHBV6Us7B3BynbsLXJR0sV6mm87
TVnKO9yhru5GnXAWs9L3esT0OKgVPVL//y9n7XWqDy02mOxzAQd5yJJk7LxaBC/U
1fZj1OitsPEpFI0XL1DoIHM0SK6rwwAXcnewVhBjFDyxgBOnOgI0dQ==
-----END RSA PRIVATE KEY-----
'''.strip()
text = 'oufengdjsdjsakldasj1893271的哈'
def encrypt(keyPublic:str,text:str):
obj = PKCS1_v1_5.new(RSA.import_key(keyPublic.encode()))
textEncrypt = obj.encrypt(text.encode())
return base64.b64encode(textEncrypt).decode()
def decrypt(keyPrivate:str,text:str):
app = PKCS1_v1_5.new(RSA.import_key(keyPrivate.encode()))
textDecrypt = app.decrypt(base64.b64decode(text.encode()),Random.new().read).decode()
return textDecrypt
textEncrypt = encrypt(keyPublic,text)
print(textEncrypt)
textDecrypt = decrypt(keyPrivate,textEncrypt)
print(textDecrypt)
2 关于
欢迎关注我的微信公众号
原文始发于微信公众号(其之):常用加密算法的python实现
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204890.html