x
。我们用简单的二进制而不是计数函数表示数字。 dec中的
0
=二进制中的[256 zeros]
,二进制中的1
= [255 zeros]1
,23092348
= [241 zeros]1011000000101110001111100
等。对于每个
n
所需的明文长度的块,将x
与n
进行异或运算,然后将其与SHA-256进行哈希运算形成b[n]
。让
p[n]
是明文中的n
256位块,而c[n]
是密文中的n
块。然后c[n] := b[n] XOR p[n]
。将未加密的随机数与密文一起发送。
要解密
c[n]
,将其与b[n]
进行异或以获取p[n]
。这是安全?如果是这样,那么为什么我们需要AES-256?如果这不是安全的,那么是否存在任何将SHA-256作为分组密码安全的操作模式?特别是,它需要在密码反馈,输出反馈或仅在加密方向上使用密码的任何其他模式中使用。
#1 楼
好吧,据我们所知,您建议的模式应该是安全的。现在,老实说,AES256与您的模式不是一个公平的比较。您的模式提供的理论安全性稍差一些;如果您对已知的$ 2 ^ n $阻止消息进行加密,则可以通过$ 2 ^ {256-n} $的努力来恢复密钥;但是,这种观察并没有真正影响实际的安全性。但是,为什么最好使用AES:
AES更快。当然,平台和实现之间的性能差异很大。但是以CryptoC ++基准测试为例,我们看到AES256被列为每个输出18.2个周期,而SHA256则每个输出大约需要31个周期。注意:SHA256被列为每字节15.8个周期。但是,这是输入字节;单个SHA256压缩评估需要64个字节的输入,因此需要1011个周期;在使用中,您使用单个SHA256压缩评估来生成32个字节的密钥流;因此,输出的每字节输出1011/32 = 31.6个周期。
AES可以用于计数器模式以外的环境。也就是说,AES是可逆的(如果您知道密钥);
但是,最重要的一点是:在这种情况下,对AES进行了更为广泛的分析。已对SHA256的抗碰撞性进行了相当详尽的分析;但是,我不知道是否有人真正看过这样一个问题:“如果我们有大量相关但未知的图像散列,我们可以推断出图像是什么吗?”。有了AES,我们知道人们一直在考虑这个问题。
评论
$ \ begingroup $
我认为测试方面是最重要的,因为没有人希望对系统的潜在故障承担全部责任。如果CTR中的SHA-256发生故障,则其实施者应承担责任;如果AES-256失败,那么每个人都会被搞砸。尽管您说一个$ 2 ^ {256} $块的已知消息可以以1的努力使密钥恢复……这怎么可能?
$ \ endgroup $
–乔丹
2012年1月14日6:18
$ \ begingroup $
@Jordan:好的,您是对的。对于已知的$ 2 ^ n $消息,它需要$ 2 ^ {256-n} $个测试加密,然后将该块列表与$ 2 ^ n $个已知块进行比较;如果$ n <128 $,则此步骤占主导地位(因此,可以忽略第二步来估算速度)。如果我们得出$ n $的愚蠢值,那就不那么正确了。
$ \ endgroup $
–雨披
2012年1月14日15:24
#2 楼
加密的CTR模式通常定义为任何具有加密功能的强伪随机函数(PRF)。您可以通过散列函数构建这样的PRF。对于CTR,您可以通过串联生成密钥流:$$ F(k,0)|| F(k,1)|| ... || F(k,m)$$
其中$ F $是您的安全PRF,$ k $是您的密钥,$ m $是纯文本的长度除以$的输出大小F $。要以您的模式表示法重写它,请执行以下操作:
b[n] = F(k,n)
但是$ F $可以是任何安全的PRF。它可以是AES,但不一定非要这样,AES只是流行的选择。
由于要使用SHA-256,因此可以使用基于哈希的PRF。您已经有效地尝试构建一个,但是像HMAC这样的普遍接受的PRF会更好。如果您将HMAC与SHA-256一起用作哈希函数,则已使用SHA-256有效地构建了CTR模式。为此,您的
b[n]
将从您的功能:b[n] = SHA-256(SHA-256(nonce XOR key) XOR n)
更改为HMAC功能:
b[n] = SHA-256(key XOR opad || SHA-256(key XOR IPAD || (nonce || n)))
HMAC方案每个块将需要两个哈希,而您的方案只允许您一次计算第一个哈希,因此HMAC方案的速度大约是原来的两倍。
值得注意的是,HMAC不是被证明是完美的PRF,但它已被广泛地重新定义为PRF。绝对是比自制建筑更安全的PRF选择。我不能说您的方案有多安全-它看起来确实合理,但这并不意味着什么-但这并不比HMAC更好。
已经接近HMAC,如果您需要使用SHA-256来构建CTR样式的加密,我建议您改用它(或其他基于散列的PRF)。
另外,在关于您的结束语的旁注中:CTR生成流密码。我们通常使用分组密码来构建它,但是CTR模式实际上是流密码。因此,我们可以从SHA-256构建流密码,但这与能够从中构建分组密码不同。我认为您的意思是,您正在考虑一组正在考虑的方案(OFB,CFB,CTR,也许还有其他方案),并且想知道可以使用哈希来实现的方案。如果能够将哈希转化为PRF,答案将包括CTR。
评论
$ \ begingroup $
使用HMAC使输出速度减半,并且增益相当可疑。 (尽管如果您需要快速的密码算法,则首先不会使用SHA-2。)
$ \ endgroup $
– CodesInChaos
2013年3月9日在9:11
$ \ begingroup $
实际上,一个人可以共享HMAC计算的一部分,即使用密钥XOR opad和密钥XOR ipad哈希第一个块,因为它们既不依赖于随机数也不依赖于n。但是,您仍然需要每个输出块处理两个SHA-256输入块,即仍然是原始提议速度的一半。
$ \ endgroup $
–PaŭloEbermann
13年10月10日在18:11
$ \ begingroup $
我认为SHA-2较不易受攻击,或者至少对SCA的研究较少,不是吗?是否有使用公式F(k,0)|| F(k,1)|| ... || F(k,m)的标准实体?可以在教科书中找到它,但是例如在SP800-38A中,他们使用术语CIPH(k,*)定义为可逆函数,因此禁止将SHA-2用作F(k,i)。以上公式
$ \ endgroup $
– Evgeni Vaknin
18年7月19日在10:33
#3 楼
查阅“ Handshah,Knudsen和Robshaw(2001)的“在加密模式下对SHA-1的分析”,以及引用它的一些论文。他们提供了一些证据表明您的问题的答案可能是“是”。#4 楼
您在问题中解释的内容类似于SHACAL-2密码的正向密码功能,请参阅http://en.wikipedia.org/wiki/SHACAL#Security_of_SHACAL-2。SHACAL-2是NESSIE接受的使用SHA-256的方式作为密码,因此它显得有些安全。
评论
对于任何阅读此书的人,我相信将256位随机值称为IV而不是随机数会更好。该值必须是随机的,以获取此方案中的CPA安全性。如果使用非随机但唯一的值(即刻)(例如计数器),则CPA游戏将很容易被击败(因为OP决定使用XOR而不是串联到SHA的输入)。只是为了完整性。