为什么 AES 的不同实现会产生不同的输出?

2023-12-01

我觉得我对哈希函数及其所涉及的契约有很好的理解。

输入 X 上的 SHA1 将始终产生相同的输出。您可以使用 Python 库、Java 库或笔和纸。它是一个函数,它是确定性的。我的 SHA1 与你的、Alice 和 Bob 的相同。

据我了解,AES也是一个函数。你输入一些值,它就会输出密文。

那么,为什么会担心 Truecrypt(例如)被“损坏”呢?他们并不是说 AES 被破坏了,而是说实现它的程序可能被破坏了。理论上,AES 是可靠的。那么为什么不能直接通过 Truecrypt 运行一个文件,通过“参考 AES”函数运行它,并验证结果是否相同呢?我知道它绝对不会那样工作,但我不知道为什么。

AES 与 SHA1 有何不同?当 Truecrypt AES 被给予所有相同的输入时,为什么它们可能会输出与 Schneier-Ifier* AES 不同的文件?

最后,我的问题归结为:

My_SHA1(X) == Bobs_SHA1(X) == ...等

但是 TrueCrypt_AES(X) != HyperCrypt_AES(X) != VeraCrypt_AES(X) 等等。这是为什么呢?所有这些程序是否都封装了 AES,但有不同的方法来确定初始化向量等内容?

*如果我曾经编写过一个文件加密程序,这将是我的文件加密程序的名称


在您给出的 SHA-1 示例中,该函数只有一个输入,并且在提供相同的输入数据时,任何正确的 SHA-1 实现都应该产生与任何其他实现相同的输出。

然而,对于 AES 来说,事情有点棘手,并且由于您没有具体说明“AES”的确切含义,因此这本身似乎可能是感知到的实现之间的差异。

首先,“AES”不是单一算法,而是一系列采用不同算法的算法钥匙尺寸(128、192 或 256 位)。 AES 也是一种分组密码,它采用 128 位/16 字节的单个块纯文本输入,并使用密钥对其进行加密以生成单个 16 字节输出块。

当然,在实际应用中,我们经常希望一次性加密超过16字节的数据,因此我们必须找到一种方法来重复应用AES算法,以便加密所有数据。天真地,我们可以将其分成 16 字节块并依次加密每个块,但这种模式(称为电子密码本或 ECB)结果是非常没有安全感。相反,各种其他更安全的modes通常使用,其中大多数需要初始化向量 (IV)这有助于确保使用相同密钥加密相同数据不会产生相同的密文(否则会泄漏信息)。

大多数这些模式仍然在固定大小的数据块上运行,但是我们经常想要加密不是块大小倍数的数据,因此我们必须使用某种形式padding,并且我们如何将消息填充到块大小的倍数长度也有各种不同的可能性。

