zoukankan      html  css  js  c++  java
  • AES内部结构(加密部分)

    内容参考书:
    深入浅出密码学——常用加密技术原理与应用 清华大学出版社
    第四章 高级加密标准

    AES的内部结构

    AES是面向字节的密码:

    假设状态A是由16个字节按照矩阵方式组成:

    密钥K对应的矩阵是一样的形式。

    字节代换层

    如4-3图所示,每一轮的第一层都是字节代换层。
    字节代换层可以看做是16个并行的s盒,每个s盒的输入和输出都是8位。
    值得注意的是,AES使用的16个s盒是完全相同的
    在这一层中,每个状态字节Ai都被替换为另一个字节Bi:S(Ai)=Bi
    s盒代换是一个双向映射,即256个可能的输入(8位)都与唯一的输出一一对应,这个属性允许我们唯一地逆转s盒,这也是解密操作所需要的。
    s盒的数学描述:
    AES的s盒具有非常强的代数结构,可以看做一个两步的数学变换。

    因为这部分和理解AES的实现关系不大,有兴趣可以看看原书,讲得很清楚。
    在s盒的硬件实现部分,到底是用查找表来实现好,还是按部就班的计算好,这个问题先搁置,原书内容为:

    扩散层

    AES的扩散层由行移位和列混淆两个子层组成。扩散指的是将单个位的影响扩散到整个状态中。是线性操作。

    行移位子层

    行移位变换循环往复地将状态矩阵的第二行向右移动三个字节,将第三行向右移动两个字节,将第四行向右移动一个字节,第一行保持不变

    列混淆子层

    如果将行移位之后的状态表示为B,列混淆后的输出状态表示为C,即MixColumn(B)=C。
    开始四个输出字节的计算方式,4*4的矩阵是固定的:

    密钥加法层

    密钥加法层的两个输入分别是16字节的当前状态矩阵和长度为16字节的子密钥。
    这两个输入通过按位异或操作组合在一起。
    128位AES有十轮需要11个子密钥,长度也是128位。
    子密钥的计算是递归的,即为了得到子密钥ki,必须要知道ki-1
    128位AES子密钥的编排,K是原始密钥:

    最左边字的计算方式:i=1,...,10

    其余三个字:i=1,...,10,j=1,2,3

    g()函数首先将四个输入字节翻转(?),并执行一个按字节的s盒代换,最后与轮系数RC相加。增加非线性,消除对称性。
    轮系数每轮都会改变,规则为:

  • 相关阅读:
    mysql索引创建和使用细节(二)
    mysql索引创建和使用细节(一)
    PHP7.2.6安装sodium扩展
    passwd修改密码失败,报鉴定令牌操作错误
    centos6升级python版本至python3.5
    centos6升级gcc版本
    elasticsearch中文手册
    MySQL主从仅同步指定库
    适用于Centos6/7,vsftp自动安装脚本
    Redis内存模型
  • 原文地址:https://www.cnblogs.com/zhanghaha-zzz/p/11716571.html
Copyright © 2011-2022 走看看