生成256位随机随机数。与256位可重用对称密钥进行异或。这是x

我们用简单的二进制而不是计数函数表示数字。 dec中的0 =二进制中的[256 zeros],二进制中的1 = [255 zeros]123092348 = [241 zeros]1011000000101110001111100等。
对于每个n所需的明文长度的块,将xn进行异或运算,然后将其与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作为分组密码安全的操作模式?特别是,它需要在密码反馈,输出反馈或仅在加密方向上使用密码的任何其他模式中使用。

评论

对于任何阅读此书的人,我相信将256位随机值称为IV而不是随机数会更好。该值必须是随机的,以获取此方案中的CPA安全性。如果使用非随机但唯一的值(即刻)(例如计数器),则CPA游戏将很容易被击败(因为OP决定使用XOR而不是串联到SHA的输入)。只是为了完整性。

#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的方式作为密码,因此它显得有些安全。