6

概述

我试图想出一种方法,让服务器和客户端能够为每个请求生成一个唯一的 IV,这对每个客户端都是不同的,但又是确定性的。我所说的确定性的意思是,服务器可以计算未来任何请求的 IV,只知道起始顺序。

我需要此功能的原因是我使用 AES 加密来实现一次性密码 (OTP) 方案。当客户端登录到服务器时,它会获得一个种子。第一个 OTP 是通过加密这个种子生成的。对于每个后续请求,客户端使用服务器和客户端之间的共享 AES 密钥加密最后一个 OTP。因此,即使攻击者在没有共享密钥的情况下嗅探了最后一个 OTP,他们也无法获得下一个 OTP。OTP 在 CBC 模式下使用 AES 进行加密。如果服务器和客户端不同步,就会出现问题。我计划处理这个问题的方式是在服务器端生成一些 OTP 到未来,看看它们中的任何一个是否与客户端匹配。然而,

在进入我提出的解决方案之前,让我表达我对 AES、IV、CBC 和 ECB 的理解。这样,如果我对自己的基本原理有任何误解,都可以指出并纠正。

理论

欧洲央行

我知道欧洲央行将为使用相同密钥加密的相同明文块产生相同的输出。因此,它不应该用于多个数据块,因为可以通过对数据进行统计分析来辨别明文信息。基于此,如果您可以保证您的数据始终小于 16 字节(128 位),则似乎可以消除统计攻击的问题。此外,如果您还可以保证您永远不会使用相同的密钥加密相同的明文,那么您将永远不会获得相同的输出。因此,在我看来,假设您的系统将始终满足这些非常严格的标准,使用 ECB 是安全的。

CBC和IV

我知道 CBC 旨在消除这两个问题。通过链接块,它消除了 ECB 的多块统计攻击。通过从不为相同的 AES 密钥使用相同的 IV,您消除了使用相同的密钥将相同的明文加密到相同的输出的问题。

键唯一性

如果每个客户端都获得一个生成的 AES 密钥,那么虽然多个用户拥有相同密钥的可能性很小,但机会非常小。因此可以安全地假设没有两个客户端将使用相同的 AES 密钥。

建议的解决方案

我提出的解决方案是给每个客户一个唯一的 AES 密钥。当生成密钥时,计数器将被初始化为一个随机数。每次必须加密某些东西时,计数器都会加一。这个数字将被填充到一个块中,然后在 ECB 模式下使用 AES 加密。这个输出将是我使用 CBC 加密数据的 IV。

如果服务器与客户端的计数器不同步,因为它具有相同的密钥并且 ECB 不需要 IV,它可以继续生成 IV,直到找到一个允许解密数据的 IV。

我的想法是这个 IV 可以免受统计攻击,因为它等于 AES 的块大小。此外,每个用户每次都会有所不同,因为每个用户都将拥有一个唯一的密钥,并且计数器将始终递增。显然,必须安全地传输 AES 密钥(现在客户端正在使用服务器的公共 RSA 密钥加密生成的密钥)。

我的问题

我对提议的解决方案中描述的技术的基本理解是否正确?我提出的解决方案有什么明显的问题吗?使用相同的密钥以建议的方式生成 IV 以及使用 CBC 加密是否存在任何安全漏洞?

我意识到最后一个问题可能很难/不可能回答,因为密码学真的很难,但任何见解都会受到赞赏。

提前致谢。

4

3 回答 3

2

正如评论中所述,我会不惜一切代价避免发明一个协议,而是尝试实现一个标准化的协议。某些 OTP 协议要求客户端在登录服务器时使用第二个带外设备来接收 OTP,银行的常见情况是,在您向服务器应用程序发出登录请求时,服务器将向您发送 OTP你的手机。客户端和服务器的 OTP 生成器通常是时间同步或反同步的,如果我理解正确,您打算使用后一种解决方案。我没有在您的描述中找到您打算如何在单独的设备上管理客户的柜台?

无论如何,我建议使用经过“现场测试”的标准化程序,而不是采用我自己的方案。HOTP可能是您正在寻找的 - 尽管它使用密钥 HMAC 解决方案而不是对称加密,但这应该会使事情变得更容易,因为您不必再​​担心 IV。

在任何情况下,您都应该尽早计划如何与客户建立对称密钥。如果您无法通过安全通道(例如亲自分发密钥)处理此问题,这将成为整个系统安全的问题。

于 2011-07-13T02:04:11.603 回答
0

好吧只是一个想法...如果您想要自我同步的东西,您可以将AES设置为密码反馈模式...这样您的密文将用作IV ...如果双方不同步,一个密文块足以重新获得同步(但将带来重新同步的那个将无法解密,因为前一个不可用)

于 2011-07-13T02:03:34.533 回答
0

你甚至可以去掉 ECB 部分,原则上关于 IV 的一个真实的事情是它应该是唯一的,而且计数器很可能是唯一的。由于在攻击期间使计数器唯一是很棘手的(参见例如 WEP 加密),所以最好使用安全随机数(真正的安全随机数,而不是“Sony PS3”安全随机数或 XKCD 安全随机数)。

您对加密的理解似乎还不错,但我仍然会接受其他建议,并且如果其他所有方法都失败了,我只会选择您自己的方案(和实现)。

于 2011-07-14T01:12:58.727 回答