Python 运维python热爱者python基础

AES加密的Python实现

2017-12-06  本文已影响50人  码农小杨

AES加密原理见文章尾部推荐博客
具体代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
import hashlib
PADDING = '\0'

# 去除填充
def _unpadding(str):
    l = len(str)
    if l == 0 :
        return str
    asc = ord(str[-1])
    if asc >= 16:
        return str
    return str[0:-asc]

# 填充
def _padding(data):
    length = 16 - (len(data.encode('utf-8')) % 16)
    data += chr(length)*length
    return data

def _cipher(key):
    iv = '0123456789ABCDEF'
    m2 = hashlib.md5()
    m2.update(key.encode('utf-8'))
    return AES.new(key=m2.digest(), mode=AES.MODE_CBC, IV=iv)

class EncryptHelper:
    def __init__(self):
        pass

    @staticmethod
    def encrypt(plain_text, key):
        data=_cipher(key).encrypt(_padding(plain_text))
        return str(base64.b64encode(data),'utf-8')

    @staticmethod
    def decrypt(encrypted_text, key):
        data = base64.b64decode(encrypted_text)
        bytes= _cipher(key).decrypt(data)
        blank=str(bytes,'utf-8').strip()
        return _unpadding(blank)

这里有两个函数解释一下:

chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。

ord()函数以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。
如果所给的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常。

关于AES加密推荐博客:
首推博客文章(详细介绍了AES的加密原理):
http://www.dannysite.com/blog/213/
一篇较新的博客:
http://www.xnathan.com/2017/04/23/aes-encryption/
参考博客:
http://blog.csdn.net/leak235/article/details/50466213
AES加密原理图:
http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html

如何AES使用Python / PyCrypto以OpenSSL兼容的方式加密:
https://codeday.me/bug/20170910/69468.html

上一篇下一篇

猜你喜欢

热点阅读