我需要一个加密方案,其中明文和密文完全由十进制数字组成。
此外,明文和密文的长度必须相同。
此外,底层的加密算法应该是一个行业标准。我不介意它是对称的(例如AES)还是非对称的(例如RSA) --但它必须是一个公认的算法,为此我可以获得一个FIPS-140批准库。(否则,它将无法通过安全审查阶段)。
使用AES OFB可以很好地保留基于十六进制的输入长度(即每个字节有256种可能的值: 0x00 -> 0xFF)。然而,这将不适用于我的手段,因为明文和密文必须完全十进制。
注:“完全十进制”可解释为两种方式-这两种解释都符合我的要求:
更多信息:最大明文和密文长度可能为10小数位数。(使用“0”
请考虑以下示例,以了解AES失败的原因:输入字符串为8位数字。最大8位数是: 99999999,这是: 0x5f5e0ff。
这可以作为4个字节来处理:<0x05><0xf5><0xe0><0xff>
如果我使用AES OFB,我将得到4字节的输出。
最高可能的4字节密文输出是<0xFF><0xFF><0xFF><0xFF>。
将其转换回整数,则为: 4294967295,即10位数字.
==>两位数太长了。
最后一件事-没有限制的长度,任何密钥/ IVs所需。
发布于 2009-12-08 22:31:22
使用AES/OFB或任何其他流密码。它将生成伪随机位的密钥流。通常,您会将这些位元与明文进行异或。相反:
For every decimal digit in the plaintext
Repeat
Take 4 bits from the keystream
Until the bits form a number less than 10
Add this number to the plaintext digit, modulo 10若要解密,请执行相同的操作,但在最后一步中减去。
我认为这应该和正常使用流密码一样安全。如果0-15的序列与随机数无法区分,那么只有小于10的数的子序列仍然是随机的。如果其中一个输入是随机的,使用加/减代替异或仍然会产生随机输出。
发布于 2009-12-08 22:09:30
我不是密码大师,但脑海中浮现出一个显而易见的问题:你会被允许使用一次Pad加密吗?然后,您只需在解码系统中包含一大块真正的随机位,并使用随机数据以可逆的方式转换您的十进制数字。
如果这是可以接受的,我们只需要弄清楚解码器如何知道在随机块中的位置,以获得对任何特定消息进行解码的密钥。如果您可以发送带有密文的明文时间戳,那么很容易:将时间戳转换为一个数字,例如自一个划时代日期以来的秒数,将该数字按随机块的长度进行模数,并且在该块中有一个偏移量。
如果有足够大的随机性块,这应该是不可破解的。您可以使用强加密对随机比特本身进行加密,这样用户必须输入一个长密码才能解锁解码器;这样,即使捕获了解密软件,也不容易破坏系统。
如果您对此感兴趣,并希望我进一步扩展,请告诉我。我不想花太多时间在一个根本不符合你需求的答案上。
编辑:好吧,带着小小的鼓励(“你可能发现了什么”),我在扩展我的答案。
我们的想法是,你可以得到一个随机的块。一个简单的方法就是从Linux /dev/random设备中提取数据。现在,我假设我们有一些方法可以为每条消息找到一个索引到这个随机性块。
索引到随机性块中,取出10个字节的数据。每个字节是从0到255之间的一个数字。将这些数字中的每一个添加到明文中的相应数字中,模乘10,您就有了密文的数字。只要有随机数据块和索引,就可以很容易地将其反转:获取随机位,并从密码数字You 10中减去它们。
您可以认为这是将0到9的数字排列在一个圆环中。加法是按顺时针方向计算,减去则是逆时针计数.您可以添加或减去任何数字,它将工作。(我最初的答案建议每位数只使用3位。)这还不够,正如下面的“Baffe”所指出的。(谢谢你的更正。)
如果纯文本数字为6,随机数为117,则: 6 + 117 == 123,模10 == 3.3- 117 == -114,模10 == 6。
正如我所说,如果可以使用外部明文信息(例如时间戳),那么查找索引的问题就很简单。即使你的对手知道你正在使用时间戳来帮助解码信息,如果没有随机性块,那也是没有好处的。
如果消息总是被传递,那么查找索引的问题也很容易;您可以有一个一致同意的生成一系列索引的系统,并且说“这是我收到的第四条消息,所以我在这个系列中使用了第四个索引。”作为一个简单的例子,如果这是收到的第四条消息,您可以同意使用16的索引值(第四条消息的索引值为4,每一次pad的索引值为4字节)。但是,您也可以使用已批准的伪随机数生成器中的数字,该生成器以约定的常量值初始化为种子,然后在随机性块中得到一些不可预测的索引序列。
根据您的需要,您可以拥有一大块真正的随机数据(数百兆字节甚至更多)。如果您使用10个字节作为一次性垫,而您从不使用重叠垫或重复使用垫,那么1MB的随机数据将产生超过100,000次的一次衬垫。
发布于 2009-12-08 23:15:15
一个潜在的候选是FFX加密模式,它最近被提交给了NIST。
https://stackoverflow.com/questions/1870047
复制相似问题