我见过的许多加密技术都可以轻松加密一个简单的8位数字,如“12345678”,但结果通常类似于“8745b34097af8bc9de087e98deb8707aac8797d097f”(组成但你明白了)。
有没有办法对这个8位数字进行加密,但得到的加密值是相同的,还是至少只是稍长的数字?理想的目标是以10位数或更少的数字结束。这仍然可以保持相当强的加密吗?
更新:我没有让输出足够清晰 - 我想要一个8位数字变成8位数字,而不是8字节。
答案 0 :(得分:4)
这里的很多内容取决于你对“公钥加密”标签的重视程度。你真的想要公钥加密,还是只考虑这种可能性?
如果您愿意使用对称加密,那么从8个字节的输入产生8个字节的输出非常简单:只需在ECB(电子代码簿)模式下运行3DES,这就是您将获得的。 ECB的主要弱点是给定的输入总是产生相同的结果,因此如果您的输入可能重复,攻击者将能够看到重复,并且可能能够注意到“加密值X导致行动Y”的模式“,即使他们根本不能/不打破加密本身。如果您能忍受,3DES / ECB可能就是您的答案。
如果你不能忍受,CFB模式下的3DES可能是次佳的。这将从8个字节的输入产生16个字节的输出(请注意,它通常不会使输入大小加倍,而是在输入大小上增加8个字节)。
3DES几乎不是任何人所说的尖端算法,但我认为它仍然可以称为“相当强大的加密”。它作为算法的一部分弱点源于其相对较小的块大小,但也最小化了输出的扩展。
编辑:对不起,我忘记了公钥的可能性。对于大多数公钥加密,最小的结果大致等于密钥大小。使用RSA加密,这通常意味着最小的1024位(通常远远超过1024位)。为了保持较小的结果,我可能会使用Elliptical Curve Cryptography,对于已知的攻击,~200位密钥可以相当安全。这仍然会比3DES / CFB更大,但并非如此。答案 1 :(得分:2)
那么你可以看一个加密字节1:1的流密码。输入N个字节时,有N个字节加密/解密输出。这些密码通常基于创建随机数流的算法,加密密钥/ IV充当种子。
对于某些流密码,请查看eSTREAM candidates。例如,我不知道对HC-128和HC-256的任何相关攻击。