加密解密实践

  • 使用密码学要达到的目的

保密性:防止用户的标识或数据被读取。

数据完整性:防止数据被更改。

身份验证:确保数据发自特定的一方。

  • 加密算法分类

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥

发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。

相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。

常见的对称加密算法:DES,AES,3DES等等

  • 对称加密算法:

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥

发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。

相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。

常见的对称加密算法:DES,AES,3DES等等

  • 非对称加密算法

文件加密需要公开密钥(publickey)和私有密钥(privatekey)。

接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。

在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。

非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。

非对称加密算法:RSA、DSA、ECC等算法

  • 消息摘要算法:

消息摘要算法可以验证信息是否被篡改。

在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。

接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。

 

  • Python加密库

使用以下pip 命令:

pip install pycryptodome
pip 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)

  

 

posted @ 2021-02-21 22:48  妇愁者纞萌  阅读(113)  评论(0编辑  收藏  举报