首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

POWER8 核心加密 介绍如何使用 AES 指令更新

POWER8 核心加密 介绍如何使用 AES 指令更新

现在让我们来了解如何使用 POWER8 向量和 AES 指令来创建扩展密钥。
首先,我们需要看看 AES 指令。如前面所述,P8 随带了 5 条 AES                                        指令:vcipher、vcipherlast、vncipher、vncipherlast                                和 vsbox。让我们重点关注前两个指令:
1
2
3
4
5
6
7
vcipher VRT,VRA,VRB
    State ← VR[VRA]
    RoundKey ← VR[VRB]
    vtemp1 ← SubBytes(State)
    vtemp2 ← ShiftRows(vtemp1)
    vtemp3 ← MixColumns(vtemp2)
    VR[VRT] ← vtemp3 ^ RoundKey




State 是本轮中的密码文本,甚至是 AES 的第一步中的纯文本。这两个值都是 16 字节或一个 AES                                        块大小。RoundKey,顾名思义,是本轮中的密钥。因为 VMX 向量是 16                                字节,所有它们可以处理完整大小的轮次密钥和密文。
1
2
3
4
5
6
vcipherlast VRT,VRA,VRB
    State ←VR[VRA]
    RoundKey ← VR[VRB]
    vtemp1 ← SubBytes(State)
    vtemp2 ← ShiftRows(vtemp1)
    VR[VRT] ← vtemp2 ^ RoundKey




vcipherlast 与 vcipher 相同,除了它少一个步骤,即                                         MixColumns。
vncipher 和 vncipherlast 与 vcipher 和                                        vcipherlast 完全相同,除了它们使用了反向步骤,而且是用于解密的。
Power8 没有用于 Key Expand 的特定指令。但 vcipherlast,通过一些额外的步骤,可用来实现 Key Expand                                操作。
下列步骤显示了一个如何使用 vcipherlast 来执行 Expand Key 操作的示例:
在此示例中,rcon 指针已经加载到一个向量中,您可能想要查看 vmx 加密驱动程序来获得更多信息 [5]。此外还要注意的是,在                                Power PC Assembly 代码中,寄存器是通过数字来引用的,而不是通过名称来引用的。例如,vperm 3,1,1,5 采用 vr3 作为寄存器结果,并使用                                vr1 和 vr5 作为参数。有关的更多详细信息,请参见 [4]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* vr1 is the first key =  0xac 0x2b 0x3c 0xdd 0xee 0x04 0x11 0x44 0xa1 0x4b 0x5c 0xd1 0x6a 0xb9 0x1c 0xdd
* vr5 is a mask to rotate a word in applied for all four words in our key.
* vr5 = 0x0d0e0f0c 0d0e0f0c 0d0e0f0c 0d0e0f0c
* vr3 is the key in use destination
* vr4 is the first rcon loaded: 01 00 00 00 01 00 00 00 01 00 00 00   
* 01 00 00 00
**/
Loop128:
1   vperm 3,1,1,5   
2   vsldoi 6,0,1,12
3   vcipherlast 3,3,4   
4   vxor 1,1,6
5   vsldoi 6,0,6,12
6   vxor 1,1,6
7   vsldoi 6,0,6,12
8   vxor 1,1,6
9   vadduwm 4,4,4
10  vxor 1,1,3
11  bdnz Loop128




第 1 行对密钥应用了一个掩码。在这里,vperm 指令 vr3 后面将会是:
1
0xb91cdd6a  0xb91cdd6a 0xb91cdd6a 0xb91cdd6a




第 2 行会导致:
1
0x0000000ac2b3cddee041144a14b5cd1




第 3 行调用 vcipherlast 来执行 SubBytes、 ShiftRows 和 xor Rcon(n)。通过在 Power ISA                                2.07B [4] 中定义 ShiftRows 函数,ShiftRows                                在应用于此向量中时不起作用。在这个特定的场景中,它只执行 SubBytes 和 xor Rcon(n)。换句话说,它将生成第一个单词 Z 或 Z1。因此,在                                        vcipherlast 后面,我们有:
Z1: 0x579cc102 579cc102 579cc102 579cc102
第 4 到 8 行执行密钥扩展算法中密钥单词生成后面的公式。
1
2
3
4
W4 = (W0 xor Z1)
W5 = (W1 xor W4)
W6 = (W2 xor W5)
W7 = (W3 xor W6)




这可以重写为:
1
2
3
4
W4' = W0
W5' = W1 xor W0
W6' = W2 xor W1 or W0
W7' = W3 xor W2 Xor W1 xor W0




其中的 ' 意味着在 Z1 之前应用了一个临时单词。
第 4 至 8 行的详细操作如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
             W0         W1        W2         W3
vr1 0xac2b3cdd 0xee041144 0xa14b5cd1 0x6ab91cdd
         W0         W1         W2        w3
vr6 0x00000000 0xac2b3cdd 0xee041144 0xa14b5cd1
    -------------------------------------------
          W4'       W5'      temp-W6'  temp-W7'
vr1 0xac2b3cdd 0x422f2d99 0x4f4f4d95 0xcbf2400c
                               W0          W1
vr6 0x00000000 0x00000000 0xac2b3cdd 0xee041144
    -------------------------------------------
        W4'        W5'        W6'     temp-W7'
vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x25f65148
                                          W0
vr6 0x00000000 0x00000000 0x00000000 0xac2b3cdd
    -------------------------------------------
        W4'       W5'        W6'        W7'
vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x89dd6d95




第 9 行为下一轮添加了 rcon:
1
vr4 02 00 00 00 02 00 00 00 02 00 00 00 02 00 00 00




最后,第 10 行应用 Z1 单词生成了被扩展的第一个密钥。
1
2
3
4
5
6
7
          W4'       W5'        W6'        W7'
vr1 0xac2b3cdd 0x422f2d99 0xe3647148 0x89dd6d95
          Z1        Z1         Z1         Z1
vr3 0x579cc102 0x579cc102 0x579cc102 0x579cc102
    -------------------------------------------
          W4        W5      W6       W7
vr1 0xfbb7fddf 0x15b3ec9b 0xb4f8b04a 0xde41ac97




第 11 行跳回到了循环的开头处,根据所需的轮次数重复前面的所有步骤。
与 Key Expand 相比,AES 轮次非常简单,因为它们只需要扩展密钥以及加密或解密数据。
以下是一个演示了如何使用核心指令的简单示例。要获得更准确的代码示例,请参阅 附录 A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* vr0 is our state or the vector register where our
* plaintext/point address resides.
* vr1 is the key0 provided by the user or first key
* vr2 is the second generated by expand key
* vr3 is the third and so on till vr11
**/
1   vxor 0,0,1
2   vcipher 0,0,2
3   vcipher 0,0,3
4   vcipher 0,0,4
5   vcipher 0,0,5
     ...
11  vcipherlast 0,0,11




在第 1 行,key0 被添加到 AES 的初始状态。
第 2 行是具有 key1 的 AES 的第一轮。
第 3 行是 AES 的第二轮,依此类推。
第 11 是具有 last key10 的 AES 的最后一轮。
返回列表