AES加密转换基础知识的描述

美好的一天,哈伯!大约3个月前,前端开发人员进行了采访,并问了我第一个问题:“什么是AES?” 好吧,就好像我仍然对对称块AES加密仍然有一个不确定的想法一样,它甚至在一个项目中用于加密个人数据。但是要知道rijndael算法并仍然能够在javascript中实现它,对我而言在当时似乎是一项艰巨的任务。但!我受到挑战并被接受。



去解决!

作为基础,我采用了2011年11月26日发布的FIPS197 AES规范。

在IT领域,一些最著名的加密算法是:

  • 对称的
  • 不对称

对称算法是指具有一个加密密钥和一个解密密钥的算法。该算法的优势是加密速度。缺点-需要安全通道来传输此密钥以进行解密。

对称算法又分为两种类型:

  • 块状的
  • 流式

块1具有对块中的数据进行加密的能力,即,预定的有限字节数。这意味着并行化块加密的可能性,即,同时加密大量数据,同时减少了时间资源。

逐个字符地加密。非对称算法的

优点是它的安全密钥存储。非对称-具有两个密钥的算法:

  • 公钥
  • 私钥

publicKey是加密密钥。无需解密,这意味着无需传输。
privateKey-解密的密钥。

非对称算法的缺点是其相对较慢的加密性能。

Rijndael是一种对称块加密算法,能够将块和私钥的大小从128位调整为256位,相差32位。它使用线性替换转换,并根据密钥长度分为10、12或14轮。
AES -rijndael,具有128位密钥和16个字节的数据块。

大概您熟悉以下术语的理论:

  • 二进制数制
  • 十进制数制
  • 个字节
  • 异或(^)

如果没有,那没关系。阅读我的文章“图像处理ReactJS-NodeJS»或查看示例snipettov reactjs.su

Rijndael中的数学概念:


  • 字段GF(2⁸)是有限数量的元素,其结果是素数的第n个自然度。在GF(2⁸)的框架内,执行加,减,乘,除的任意操作。场GF(2⁸)是确定的。
  • . Rijndael [00000000₂; 11111111₂]. , x. , , :

    a(x)=a₇x⁷ +a₆x⁶ +a₅x⁵ +a₄x⁴ +a₃x³ +a₂x² +a₁x +a₀x;

    , a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀ {0, 1}, :
    87 = 01010111 ( );
    : x⁶ + x⁴ + x² + x + 1;
  • . , , 1 . rijndael m(x):
    m(x)= x⁸ + x⁴ + x³ + x + 1;
  • . XOR, : 1 ^ 1 = 0 ^ 0 = 0; 1 ^ 0 = 0 ^ 1 = 1, :

    , a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀;
    B, b₇, b₆, b₅, b₄, b₃, b₂, b₁, b₀;

    A = 87 = 01010111; B = 131 = 10000011;
    A ^ B = a₇, a₆, a₅, a₄, a₃, a₂, a₁, a₀ ^ b₇, b₆, b₅, b₄, b₃, b₂, b₁, b₀ = 11010100;
  • . GF(2⁸) ( | -x | = x ) 8, :

    87 x 131 :
    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1) = x¹³ + x¹¹ + x⁹ + x⁸ + x⁷ + x⁷ + x⁵ + x³ + x² + x + x⁶ + x⁴ + x² + x + 1.
    . (.4):

    x⁷ + x⁷ = x⁷(1 + 1) = x⁷(1 ^ 1) = x⁷0 = 0;
    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1) = x¹³ + x¹¹ + x⁹ + x⁸ + x⁶ + x⁵ + x⁴ + x³ + 1.

    m(x) = x⁸ + x⁴ + x³ + x + 1 ( ), rijndael , 8, . . , . :

    (x⁶ + x⁴ + x² + x + 1)(x⁷ + x + 1)/(x⁸ + x⁴ + x³ + x + 1) =
    (x¹³ + x¹¹ + x⁹ + x⁸ + x⁶ + x⁵ + x⁴ + x³ + 1)/(x⁸ + x⁴ + x³ + x + 1) = |Result| = x⁷ + x⁶ + 1


:


  1. keyExpansion() — ;
  2. addRoundKey() — ;
  3. subBytes() — state;
  4. shiftRows() — state;
  5. mixColumns() — state;
  6. invMixColumns() — mixColumns;
  7. invShiftRows() — shiftRows;
  8. invSubBytes() — subBytes;

AES :


  1. state
    - . [0; 255] ( ASCII Unicode). n- 16 . state ( 4 = [ [], [], [], [] ] ), 16 , 16 :

  2. keyExpansion();
    AES, state. . XOR Rcon.

    Rcon — XOR. keyExpansion() XOR’ Rcon . — 11. 10 .

    let rCon = [
      [ 0x00, 0x00, 0x00, 0x00 ],
      [ 0x01, 0x00, 0x00, 0x00 ],
      [ 0x02, 0x00, 0x00, 0x00 ],
      [ 0x04, 0x00, 0x00, 0x00 ],
      [ 0x08, 0x00, 0x00, 0x00 ],
      [ 0x10, 0x00, 0x00, 0x00 ],
      [ 0x20, 0x00, 0x00, 0x00 ],
      [ 0x40, 0x00, 0x00, 0x00 ],
      [ 0x80, 0x00, 0x00, 0x00 ],
      [ 0x1b, 0x00, 0x00, 0x00 ],
      [ 0x36, 0x00, 0x00, 0x00 ],
    ];
    
  3. addRoundKey();

    state , . addRoundKey XOR’ state, . ’XOR’ state , :




  4. 10 , 10 . 9 4 :

    • subBytes();
    • shiftRows();
    • mixColumns();
    • addRoundKey();

    10- :

    • subBytes();
    • shiftRows();
    • addRoundKey();

  5. subBytes();

    state S-box:



    State hex , : 01010011 -> 0101 | 0011 -> 53h



    53h edh

    S-box
    const sBox = [
      0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
      0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
      0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
      0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
      0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
      0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
      0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
      0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
      0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
      0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
      0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
      0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
      0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
      0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
      0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
      0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
    ];
    


  6. shiftRows();

    3- :


  7. mixColumns();

    . a(x) = {03}x³ + {01}x² + {01}x + {02}. state a(x). :







AES :


  1. keyExpansion();


  2. 10 , .

    9 4 , , :

    • addRoundKey();
    • invMixColumns();
    • invShiftRows();
    • invSubBytes();

    10-:

    • addRoundKey();
    • invShiftRows();
    • invSubBytes();

  3. addRoundKey();

    , Rcon
  4. invMixColumns();

    invMixColumns函数根据将算法与特定状态列的常数函数a⁻(x)相乘的规则来执行乘法逆乘法运算:




  5. invShiftRows();

    逆变换shiftRows()-向右循环移位:


  6. invSubBytes();

    Inversion subBytes()-状态字节的反向替换,显然根据固定的反向S-box表以十六进制表示:



参考书目:

  1. AES规范
  2. 高级加密标准(AES)
  3. 波兰人加洛瓦
  4. 循环码
  5. 高中教科书 Stepanov-计算机科学课程-信息数据安全
  6. 片段

All Articles