python实现aes加密解密

引子:

   在windows中python3使用  pycryptodemo 模块实现Aes加密解密。Aes加密有多种方式,自己可以上网了解下。 AES是每16位一加密,并且保证key和vi都是16位的。废话不多说直接上代码。

import base64
from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex

class PrpCrypt(object):
    def __init__(self,key,iv):
        self.key=key.encode(‘utf-8‘)
        self.mode=AES.MODE_CBC
        self.iv=iv.encode(‘utf-8‘)

    def pad_byte(self, b):
        ‘‘‘
        1 先计算所传入bytes类型文本与16的余数
        2 在将此余数转成bytes 当然用0补位也可以
        3 已知了 余数 那么就用余数*被转成的余数,就得到了需要补全的bytes
        4 拼接原有文本和补位
        :param b: bytes类型的文本
        :return: 返回补全后的bytes文本
        ‘‘‘
        bytes_num_to_pad = AES.block_size - (len(b) % AES.block_size)
        # python3 中默认unicode转码
        # 实际上byte_to_pad 就已经 将 数字转成了unicode 对应的字符
        # 后边解密的匿名函数 拿到最后一个数字后,就知道应该截取的长度,在反着切片就行了
        # 这样保证了数据的完整性
        byte_to_pad = bytes([bytes_num_to_pad])
        padding = byte_to_pad * bytes_num_to_pad
        padded = b + padding
        return padded

    def encrypt(self,text):
        ‘‘‘
        1 先生成aes实例
        2 对传入的text转成bytes
        3 对传入的text补全
        4 调用encrypt 加密 得到密文
        5 先将密文转16进制,在将16进制用base64转码,然后在将得到的base64解码
        其实在步骤4 就已经完成了aes加密,我所在的公司加密比较复杂 ,需要的可以直接返回步骤4的值

        :param text:
        :return:
        ‘‘‘
        cryptor = AES.new(self.key,self.mode,self.iv)
        text = text.encode(‘utf-8‘)
        text = self.pad_byte(text)
        self.ciphertext = cryptor.encrypt(text)
        cryptbase64 = base64.b64encode(b2a_hex(self.ciphertext)).decode(‘utf8‘)
        return cryptbase64

    def decrypt(self,text):
        ‘‘‘
        解密和加密的顺序是相反的
        1 定义匿名函数,去掉补位
        2 base64解码
        3 生成aes实例
        4 16进制转2进制
        5 使用decrypt解码  得到补全的bytes类型明文

        :param text:
        :return:  解密且去掉补位的明文
        ‘‘‘
        unpad = lambda s: s[:-ord(s[len(s) - 1:])]
        base64Str = base64.b64decode(text.encode(‘utf8‘))
        cryptor = AES.new(self.key, self.mode, self.iv)
        aesStr = cryptor.decrypt(a2b_hex(base64Str))
        aesStr = str(unpad(aesStr), encoding=‘utf8‘)
        return aesStr

if __name__ == ‘__main__‘:
    data=‘sadfsasdgsdfgdsf123‘
    pc=PrpCrypt(‘daajanbaqa654321‘,‘1234567890123456‘)
    redata = pc.encrypt(data)
    print(redata)
    result=pc.decrypt(redata)
    print(result)

  思路:

      这里引用一句前辈的话,思路很重要。具体的怎么实现反而在其次。

      1 因为Aes是按照16位加密的,key和iv都好说,可以直接设置成定长的16位。

      2 因为传入的数据和传回的数据不是定长的,所以加密的时候要先判断是否是16位的倍数,如果不够那么就补全。

      3 问题是对端拿到数据后怎么知道从哪里截取。

        1 在对传入数据做是否16位判断的时候,你就知道了要补多少位,将这个数字转成bytes类型,python3中默认unicode码。

        2 对端拿到数据后,先截取最后一位,在根据unicode转成对应数字,那么对端就知道了从哪开始截取。

        3 看下unicode和utf8的关系,utf8是unicode实现的一种方式

原文地址:https://www.cnblogs.com/yuan-x/p/12361500.html

时间: 2024-10-27 02:55:27

python实现aes加密解密的相关文章

python 实现aes加密解密 ecb模式和其他模式

ecb模式:(这种不需要偏移向量iv,安全性较低,代码出处忘了) # -*- coding=utf-8-*- from Crypto.Cipher import AES import os from Crypto import Random import base64 from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex """ aes加密算法 ECB模式 """

非对称技术栈实现AES加密解密

非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的,这就要求在前端和后端不同的技术栈上完成信息的加密解密.当然我们通常完成这样专业的功能都会考虑使用相应的框架或者程序库来完成功能,前端或者NodeJS平台通常是JavaScript语言,JavaScript主流的加密解密库分别是SjclJS和CryptoJS, 本文以CryptoJS为例进行讨论.另

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

AES加密解密&amp;amp;&amp;amp;SHA1、SHA加密&amp;amp;&amp;amp;MD5加密

AES加密解密 SHA1.SHA加密 MD5加密 二话不说立即附上代码: package com.luo.util; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.

java使用AES加密解密 AES-128-ECB加密

http://www.cnblogs.com/chen-lhx/p/5817161.html ************************************************* import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * * @author Administrator * */ pub

C# AES加密解密

完整代码: /****************************************************************** * 创建人:HTL * 创建时间:2015-04-17 17:36:35 * 说明:C# AES加密解密 * Email:[email protected] *******************************************************************//* using System; using System

JAVA中使用AES加密解密

技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info("[rsaTest获取请求:{}]", str); try { String encryptResult = AESUtil.encrypt(str, "123456"); log.info("[AES加密后的参数为:{}]", encryptResult

Java 关于密码处理的工具类[MD5编码][AES加密/解密]

项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从编码后的字符串反推回去的. MD5的方法是基于散列的.本身信息不全.理论上是不能还原成唯一字符串的. 网上所谓的解密,也只是拥有一个足够大的字典映射,将编码前的源字符和编码后的目标字符关联起来而已,大多数常见的还行,复杂点的估计就会话费很长时间,有兴趣的可以试试. 至于MD5的用法,在初次录入的时候

ruby AES加密解密

最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以就自己写了加密解密方法. AES 加密 def aes_encrypt(key, encrypted_string) aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB") aes.encrypt aes.key = key txt = aes.u