zoukankan      html  css  js  c++  java
  • 对于AES和RSA的个人理解

    最近学习爬虫 遇到一些加密的坑 然后了解到了AESRSA  记录一下

    AES

    1.什么是AES

    AES是一种对称的加密算法,运行要求低,不需要计算机有非常高的处理能力和大的内存, 加密速度很快;

    对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。


    2.AES特点

    1.最常用的对称加密算法

    2.密钥建立时间短、灵敏性好、内存需求低

    3.AES加密方式有五种:ECB, CBC, CTR, CFB, OFB;实际使用中,使用工作模式为CTR(最好用CBC去实现),此工作模式需要引入IV参数(16位的字节数组)

    4.密钥长度有三种  分别是128 192 256,最长只有256bit ,其中192与256需要配置无政策限制权限文件(JDK6)

    5.填充模式最常用的两种PKCS5Padding和PKCS7Padding,其中后者只有CBC独有。

    6.加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。

    加密流程图:

    明文p : 没有经过加密的数据

    密钥K:用来加密明文的密码,在对称加密算法中,加密的密钥和解密的密钥是相同的。密钥绝对不能泄露,否则会被获取还原密文,窃取数据

    AES加密函数:  假设AES加密函数为A, 则C = A(K,P), 其中P为明文, K为密钥, C为密文,也就是说把明文和密钥作为加密函数的参数输入,就会加密为密文。

    AES解密函数:假设AES解密函数为B, 则 P = B(K, C), 其中P为明文, K为密钥, C为密文,也就是说把密文和密钥作为解密函数的参数输入,就会解密还原回明文。

    AES CBC加密解密样式代码:

    Windows需要下载pycryptodome包      可以直接用pip install pycryptodome下载

    from binascii import b2a_hex, a2b_hex
    
    from Crypto.Cipher import AES
    
    
    # 如果text不足16位的倍数就用空格补足为16位
    def add_to_16(text):
        if len(text.encode('utf-8')) % 16:
            add = 16 - (len(text.encode('utf-8')) % 16)
        else:
            add = 0
        text = text + ('' * add)
        return text.encode('utf-8')
    
    
    def encrypt(text):  # 加密函数
        key = '9999999999999999'.encode('utf-8')
        mode = AES.MODE_CBC
        iv = b'qqqqqqqqqqqqqqqq'
        text = add_to_16(text)
        cryptos = AES.new(key, mode, iv)
        cipher_text = cryptos.encrypt(text)
        # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
        return b2a_hex(cipher_text)
    
    
    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(text):  # 解密函数
        key = '9999999999999999'.encode('utf-8')
        iv = b'qqqqqqqqqqqqqqqq'
        mode = AES.MODE_CBC
        cryptos = AES.new(key, mode, iv)
        plain_text = cryptos.decrypt(a2b_hex(text))
        return bytes.decode(plain_text).rstrip('')
    
    
    a = encrypt('1234567')  # 返回加密后的数据
    b = decrypt(a)  # 解密后的数据
    print(a)
    print(b)
    View Code

    RSA

    1.什么是RSA

    RSA是一种非对称加密算法,其加密方式比较特殊,需要两个密钥:公开密钥简称公钥(publickey)和私有密钥简称私钥(privatekey)。公钥加密,私钥解密;私钥加密,公钥解密。在移动开发中:公钥置于移动端,私钥置于服务端。
     

    RSA 加密原理

    步骤说明描述备注
    1 找出质数 P 、Q -
    2 计算公共模数 N = P * Q -
    3 欧拉函数 φ(N) = (P-1)(Q-1) -
    4 计算公钥E 1 < E < φ(N) E的取值必须是整数
    E 和 φ(N) 必须是互质数
    5 计算私钥D E * D % φ(N) = 1 -
    6 加密 C = M E mod N C:密文 M:明文
    7 解密 M =C D mod N C:密文 M:明文

    公钥=(E , N) 
    私钥=(D, N)

    对外,只暴露公钥。

     
    公钥加密-私钥解密流程图:
     
    私钥加密-公钥解密流程图:

     RSA加解密样式代码:

    需要下载rsa, pip install ras 下载

    import rsa
    
    
    # rsa加密
    def rsaEncrypt(str):
        # 生成公钥、私钥
        (pubkey, privkey) = rsa.newkeys(512)
        # print("公钥:
    %s
    私钥:
    :%s" % (pubkey, privkey))
        # 明文编码格式
        content = str.encode("utf-8")
        # 公钥加密
        crypto = rsa.encrypt(content, pubkey)
        return (crypto, privkey)
    
    
    # rsa解密
    def rsaDecrypt(str, pk):
        # 私钥解密
        content = rsa.decrypt(str, pk)
        con = content.decode("utf-8")
        return con
    
    
    if __name__ == "__main__":
        str, pk = rsaEncrypt("hello")
        print("加密后密文:
    %s" % str)
        content = rsaDecrypt(str, pk)
        print("解密后明文:
    %s" % content)
    View Code

    AES和RSA的效率问题:

    RSA:解密速度随加密文件大小呈线性增长,远远低于加密速度
    AES:加密后的文件大小两倍于源文件,解密速度两倍于加密速度,当文件过大时可能会对内存造成影响,需要另行处理

    ____________________________________________________________________________________________________________

                                  

  • 相关阅读:
    python中可变类型和不可变类型
    python PEP8开发规范
    pandas之——Series常用总结
    python os 模块的使用
    Markdown语法
    HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查
    MySQL union all排序问题
    mysql解决datetime与timestamp精确到毫秒的问题
    keepalived + nginx实现高可用
    配置文件keepalived.conf详解
  • 原文地址:https://www.cnblogs.com/yanzhongyixu/p/13348244.html
Copyright © 2011-2022 走看看