常用加密算法的python实现

常用加密算法的python实现

0 背景

很多时候, 出于数据安全的角度考虑, 在信息传输的过程中, 需要对敏感的数据进行加密处理,防止数据泄露。比如姓名、手机号、身份证号(简称三要素)。

本文主要使用python实现一些加密算法, 以便于在一些场景中更快速的使用。

常用的加密算法可以分为以下几种:

哈希算法

MD5SHA1SHA256算法等, 这种加密方式将原始数据, 转换为固定长度的散列值。这是一种消息摘要算法, 一种单向加密的过程, 就是数据一旦被加密, 就不能还原成原来的数据.

对称加密算法

AESDES等算法, 在加密和解密的过程中, 是使用相同的密钥进行数据的加密和解密。这个密钥通常被称为”对称密钥”或”共享密钥”。

非对称加密算法

RSADSA等算法, 在加密和解密的过程中, 分别使用不同的密钥进行数据的加密和解密, 这两个密钥分别是公钥和私钥,这两个密钥是相关联的,但彼此不同。通常, 一个是公钥,用来公开分享,用于数据的加密, 另一个是私钥,自己保密, 不让别人知道, 用来进行数据的解密.

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!