因此,将所有这些放在一起,“AES”的两种不同实现应该产生相同的输出,如果all以下内容是相同的:

  • 明文输入数据
  • 密钥(以及密钥大小)
  • IV
  • 模式(包括任何特定于模式的输入)
  • Padding
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 AES 的不同实现会产生不同的输出? 的相关文章

  • 使用带有十六进制字符串的 CryptoJS

    我想连接到蓝牙设备 仅通过十六进制字符串进行通信 我需要编码一个 16 字节值 因此我也期望一个 16 字节的值 在我的实现中 CryptoJS 总是返回更长的结果 根据文档 不需要 IV 所有 16 字节数据必须使用当前存储在设备中的客户
  • 如何使用 Libsodium-PHP 加密/解密 AES

    我需要用 PHP 加密 解密数据 我对此完全陌生 但是我读到 Libsodium PHP 是 AES 加密的最佳工具 就像我研究过的其他 PHP 加密库一样 Libsoduim PHP 似乎几乎没有提供如何使用该库的文档 我能够找到 任何有
  • 在 React Native 和 Expo 中加密敏感数据

    我正在使用 React Native 开发一个移动应用程序Expo https expo io 提供安全解决方案 项目所有者希望在应用程序中存储敏感的授权密钥 用于与 REST 服务器通信并访问安全数据 他要求这些密钥至少是加密的 并且尽可
  • 让 java IAIK PKCS11 包装器适用于 nfast

    我正在尝试让 IAIK PKCS11 包装器与 nfast 一起使用 它总是期待 pkcs11wrapper 库文件并抛出错误 java lang UnsatisfiedLinkError pkcs11wrapper 在java libra
  • 将带有 md5 消息摘要和 DESede/CBC/PKCS5Padding 的 3DES 加密的 java 代码转换为 python

    我有这个工作java代码 它使用3DES加密对密码进行加密 import java security MessageDigest import java util Arrays import java util Base64 import
  • 在 .Net Core 上使用非对称密钥

    我正在尝试运行此示例中的代码 https learn microsoft com en us dotnet standard security how to store asymmetric keys in a key container
  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • 解密Javascript源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经编写了一段 JavaScrip
  • 用于加密的 Webauthn

    我们有一个 PWA 项目 我们想要实现客户端加密 我们希望将 Webauthn 用作与密码结合的第二因素 在后台我们使用随机生成的密钥来加密 解密数据库 该密钥与密码对称加密存储在服务器上 然而 我正在努力寻找一种使用 webauthn 向
  • xcode ios HMAC SHA 256 哈希

    所以我试图弄清楚如何在 ios 上执行 hmacshad256 哈希 因为这是我为我制作的 wcf 服务 api 所做的哈希 我一直在尝试寻找有关它的一些信息 但通常最终只会得到 SHA 256 哈希值 这是我唯一的参考资料 需要像在 Ja
  • 使用 .NET 加密和解密数字

    NET 使用 C 有哪些可用的加密技术 我有一个数值 我想将其加密为字符串表示形式 哪一款支持解密 加密 由 NET 框架 BCL 提供 而不是 C 语言提供 通常对字节进行加密 但那很好 数字很 容易表示为字节 并且输出字节可以通过以下方
  • 在 SQLite 中加密数据

    如何加密我的数据 就我研究的解决方案而言 有两种方法 使用android提供的算法加密数据 我使用android提供的 Cipher 来加密我的数据 但我在检索大量记录的数据时遇到问题 导致应用程序的性能显着降低 我对整个数据库进行了编码
  • 对 Java 安全性和 BouncyCastle API 感到茫然和困惑

    我一直在尝试理解 Java 的 BouncyCastle 加密 API 不幸的是 我发现 Java 密码学总体上被服务提供者接口和术语所掩盖 以至于我无法理解任何东西的实际作用 我已经尝试反复阅读必要的文档 但它仍然难以理解 引入了许多远远
  • 在 C# 中创建我的对称密钥

    一直在审查一些对称加密方法 我看到了很多在类中硬编码私有静态变量的示例 通常类似于 string key THISISYOURENCRYPTIONKEY 然后在更远的地方 代码使用它来加密 解密 抛开正确的实现 算法 策略以及存储它的位置
  • MCRYPT 的等效加密 - 保留客户端代码

    我正在使用以下代码使用 mcrypt 执行加密
  • Java - 使用数组中的值的replace()方法正在更改数组值?

    我正在做类似的事情 public static String list a b c d It gives me a NullPointeException if I didn t use static public String encry
  • 恢复 SQL Server 数据库 - 主密钥未打开

    我必须制作远程 SQL Server 数据库的本地副本 我通过使用 Management Studio 中的 任务 gt 备份 来完成此操作 然后 我在本地恢复了备份 该备份似乎包含了所有内容 表 用户 对称密钥和证书 当我尝试执行需要打开
  • 仅使用公钥在 HD 钱包中生成以太坊地址 (bitcoinj/web3j)

    我尝试为使用 bitcoinj 库实现的 HD 钱包密钥生成以太坊地址 但我感到困惑 DeterministicSeed seed new DeterministicSeed some seed code here null 1409478
  • 计算 RSA 128 位密钥长度需要多长时间? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在网上做了一些研究 似乎表明 RSA 加密的推荐密钥长度是 1024 位 但是我有一个问题 对于今天使用的普通计算机来说 计算 128 位 RSA
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI

随机推荐