我想通过加密它们而不提供额外的内存空间来保护一些寄存器。是否有一种加密算法可以保持要加密的数据的长度?(即plaintext.length=ciphertext.length)
是否有保持明文长度的非对称加密算法?
基本上,您要求的非对称密码的块大小可以等于您的消息或消息编码的字符大小(ASCII/UTF8 为 8 位,UTF-16 和 -32 分别为 16 和 32 位)。
Vanilla RSA 在技术上可以做到这一点;您必须简单地限制通过选择两个随机素数p和q产生的无符号整数N的位大小(因此p必须小于 sqrt( N ),并且可能的q值的域越小p越接近sqrt( N))。最大 N 可以与串联消息的数量级相同,也可以是它的某个除数(低至 1 个字节/字符)
然而,这有两个严重的问题:
- RSA 仅对非常大的密钥大小是安全的;它的困难在于找到产生N的p和q,因此包括 RSA 在内的任何加密的安全性都在于有一个字面上超出这个宇宙的可能密钥可供选择**。因此,只有从密钥大小的角度来看,如果消息至少有 256 个 ASCII 字符(生成允许安全大密钥的 2048 位消息),根据消息长度定制密钥大小才是安全的。小消息大小(密钥长度为 8-32 位)很容易被破坏;最坏的情况(对于攻击者),一个 32 位密钥需要找到一个素数p < sqrt(2 32 ) = 65536,它可以整除N; 根据素数定理,只有 5900 种可能性。你几乎可以用计算器“用手”破解这样的钥匙。
- 此外,更严重的是,没有适当加密填充的 RSA 很容易受到已知明文攻击,并且在某些情况下会简化为微不足道的例子。OAEP,黄金标准 RSA 填充方案,使用两个散列函数,其中一个的位长必须至少为明文消息的位大小,并且完整填充消息的长度等于两个函数的散列之和消息长度,因此填充的消息将始终大于未填充的消息。
因此,具有定制密钥大小的普通 RSA 方法应被视为存在根本缺陷。我能找到的所有其他公钥系统,例如椭圆曲线加密,都具有基于用于加密的数学的类似限制。
**2048 位是 X.509 数字证书的最小推荐密钥大小。2 2048 ~= 3.2317e616。从这个数字来看,普朗克体积是 4.22419e-105 m 3;理论上,这个单位是宇宙的颗粒“分辨率”,基于普朗克长度是任何仪器可以测量的最小距离。可观测宇宙的半径至少在 1e27 m 量级(137 亿光年),所以我们可观测宇宙的球面约为 4.189e79 m 3 ~= 1.7e185 Pl 3. 这意味着,如果我们不仅可以“数星星并按名称命名”,而且可以为我们可观测宇宙的每一个颗粒分配一个序数,那么我们需要的数字数量比数字数量少 400 个十进制数字RSA 密钥空间中固有的。
严格来说,没有安全的非对称加密可以保持明文的长度。问题是公钥是公开的,每个人都知道。因此,每个人都可以“尝试”潜在的明文并对其进行加密,以查看结果是否与加密后的文本匹配。这是对明文而不是密钥的详尽搜索,它之所以有效,是因为明文具有某种“含义”,因此具有结构。例如,如果对银行订单进行加密,金额和目的地账户的可能组合只有几十亿,这可以进行穷举搜索。
为了防止这个问题,一个安全的非对称加密算法不能是确定性的:加密过程必须包括一些随机性,以便给定的明文,用给定的公钥加密,可能会产生大量可能的密文。这就是例如在 RSA 中发生的情况,如PKCS#1所定义:明文首先用随机字节填充。当然,在解密时,填充会被明确地检测和删除。
非确定性必然意味着可能的密文集合远大于可能的明文集合;换句话说,密文必然大于明文。
至少,大小开销可以通过通常的混合加密方法保持恒定(固定增量,而不是与输入消息长度成比例的大小增加) :您不对称地加密随机字节序列K,然后将其用于明文的对称加密。就此而言,您可以将非对称加密替换为密钥交换机制;如果您的大小预算有限,我建议您查看椭圆曲线 Diffie-Hellman:使用标准 P-256 曲线,您可以将每条消息的开销保持在 32 字节。
使用 RSA,假设要加密的消息比密钥长,您可以降低一点(PKCS#1 v1.5 填充意味着至少 11 个字节的开销;使用 2048 位 RSA 密钥,您可以使用 RSA 加密消息的前 229 字节和 16 字节的对称密钥,然后将该密钥用于具有 AES-CTR 的消息的其余部分;这将是 27 字节的开销)。
听起来您正在寻找“格式保留加密”,如果您以前没有看过 FPE,请查看关于它的 wiki 文章。它有很多很好的参考。
http://en.wikipedia.org/wiki/Format-preserving_encryption
我不确定是否存在诸如非对称格式保留加密之类的东西……但是,当您搜索该术语时,围绕它的讨论很多。
我怀疑你的标题行有错字。如果“不对称”是“对称”,那么我的答案是:所有典型的分组密码都满足您的条件。如果块长度对您的应用程序来说是个问题,您可以使用流加密。(我不知道任何满足您条件的非对称加密算法。我什至认为这是不可能的。)