求任意8比特数在AES的S-Box中的对应值(一)
题目要求:
写一个程序,给定任意8比特数,可求其在S-Box中所对应的值。
不能说这种方法错了,只能说是不符合老师的要求吧。
好吧,还是规规矩矩地直接用课本的转换方法做吧(来自CANS第五版5.3.1):AES的S盒按如下方式构造:(1)按字节值升序逐行初始化S盒(16 * 16),共256个。(2)把S盒中的每个字节映射为它在GF(2^8)中的逆元,{00}被映射为它自身。(3)记S盒中每个字节的8个构成位为(b7, b6, b5, b4, b3, b2, b1, b0),对S盒中的每个字节的每个位做如下的变换:b[i] ' = b[i] xor b[(i+4)mod8] xor b[(i+5)mod8] xor b[(i+6)mod8] xor b[(i+7)mod8] xor c[i]。其中(c7,c6,c5,c4,c3,c2,c1,c0) = 01100011。
按照以上规则,若输入某个数a,对其进行S-Box转换的方法为:(1)求 a的逆元a-1。00H的逆元为00H。(2)对a-1进行矩阵变换,也就是对每一位进行以上(3)的操作。
分析完毕,看代码部分。
比较两种方法,明显第一种方法运行效率更高,是用开发者的开发效率换来的。很可惜不符合老师要求。第二种方法用了枚举方法来求逆元,由于GF(2^8)最多才256个数,所以对程序运行效率影响不大,但是如果该域数量变得很大,那就只能用其它方法来求逆元了。
好吧,AES的S-Box会做了(尽管算法并不够好),等我学到了新东西再更新吧。