所有看到这个文章的人都应该知道HTTP是什么,通常,HTTP(Hyper Text Transfer Protocol,超文本传输协议)上传输的大多数数据都是以不安全的明文方式进行传输的。然而,在如在线电子邮箱(笔者使用的gmail)、在线文档(google docs)以及在线银行等领域上需要加密传输,我们需要使用HTTPS,即通过HTTP之上的安全套接字层(SSL)。
HTTP位于TCP/IP协议栈的应用层,SSL(Secure Sockets Layer ,安全套接字层)以及后来的TLS (Transport Layer Security,传输层安全)都是应用层上的安全技术,提供了一个安全传输私有数据的方案。显然,随着云计算让人们可以在任何地点通过各种设备访问他们的私有信息,今日任何基于HTTP的应用明天都可能会变成基于HTTPS,包括SSL和HTTPS在内的安全/加密技术毫无疑问将会变得越来越重要。
SSL握手过程
对于SSL而言,其核心部分与密码算法相关:包括使用对称密钥进行包加密、提供消息认证支持以及通过RSA算法建立会话。为了加速包括SSL在内的应用,Intel在Westmere中新增加了AES NI指令集。
AES算法
AES(Advanced Encryption Standard,高级加密标准)是美国政府的对称加密算法标准,它定义在FIPS(美国联邦信息处理标准)出版物第#197 (2001) 中并得到了广泛的应用。在HTTPS中,它可用于为因特网上传输的信息提供机密性。AES是一个对称加密算法,也意味着在加密和解密消息的时候,使用的是相同的密钥:
AES结构
AES加密处理对输入的128位明文,使用加密的密钥通过有限次的迭代运算(每一次称为一轮:round)最终得到128位的加密块。解密遵循相反的过程,迭代次数一样,但是需要“解密密钥”而不是加密的“密钥”。在每一轮加密解密中都使用不同的阶段密钥,由原始密钥通过密钥序列算法生成。AES的标准密钥分为128,192和256位,各自对应的迭代次数为10、12和14轮。AES中使用了基于GF(28)的有限域算法以及仿射变换。
RSA算法
RSA(Rivest Shamir Adleman,三个作者的名字)是一种公钥密码算法设计。公钥算法背后的主要想法是加密技术可以有后门的存在。后门的意思是指,密码只需要交互的一方知道,这样可以简化加密流程。在公钥算法中,消息通过公钥加密,而一个公钥对应一个私钥。在不知道私钥的情况下,很难解密消息,类似地,攻击者也很难发现信息原文。
RSA的典型实现使用中国剩余理论,它可以将一个模数的取幂运算减低为长度为原先一半的两个数的取幂运算,依次类推,通过使用平方乘的技术可以将取幂操作化解成模数平方及模式乘运算的序列。平方乘运算还可以优化,并使用某些视窗法降低模数乘运算的次数。最后,模数平方和乘运算可以通过如Montgomery或Barrett这样的简约算法简化成大数的乘法运算。
Westmere的AES NI指令集包括了下面分成两部分的7条指令,来加速AES的计算(RSA的计算虽然不能直接加速,不过却可以从Intel的超线程技术获益),这些操作用软件实现需要消耗非常多的时间和内存,而用电路实现时可以很快并且显得更为节能:
Carry-less Multiplication Instruction(无进位乘法指令):
一条单独的无进位乘法指令(Carry-less Multiplication):PCLMULQDQ,PCLMULQDQ指令一次可以处理两个64位宽度的数据
无进位乘法又称为Galois域(GF)乘法,该操作中对两个数进行相乘时不产生以及传递进位。在标准的整数乘法中,第一个操作数移位的次数等于第二个操作数中值为1的比特位的个数,每次移动的距离就是1在第二个操作数中的位置。两个数的执行结果由所有移动后的第一个操作数相加而来的。在无进位乘法中,过程依然相同,但是相加时不产生进位也不传递进位。这样,比特加操作就相当于逻辑操作中的异或(XOR)。
无进位乘法是很多系统和标准(包括时钟冗余校验,CRC,Galois/计数模型,GCM和二进制椭圆曲线等)的计算的一个非常重要的组件,该操作在当今处理器上用软件实现时效率极为低下。所以,加速无进位乘法的指令对于GCM和所有依赖于它的交互协议来说相当重要。
GCM 是对称加密算法分组密码的一种工作模式。分组密码工作模式可以分为加密模式、认证模式和认证加密模式等。GCM模式为认证模式的一种,提供认证和加密两种功能。GCM在IEEE 802.1ae标准、IPsec(RFC 4106)、P1619存储标准和SPoFC(Security Protocols over Fiber Channel,ISO-T11的一个标准)中都有应用。
花絮:Lucifer在IDF09期间翻译Carry-less Multiplication时也犹豫了很久,叫“无进位”还是“不进位”呢?“无”适合描述现象,而“不”更适合于描述操作;最终Lucifer使用了更为常见的“无进位”。
AES Extension Instructions(AES扩展指令):
两条AES加密迭代加速:AESENC和AESENCLAST
两条AES解密迭代加速:AESDEC和AESDECLAST
两条密钥序列生成:AESIMC和AESKEYGENASSIST
AES NI的效果,数据来源:Intel
IDF09上的展示,Westmere-EP的RSA加密性能具有41%的提高,而AES加密性能则具有12倍的提升
AES NI不仅仅可用于AES算法,如SHA等中也可以使用。后面可以看到,AES NI对应用的加速效果非常明显。