我知道有许多加密标准采用密钥,有时甚至采用IV,并产生密文(最突出的是AES)。这些标准通常涉及许多轮加法和乘法。但是,使用OTP比这容易得多。您可以对纯文本与填充进行XOR,这是唯一在计算方面的要求。然而,OTP伴随着只要是明文就存在密钥流的问题。该密钥流应该是随机的。我的问题是,这种随机性是否比正在使用的加密标准贵?为什么我们不在每种情况下都使用OTP,缺点是什么?

假设我负担不起使用加密算法的费用,但是我拥有的数据流几乎是随机的。如果我将其用作OTP(我知道这不是完全随机的),那么我会牺牲什么呢?如何才能从此任意数据流中获得最佳的伪随机特征,使其成为合格的OTP?

评论

请注意,您可以在计数器模式下使用AES(或任何其他块密码),这会将其转换为PRG。

@Paul计数器模式的一个问题是,如果重用IV,则灾难性地失败。诸如CBC之类的其他模式在IV重用的情况下不会失败得那么严重。

您如何将“ OTP”带到解密点?

#1 楼

一次性填充需要一个真正的随机序列,该序列与要加密的材料一样长。如果您有伪随机序列,那么就没有一次性密码:您有流密码。如果您的数据流只是“几乎是随机的”,那么就没有一次性填充,您的流密码就破了。

具体来说,如果序列几乎是随机的不是统一的,这意味着存在偏差:某些位排列比某些其他排列更有可能。每当这些排列与纯文本中的模式对齐时-例如,英语文本包含的EJ多,大多数语言的文本包含比任何其他字符更多的空格,HTML往往在每个>之后不久都有一个<,……明文在密文中变得显而易见。因此,某些模式出现在密文中的机会要多于偶然,它们会揭示明文中的模式。

要从不完全均匀的随机源生成密码安全的随机序列,您需要通过加密安全的伪随机数生成器传递此随机源。构建伪随机生成器的最便宜的技术之一是在称为CTR_DRBG的结构中使用诸如AES之类的加密算法。如果您只想加密一条消息,那么与使用AES-CTR_DRBG来构建密钥流并使用该密钥流来加密消息相比,使用AES-CTR加密消息要更简单,更便宜。 >
另外,一次性垫对消息的真实性没有帮助。如果邮件在传输过程中被修改,则无法检测到它。可以将加密算法与身份验证算法结合使用,将两者合在一起的成本要小于完全独立地两者的成本。计算成本仅略微降低,但是代码大小或门数的成本却大大降低。例如,一旦有了AES块密码,就只需花费一点点额外的工作即可构建经过身份验证的加密模式,例如GCM或CCM。

评论


$ \ begingroup $
这里的“ E比J多”示例与此处无关。即使是非常糟糕的伪随机数“ OTP”也不会有如此明显的周期性问题。真正的问题是,并非所有密钥都同样具有可能性:您可以强行使用一组前缀,使前N个字节看起来有意义。现在有了真正的OTP,所有这些前缀都将具有同等的可能性,因此不会告诉您有关纯文本的任何信息,但是,如果您发现一个匹配PRNG的签名,则可以尝试继续执行该序列,并且该序列提供了无垃圾的含义,请确定您已掌握。
$ \ endgroup $
–leftaround关于
18-10-17在11:36



#2 楼

将您的问题归结为以下两个要点:-


为什么我们在每种情况下都不使用OTP,不利之处是什么? >直接导致为什么每个人都无法使用一次性密码进行加密?并且我不会增加混乱,但是该问题可能会提供一些见解。它还处理了身份验证/恶意问题。


我的数据流几乎是随机的


然后用它来播种CSPRNG。为什么在一个时间垫中密钥分配必须真正是随机的?为什么一个时间垫的密钥必须均匀分配?说明为什么不应该原始使用它。如果您的系统具有存储一个大时限的能力,则它可能具有足够的计算能力来运行某种形式的CSPRNG。 ChaCha派生的实现将在Arduino级别上运行。只要确保您的原始熵足够大即可,通常为128位或更多。这可能需要对原始数据进行一些压缩/折叠,以适合您应该使用的CSPRNG的种子大小。

在许多方面,这是您面临的最困难的部分,因为数据的准确熵测量是棘手的。您显然想避免这种情况,因为1kbit的数据流纯粹是通过算术方式生成的,因此只有少量的熵。

#3 楼


我知道有许多加密标准采用密钥,有时甚至采用IV,并产生密文(最突出的是AES)。


AES本身不是密码,它是分组密码。因此,它只能加密恰好一个块(16字节)的消息。您需要一种操作模式(例如计数器模式加密)来创建真实密码。操作模式需要IV。 IV仅取决于块大小,而不取决于密码的任何其他属性。


这些标准通常涉及许多轮加法和乘法。


