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

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

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

POWER8 是基于 POWER 架构的一组超标量对称多处理器(super-scalar symmetric multiprocessor)。POWER8                                系列增强了其加密功能,通过使用高级加密标准 (AES) 对称密钥加密标准实现了核心增强。
POWER8 AES 指令集提供了 5 个矢量指令来处理 AES 块密码加密/解密。POWER8 还为 Galois Field 中的乘法提供了一些指令,用于实现                                Galois Counter Mode (GCM) 和 GHASH 算法 。
这篇文章将介绍这些加密指令,并提供一些简单的示例,以便说明如何使用这些指令在您的应用程序或驱动程序中实现 AES 或 AES 模式。
AES                                是什么?高级加密标准也被称为 Rijndael。它是作为电子数据的加密标准而建立的,由美国国立标准与技术研究院 (NIST) 于 2001 年建立。它是处理 16 字节/128                                位的数据块的对称密钥算法。换句话说,它是一种数据块加密算法。128 位数据块适用于 128 位寄存器。此算法的密钥可以是 128、192 或 256 位长。POWER8 架构使您能够用 5 个指令实现 AES 算法,在 AES                                算法核心(尤其是扩展密钥和围绕部分算法的 AES 加密/解密)中运行关键步骤。
矢量多媒体扩展 (VMX)POWER8 的增强功能之一就是实现综合的多管道矢量类型指令,该指令支持 32、128 位 VMX 矢量寄存器。矢量数据可以用不同的方式表示,如下表中所示。

qword  dword  dword  word  word  word  word  hword  hword  wword  hword  hword  hword  hword  hword  0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0a  0x0b  0x0c  0x0d  0x0e  0x0f * hword = 2 字节、word = 4 字节、dword = 8 字节、qword = 16 字节。
为了使用 AES,可以考虑使用完整的 16 字节向量,该向量可以在加密/解密步骤中处理最大的 AES 密钥或状态/密码文本。
AES 算法AES 算法可分为以下步骤:
  • KeyExpansion/Generate Round keys
    • RotWord
    • SubBytes
    • Rcon Xor
  • InitialRound
    • AddKeyRound
  • Rounds
    • SubBytes
    • ShiftRows
    • MixColumns
    • AddRoundKey
  • Final Round (no Mixcolumns)
    • SubBytes
    • ShiftRows
    • AddRoundKey
Key                                Expansion/Generate Round Keys                                显示了一个算法概述。每个步骤都会在下面的各小节中进行介绍。
图 1. AES fluxogramKey                                Expansion/Generate Round Keys Key Expansion/Generate Round Keys 步骤从提供一个给定密钥开始,并将它扩展为多个密钥。128 位密钥被扩展为 11 个密钥。192                                位密钥被扩展为 13 个密钥。256 位密钥被扩展为 15 个密钥。
第一个扩展的密钥是从初始密钥的最后一个单词中生成的,在生成一个单词的三个步骤中被处理,然后使用这个单词生成扩展密钥的所有 4                                个单词。下一轮使用了前一轮生成的密钥中的最后一个单词。此过程一直重复,直到生成所有密钥。请记住,无论初始密钥的大小如何,AES 总是内部使用 16 字节的密钥。
RotWord 步骤Rotate Word (RotWord) 步骤处理一个单词并按以下方式旋转其字节:
字节 0 1 2 3 -> 1 2 3 0
示例:
给定一个单词:
79 d2 85 46
RotWord 步骤会生成以下结果:
d2 85 46 79
SubBytes 步骤SubBytes 步骤使用了一个替换盒 (S-Box),使用 Galois Field GF(28) =                                GF(2)[x]/(x8+X4+x3+x+1) [2]                                中某个单词的乘法逆元来替代这个单词中的字节。在解密时,它使用了逆向 S-Box。
图 2. S-Box
例如,在使用 S-Box 时,字节 0x9a 被 0xb8 替换。这一步是使用 vcipher 和                                vcipherlast 指令在内部完成的。逆向 S-Box 操作是使用 vncipher 和 vncipherlast 指令在内部完成的。
例如,给定单词:
af 7f 67 98
SubBytes(word)operation 将会生成
79 d2 85 46
Rcon Xor 步骤Rcon 或 Round Counter 步骤是某个用户指定值 [3] 的 2 的幂。在 AES 中,该值是整数。
所需 AES 轮次的数量取决于密钥的大小。对于 128 位密钥,AES 至多需要 rcon(10);对于 192 位密钥,至多需要 rcon(8);对于 256                                位密钥,至多需要 rcon(7)。因此,对于所有 AES 可能性,我们需要保存 rcon 1 至 10:
Rcon(1-10) = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,                                0x36
为了生成第一个扩展密钥,添加 rcon,然后我们继续处理密钥单词 Xor rcon(1) 或密钥单词 xor 01 00 00 00。
以下是扩展密钥的工作原理的一个完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Key: 0xac 0x2b 0x3c 0xdd 0xee 0x04 0x11 0x44 0xa1 0x4b 0x5c 0xd1 0x6a 0xb9 0x1c 0xdd

Splitting key into words for the first key in key expand buffer:
W0 = ac 2b 3c dd
W1 = ee 04 11 44
W2 = a1 4b 5c d1
W3 = 6a b9 1c dd

Key expand algorithm always uses the last word to execute steps, in our case W3:

X1 <- RotWord(w3)
X1 = b9 1c dd 6a
Y1 <- SubBytes(X1)
Y1 = 56 9c c1 02
Rcon(1) = 01 00 00 00
Z1 <- Y1 xor 01 00 00 00
Z1 = 57 9c c1 02
--------------------
Second key in key expand buffer:
W4 =  W0 xor Z1  = fb b7 fd df
W5 = (W4 xor W1) = 15 b3 ec 9b
W6 = (W5 xor W2) = b4 f8 b0 4a
W7 = (W6 xor W3) = de 41 ac 97
______________________________
X2  <- RodWord(W7)
X2 = 41 ac 97 de
Y2 <- SubBytes(X2)
Y2 = 83 91 88 1d
Rcon(2) = 02 00 00 00
Z2 <- Y2 xor 02 00 00 00
Z2 = 81 91 88 1d
------------------------------
Third key in key expand buffer:
W8  =   W4 xor z2  = 7a 26 75 c2
W9  =  (W8 xor W5) = 6f 95 99 59
W10 =  (W9 xor W6) = db 6d 29 13
W11 = (W10 xor W7) = 52 c8 58 40
        (...)




现在让我们来了解如何使用 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                                操作。
返回列表