zoukankan      html  css  js  c++  java
  • AES算法流程

    明文分组长度: (128bit)

    密钥长度: (128bit)

    迭代轮数: (10轮)

    加密和解密均在(4*4)的矩阵上进行,每个格子(1)个字节,共(16)个字节(128bit)

    注意AES算法序列映射到矩阵上是列优先的,所以读取时都是一列一列地读,这不同于DES的行优先

    轮密钥加

    两个矩阵(A, B)进行异或,(A_{ij} oplus B_{ij} = C_{ij})

    字节代替

    对于原矩阵的每一个格子的数值((1btye-8bit)),前(4bit)指明行数,后(4bit)指明列数,到S盒(不同于DES中的8个S盒)中找到对应位置的数值作为输出

    行移位

    (1)(4)行依次循环左移 (0byte)(1byte)(2byte)(3byte)

    注意是循环左移,每移动一位都相当于将最左侧的一个格子放到最右侧

    列混合

    (固定矩阵 imes 输入矩阵 = 输出矩阵)

    固定矩阵为:

    [egin{bmatrix} 02 & 03 & 01 & 01 \ 01 & 02 & 03 & 01 \ 01 & 01 & 02 & 03 \ 03 & 01 & 01 & 02 end{bmatrix} ]

    计算方法

    矩阵乘法的规则没有变化

    这里的数值计算实际上为多项式计算,下面分为加法和乘法分别讨论

    加法

    多项式表示: ((x^6 + x^4 + x^2 + x + 1) + (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2)

    二进制表示: (01010111 oplus 10000011 = 11010100)

    十六进制表示: (0x57 oplus 0x83 = 0xd4)

    因为是模2加法,所以两个十六进制加法只需先将十六进制转化为二进制再进行异或操作

    乘法

    首先定义了一个运算-x乘法

    假设存在一表达式(b(x)=b_7x^7 + b_6x^6 + b_5x^5 + b_4x^4 + b_3x^3 + b_2x^2 + b_1x + b_0),x乘法就是(x*b(x))

    • (b_7 = 0)时,(x*b(x))运算后二进制的结果是(b(x))对应的二进制左移一位,右侧补0
    • (b_7 = 1)时,(x*b(x))运算后二进制的结果是(b(x))对应的二进制左移一位,右侧补0,再与(1B(00011011))进行异或

    也就是说两个十六进制进行乘法运算,我们首先需要转化为二进制。其次我们必须想办法将乘法运算转化为x乘法(这样做只是会大幅度简化计算,否则需要使用两个多项式进行乘法运算),例如(57H * 13H),我们可以将(13H)转化为(01H + 02H + 10H)(*01H)就是乘1,(*10H)对应多项式的(x^4),只需要乘(4)次x即可,而乘x的运算结果就是我们上面提到的那两种情况,判断(b_7)是否为0即可。这样做即可免除使用两个多项式进行计算。

  • 相关阅读:
    C++ string 类的 find 方法实例详解
    linux系统中errno与error对照表
    tshark (wireshark)笔记
    自己签发免费ssl证书
    Go语言练习:网络编程实例——简易图片上传网站
    java开源工具包-Jodd框架
    数据库性能瓶颈解决方案
    [转载]如何快速学习一门技术
    [转载]IBM公司发布了最新的power7服务器p750 p770 p780
    计算机组成原理 — 指令系统
  • 原文地址:https://www.cnblogs.com/G-H-Y/p/14607895.html
Copyright © 2011-2022 走看看