【问题标题】:What is the difference between cipher algorithms AES and AES_128密码算法AES和AES_128有什么区别
【发布时间】:2020-01-14 01:32:48
【问题描述】:
【问题讨论】:
标签:
android
encryption
encryption-symmetric
【解决方案1】:
带有128-bit 键的AES 和AES_128 之间没有区别。
正如您在链接的文档中看到的那样,在 API 26 之前存在一个用于 AES 的原语,具有各种填充选项/操作模式。
为了让事情更简单,在API 26+ 中现在有两个原语可以通过明确的128-bit 或256-bit 键来消除AES 的用法的歧义。
如果您使用AES,则应选择AES-256 GCM,因为它提供经过身份验证的加密,确保密文不会在收件人不知情的情况下被篡改。
AES-GCM 使用 32 位计数器运行,因此不幸的是,使用相同的密钥、随机数 (IV) 对,您只能安全地加密 ~ 64GB 的数据 (2^39-256 bits)。
如果您想使用更安全的密码,我推荐XSalsa20 或XChaCha20,它们提供192-bit 随机数大小,有效地允许使用相同的密钥对几乎“无限”数量的数据进行加密, nonce 对。
【解决方案2】:
AES_128 不存在。但是,Java 中的常量通常不使用连字符 (-),因此下划线用于表示 AES-128(如果您问我,String 仍然是一个奇怪的选择)。
AES-128 只是 AES配置以使用 128 位密钥。在内部,它使用特定的子密钥推导和 10 轮。 AES-256 有不同的子密钥推导,使用 14 轮。 AES-192(12 轮)的使用不多,因为它的密钥大小很尴尬,并且不能完全防止可能适用于 AES-128 的攻击。
实际上,在一般用法方面可能存在两个差异。首先,在调用init 方法之前,API 可能能够选择 128 位或 256 位 AES 的实现。其次,我假设配置AES-128时init方法只接受128位密钥。