使用密码学要达到的目的
保密性:防止用户的标识或数据被读取。
数据完整性:防止数据被更改。
身份验证:确保数据发自特定的一方。
加密算法分类
对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥
发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。
常见的对称加密算法:DES,AES,3DES等等
对称加密算法:
对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥
发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。
常见的对称加密算法:DES,AES,3DES等等
非对称加密算法
文件加密需要公开密钥(publickey)和私有密钥(privatekey)。
接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。
在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。
非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。
非对称加密算法:RSA、DSA、ECC等算法
消息摘要算法:
消息摘要算法可以验证信息是否被篡改。
在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。
接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。
Python加密库
使用以下pip 命令:
pip install pycryptodomepip install rsa
DES对称加密实践
from Crypto.Cipher import DES ''' 入口参数有三个:Key、Data、Mode Key为7个字节共56位,是DES算法的工作密钥; Data为8个字节64位,是要被加密或被解密的数据; Mode为DES的工作方式,有两种:加密或解密 ''' def desTest(key,data,model): des = DES.new(key, DES.MODE_ECB) #加密文本必须为8的倍数,不够补足 if model=="encryption": while len(data) % 8 != 0: data += " " encrypt_data = des.encrypt(data.encode('utf-8')) return encrypt_data if model=="decryption": decrypt_data=des.decrypt(data).decode().rstrip(' ') return decrypt_data if __name__=="__main__": # 密钥 8位或16位,必须为bytes encrypt_data=desTest(b'12345678',"Hello World!","encryption") decrypt_data=desTest(b'12345678',encrypt_data,"decryption") print(encrypt_data) print(decrypt_data)
AES对称加密实践
from Cryptodome.Cipher import AES from binascii import b2a_hex, a2b_hex def aesTest(key,data,model): # 加密内容需要长达16位字符,所以进行空格拼接 while len(data)%16!=0: data+=" " # 加密秘钥需要长达16位字符,所以进行空格拼接 while len(key) % 16 != 0: key += ' ' aes = AES.new(key.encode(), AES.MODE_ECB) if model=="encryption": encrypt_data=aes.encrypt(data.encode()) encrypt_data_hex=b2a_hex(encrypt_data) return encrypt_data_hex if model=="decryption": decrypt_data=str(aes.decrypt(a2b_hex(data)), encoding='utf-8',errors="ignore") return decrypt_data if __name__=="__main__": encrypt_data=aesTest("1234567889","hello world!!!","encryption") decrypt_data=aesTest("1234567889",encrypt_data,"decryption") print (encrypt_data) print(decrypt_data)
RSA非对称加密实践
import rsa from binascii import b2a_hex, a2b_hex def rsaEncryption(pubkey,data): encrypt_data=rsa.encrypt(data.encode(),pubkey) encrypt_data_hex=b2a_hex(encrypt_data) return encrypt_data_hex def rsaDecryption(prikey,encrypt_data): return rsa.decrypt(a2b_hex(encrypt_data), prikey) if __name__=="__main__": pubkey, prikey = rsa.newkeys(258) encrypt_data=rsaEncryption(pubkey,"hello world!!!!!!!") decrypt_data=rsaDecryption(prikey,encrypt_data) print (encrypt_data) print (decrypt_data)