是否有实现 AES-512 算法(即加密、解密)的 javascript 可用?我发现大多数 javascript 实现了 AES-128、AES-192、AES-256。
9 回答
Rijdael 密码有 128、160、192、224 和 256 位变体。高级加密标准选择了 128、192 和 256 位变体。128 位对称密钥被认为与 1024 位 RSA 密钥大致一样强,而 256 位对称密钥被认为与 2048 位 RSA 密钥大致一样强。在实践中,没有人使用 192 位 AES,因为他们要么关心性能和/或出口控制,要么使用 128 位,要么偏执地使用 256 位。
在公共使用中没有单一的 512 位对称密钥密码。基于 AES 的漩涡散列函数返回 512 位摘要,但这与 512 位 AES 密码不同。
我知道没有 512 位 AES 这样的东西。
来自维基百科:
在密码学中,高级加密标准 (AES) 是美国政府采用的加密标准。该标准包括三个分组密码,AES-128、AES-192 和 AES-256,这些密码取自最初以 Rijndael 发布的较大集合。
正如其他人提到的那样,由于“中间相遇攻击”给出的时间/空间权衡,双 AES-256 不提供 512 位的安全性(而不是 256+1 位的时间复杂度)。
但是我不相信有人正确回答了“如果它存在的话”AES-512 实际上会是什么。请注意,所有当前的 AES 变体都具有 128 位的固定块大小,因此 AES-512 如果存在,其块大小也只有 128 位(假设保持模式),因此不需要更改 MixColumns 或 ShiftRows子程序。
AES 标准在技术上支持扩展 AES 系统以使用 512 位密钥大小,如果您允许的话N_k>8
。请注意,AES 标准 FIPS-197 的设计主要与密钥大小无关。唯一缺少的是N_k=16
( 512 bit keys=16*'32 bit words'
) 的轮数。当前标准(第 14 页)分别指定N_r={10,12,14}
了轮次N_k={4,6,8}
。如下图所示N_r=N_k+6
。因此N_r=22
,如果N_k=16
......在没有其他需要更改的情况下定义后N_r=22
,N_k=16
只需使用给定的密钥预先填充密钥调度的前 512 位(如第 5.2 节中所述)并继续算法......
x (mod x^8+x^4+x^3+x+1)
唯一的限制因素可能是每个单词都乘以 Rcon[i] 的单词,N_k
因为它的周期为 51,然后开始重复。x^51=(1 mod x^8+x^4+x^3+x+1)
...但是使用的最大Rcon[i]
的是
i=(N_r+1)*N_b/N_k ; ((N_r+1)*N_b is the total size (in 4 octet words) of the key schedule)
i=(N_k+6+1)*N_b/N_k
i=(N_k+7)*4/N_k
i=4+28/N_k ; (correct... ignoring rounding issues (and probably an off by one error due to laziness))
所以这不是问题,因为随着密钥大小的增加,Rcon 的使用量会减少......
请注意,两次运行 AES256 并不等同于(未来的)AES512 加密。
比较:2^256 + 2^256 < 2^512
换句话说,暴力破解 2 256 位密钥所需的时间明显少于暴力破解单个 512 位密钥所需的时间。
(并不是说这两种攻击在当前硬件上都是可行的)
我认为可能可以扩展 AES,但美中不足的是可以说是移位和反向移位值,否则应该没有问题。因此,对于 512,您需要 4 行 16 列,但您需要计算出我之前所说的移位因子。对于 1024,您只需将列数增加一倍,但需要再次计算移位和反向移位。
AES 只是标准,它处理各种事情。其中之一是密码,称为 Rijndael。
它只是不可用并且定义为超过 256 位。
理论上,您可以将此密码扩展到更长的密钥长度,但是对于对称密钥密码来说,256 位密钥长度已经非常强大了。
不要被 RSA 密钥和非对称密码术所迷惑。它们要弱得多,具有相同密钥长度的求和密码的等效强度要强得多。如果您修改 Rijndael,您可能会犯很多错误,从而危及您的安全。256 位 AES 密钥的强度可能与 2048 位 rsa 密钥相当
但是你能做什么,如果你想把你的偏执狂提升到一个全新的水平,只需加密一些东西,然后再次加密它。加密两次有效地使密钥大小加倍。你仍然可以避免犯错。
我认为您可以使用 8 行 64 位数字,这样每一行都包含一个 64 位数字,您可以轻松地对其进行密钥添加。
左/右移位没有问题,因为您可以使用编写 *int64_t __lrotl(int64_t,int)* 和 *int64_t __lrotr(int64_t,int)* 的 64 位版本。唯一美中不足的是void mixcolumns()和void invmixcolumns()必须从 %4 更改为 %8 但我认为它不会起作用,但它似乎在理论上应该起作用。
AES-512 没有官方标准,但是,您只需使用两个不同的 256 位密钥运行 AES-256 两次即可轻松模拟其效果。
运行两次的主要问题是优化,尽管它可能不会特别影响 Javascript,因为它无论如何都不会使用硬件加密支持。考虑到这一点,最简单的方法将完全取决于您选择的库,因为大多数库在设计时并未考虑任何类型的流功能,因此您可能会对每个 256 位的数据进行两次单独的传递您的“512 位”密钥的一部分。
正如其他人所质疑的那样,更大的问题是为什么您需要真正的 512 位保护。256 位现在仍然足够,但是,如果您担心它,那么最好的办法是设计您的系统以接受可变长度密钥,并且只需为每个 256 位块运行一次;这样,您可以在以后觉得需要升级时通过发布/生成更大的密钥来增加大小。
您可以执行两次以增加加密。
例如,通过两次使用 AES-256 加密,您将拥有 256 位 Powered by 2 因此变为 65536 位加密。;) 我怀疑你是否会喜欢这方面的表现。128 位加密两次将是 16,384 位加密。你应该只使用一个密钥进行一次加密,如果你想加密两次,你必须有两个密钥进行两次不同的加密,我可以向你保证,任何人都很难突破这种加密。;)