加密算法分类
严格意义上加密算法分为
- 对称加密算法
- 非对称加密算法
由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码
- 不可逆加密算法–hash(散列)算法
不可逆加密
不可逆加密算法的特征是加密过程中不需要使用密钥,
输入明文后由系统直接经过加密算法处理成密文,
这种加密后的数据是无法被解密的,
只有重新输入明文,
并再次经过同样不可逆的加密算法处理,
得到相同的加密密文并被系统重新识别后,
才能真正解密。
Hash(散列)函数
简介
所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。
但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,
但也可能不同,这种情况称为“散列碰撞(collision)”,这通常是两个不同长度的输入值,刻意计算出相同的输出值。
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
典型的散列函数都有非常大的定义域,比如SHA-2最高接受(264-1)/8长度的字节字符串。
同时散列函数一定有着有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的单射。
在密码学中,散列函数必须具有不可逆性。
md5信息摘要算法简单举例
import hashlib
import random
import string
def pwd():
ran_str = ''.join(random.sample(string.printable, 8))
return hashlib.md5(ran_str.encode(encoding='utf-8')).hexdigest()
print(pwd())
对称加密
简介
对称密钥算法又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。
这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。
事实上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通信联系。
与公开密钥加密相比,要求双方获取相同的密钥是对称密钥加密的主要缺点之一。
常见的对称加密算法有AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6、Camellia。
对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。
AES-ECB加密简单举例
from Crypto.Cipher import AES
import base64
BLOCK_SIZE = 16 # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
def aesEncrypt(key, data):
"""
AES的ECB模式加密方法
:param key: 密钥
:param data:被加密字符串(明文)
:return:密文
"""
key = key.encode('utf-8')
# 字符串补位
data = pad(data)
cipher = AES.new(key, AES.MODE_ECB)
# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
result = cipher.encrypt(data.encode())
encodestrs = base64.b64encode(result)
enctext = encodestrs.decode('utf-8')
print(enctext)
return enctext
def aesDecrypt(key, data):
"""
:param key: 密钥
:param data: 加密后的数据(密文)
:return:明文
"""
data = base64.b64decode(data)
cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
# 去补位
text_decrypted = unpad(cipher.decrypt(data))
text_decrypted = text_decrypted.decode('utf-8')
print(text_decrypted)
return text_decrypted
if __name__ == '__main__':
key = '20211222cphjklge' # 密钥字节长度为16
data = 'hello world'
ecdata = aesEncrypt(key, data)
aesDecrypt(key, ecdata)
输出
0axWDldqSWWyaWA1fvfqxQ==
hello world
非对称加密
简介
公开密钥密码学也称非对称式密码学是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;
公钥用作加密,私钥则用作解密。
使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。
由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。
公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。
基于公开密钥加密的特性,它还能提供数字签名的功能,使电子文件可以得到如同在纸本文件上亲笔签署的效果。
公开密钥基础建设透过信任数字证书认证机构的根证书、及其使用公开密钥加密作数字签名核发的公开密钥认证,形成信任链架构,已在TLS实现并在万维网的HTTP以HTTPS、在电子邮件的SMTP以SMTPS或STARTTLS引入。
rsa加密简单举例
import rsa
def rsa_encrypt(plaintext):
'''
输入明文、生成公钥、私钥
公钥对明文进行加密、字符串加密
:return:加密结果及私钥
'''
pub_key, priv_key = rsa.newkeys(1024)
print(pub_key)
print(priv_key)
plaintext = plaintext.encode() #the message to encrypt. Must be a byte string no longer than``k-11`` bytes
ciphertext = rsa.encrypt(plaintext, pub_key)
print('加密后:', ciphertext)
return ciphertext, priv_key
def rsa_decrypt(ciphertext, priv_key):
'''
传参私钥和加密的明文
:param ciphertext:
:param priv_key:
:return:解密结果
'''
plaintext = rsa.decrypt(ciphertext, priv_key)
plaintext = plaintext.decode()
print('解密后:', plaintext)
if __name__ == '__main__':
plaintext = input("输入明文:\n").strip()
ciphertext, priv_key = rsa_encrypt(plaintext)
rsa_decrypt(ciphertext, priv_key)