zoukankan      html  css  js  c++  java
  • 加密解密实践

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

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

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

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

    • 加密算法分类

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

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

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

    常见的对称加密算法: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)
    

      

  • 相关阅读:
    IP地址分类整理
    PHP
    [转载]数组的全排列问题
    使用 Homebrew 安装 Git
    Homebrew简介及安装
    iOS开发~CocoaPods使用详细说明
    关于目前自己iOS项目使用的第三方开源库
    IOS 时间格式 时间转换 大总结
    Xcode磁盘空间大清理
    Swift百万线程攻破单例(Singleton)模式
  • 原文地址:https://www.cnblogs.com/fczlm/p/14424350.html
Copyright © 2011-2022 走看看