当前位置:   article > 正文

AES加解密_aes在线计算

aes在线计算

AES加解密

1. 什么是AES

  • 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准,简而言之就是一种十分安全,基本无法破解的加密算法。

2. AES 相关特性

  • 要学会正确使用AES算法加解密,只需要弄懂如下几个特性即可:

2.1 填充模式

  • AES加密是对称加密,支持长度有 128, 192, 256 bit 共3种, 分别表示密钥的长度为16byte, 24byte和 32byte。
  • AES的加密方式会将明文拆分成不同的块进行加密,例如一个256 位的数据用128的密钥加密,则分成 :明文1(128位) 明文2(128位),加密后: 密文1(128位) 密文2(128位)
  • 如果明文长度不是16byte的整数倍,则需要对明文进行填充,填充方法及说明见下表:
填充方法说明
NoPadding不进行填充,要求明文必须要是16个字节的整数倍
PKCS5Padding(默认)明文的末尾进行填充,填充的数据是和16个字节相差的数量
ISO10126Padding明文的末尾进行填充,和16个字节相差的数量填写在最后,其余字节填充随机数

2.2 加解密模式

  • 模式是需要制定AES对明文进行加密时使用的模式(这里并不涉及具体的加密方法,只是加密步骤上的不同模式,在加解密时同样需要相同的模式,否则无法成功)
  • 一共提供了五种模式,模式的基本原理是近似的,但是细节上会有一些变化
模式说明
ECB模式(默认)电码本模式:根据密钥的位数,将数据分成不同的块进行加密,加密完成后,再将加密后的数据拼接起来
CBC模式密码分组链接模式 :引入了初始向量概念,该向量必须和密钥长度相等的数据,在第一次加密前,会使用初始化向量与第一块数据做异或运算,生成的新数据再进行加密,加密第二块之前,会拿第一块的密文数据与第二块明文进行异或运算后再进行加密
CFB模式密码反馈模式
OFB模式输出反馈模式
CTR模式计算器模式

2.3 明文和密文长度关系

  • 由于填充模式不同,加密后明文和密文的长度有所不同,其长度关系见下表:
    在这里插入图片描述

3. AES在线计算工具

4. python实现AES加解密算法源码

  • python有用于计算AES加解密的模块,使用前需要先安装该模块:pip install pycryptodome(window系统,python3.8版本)
  • 源码如下:
"""
计算AES加解密的python程序
加密模式:AES 128 默认填充 CBC模式
"""

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

class AesCrypter(object):
    def __init__(self, key , iv):
        self.key = key
        self.iv = iv
        
    def encrypt(self, data):
        data = data.encode()
        data = self.pkcs7padding(data) # 判断长度,若不够进行填充
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        encrypted = cipher.encrypt(data)
        return b2a_hex(encrypted) # 转成hex格式返回
 
    def decrypt(self, data):
        data = a2b_hex(data)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        decrypted = cipher.decrypt(data)
        decrypted = self.pkcs7unpadding(decrypted)
        return decrypted
 
    def pkcs7padding(self, data):
        bs = AES.block_size
        padding = bs - len(data) % bs
        padding_text = chr(padding) * padding
        return data + padding_text.encode('utf-8')
 
    def pkcs7unpadding(self, data): 
        lengt = len(data)
        unpadding = data[lengt - 1]
        return data[0:lengt-unpadding]
      
if __name__ == '__main__':
    AES_KEY = '1234567812345678' # 16 byte的加解密密钥
    AES_IV = '1234567812345678' # 16 byte的偏移向量
    aes = AesCrypter(AES_KEY, AES_IV)
    encrypted = aes.encrypt('1') # 加密
    print (str.format("%s %d"%(encrypted, len(encrypted))))
    plain = aes.decrypt(encrypted) # 解密
    print (plain, len(plain))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

感谢阅读 若有错误 敬请见谅 !!!


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/794807
推荐阅读
相关标签
  

闽ICP备14008679号