不是。一些对称密码使用加法,但通常避免使用更复杂的计算(例如乘法)。诸如XOR,移位和转置之类的位操作更为常见。


但是,使用OTP比这容易得多。您可以对纯文本与填充进行XOR,这是唯一在计算方面的要求。然而,OTP伴随着只要是明文就存在密钥流的问题。该密钥流应该是随机的。


只有当您有提供所有位的真实随机数生成器时,这才是正确的。


我的问题是,这种随机性比正在使用的加密标准更昂贵吗?


有快速的真实随机数生成器,但是您需要CPU内的RNG才能接近基于AES的密码。与使用AES相比,拥有真正的随机数生成器通常会更加昂贵。

通常随机数生成器至少需要白化,这需要进行计算。有时甚至会将随机数馈入AES来执行此操作!

Intel / AMD CPU上的AES-NI当前至少是同一CPU上的随机数生成器RDRAND的4倍。 br />

为什么不在每种情况下都使用OTP,不利之处是什么?


如前所述,对于真正的OTP,您需要分发密钥。为了安全地执行此操作,您要么需要使用物理的带外解决方案(使用sneakernet分发CD)。

加密密钥流没有意义,因为您需要尽可能多的密钥将密钥作为密钥的大小进行加密的方法。


假设我负担不起使用加密算法的费用,但是我拥有的数据流几乎是随机的。如果我将其用作OTP(我知道这不是完全随机的),那么我会牺牲什么呢。


算法需要安全。否则,对手可能会检索算法的状态并使用它来计算密钥流。

保护算法的最佳方法是使用流密码创建密钥流。 AES可以转换为流密码-例如使用计数器(CTR)模式。还有一些专用的流密码更加轻巧,包括GSM手机中的一种。但是,诸如AES之类的分组密码更具通用性。


可以做什么来从此任意数据流中获得最佳的伪随机特征,以使其尽可能地合格。要成为OTP吗?


您将以一种将其转换为流密码的操作模式使用流密码或分组密码(例如AES)。

有趣的事实:如果您具有流密码,则可以预先计算它生成的密钥流。然后,您可以通过非常快的,低延迟的加密-实际上-只需将缓存的密钥流与纯文本进行异或。并建立相对较小的密钥。

评论


$ \ begingroup $
已经有了答案,但是我在问题文本中看到了一些误解,所以我之所以发布此答案,仅仅是因为所有文本几乎都不能放入注释(或两个)中。
$ \ endgroup $
–马腾·博德威斯♦
18-10-16在20:47

#4 楼


假设我负担不起使用加密算法的费用,但是我的数据流几乎是随机的。 [...]


我认为您遇到的一个问题是,您将其视为一个合理的假设:密码算法比随机位生成更昂贵。但这是另一回事– OTP是更昂贵的选择。

思考现代密码学的一种有用方法是:密码学的目的是减少我们对预密码学安全通道的需求。从OTP到DH的所有加密都需要某种方式使用某些渠道才能工作:


OTP要求各方至少共享与数据量一样多的随机密钥材料。他们计划加密。必须在机密的通道上交换此密钥材料,并确保消息的真实性。
现代对称加密要求各方共享一个小的随机密钥。此密钥还必须在机密的通道上进行交换,并确保消息的真实性。
公共密钥加密要求各方之一知道另一方的公共密钥。必须在保证消息真实性的通道上获得此密钥,但不必保密。

因此从这个角度来看,OTP是迄今为止最昂贵的。通过OTP加密的每一位都必须通过在无法通过密码保护的更昂贵的密钥建立通道上发送一个填充位来“支付”。如果仔细考虑,您会发现该数量限制也意味着平均带宽限制(以长时间为单位进行测量),加密的消息带宽不能超过密钥建立通道的带宽。如果我每周只能建立1 GiB的打击垫材料,那么那也是我平均可以加密的数据量。

相比之下,使用现代对称加密,一个128位AES密钥足以加密大量数据。我的密钥建立通道的带宽可以比我加密的通信小得多。

#5 楼


如果我将其用作OTP(我知道这不是完全随机的),那我会为此付出什么呢?
为什么不在每种情况下都使用OTP,会有什么弊端?
/>
OTP的问题是密钥分发。如果您有安全的通道来传输密钥,则可以传输消息而不是密钥。
使馆和政府之间使用OTP。使馆可以返回国会大厦,并带一个手提箱来携带OTP。问题在于,完成OTP密钥后,您会停止通讯还是开始重用?
因为它具有高度的保密性,所以使用它。

我的数据流几乎-随机。如果我将其用作OTP(我知道这不是完全随机的),那我应该为此付出什么呢?

答案取决于您几乎随机的定义。如果它是LFSR,则我可以尝试所有可能达到一定长度的LFSR输出。

PRG比AES或任何其他加密标准的成本高吗?

比较成本安全携带OTP或使用公钥加密进行密钥交换以进行对称密钥加密的方法。