php - 跨平台 AES 加密是如何工作的?

标签 php objective-c cryptography cross-platform aes

我已经能够在 php 和 objective-c 代码中成功加密和解密 AES-256。我不会在这里发布任何代码,因为我尝试了很多变种但都没有用。我不知道这些加密函数是如何工作的……AES 是一种标准化算法,所以为什么它在我的想法中不起作用归结为

a) iv
b) 一些编码错误
或者
c) 填充差异(应该与解密无关)。

如果有人拥有同时适用于 php 和 objective-c 的 AES 函数,那将是极好的,但如果没有,任何有助于理解导致这些不同结果的原因的帮助将不胜感激。

如果你想要一个更窄的问题,它是关于这个 AES 密码的编码、iv 和 block 大小。

1) 就 key 和明文/密文而言使用什么编码重要吗?基本上我猜这不是纯文本的问题,因为我将使用的所有字符(至少在测试期间)都是标准的 ASCII 符号。但是可以说 php 字符串是 ASCII,而我在 objective-c 中使用 UTF8 ...两者之间的 key 会有所不同。

2) 据我所知,ECB 模式不使用 iv(如果错误则更正)。 CBC 模式使用 iv。在这种情况下,iv 必须与密文一起记录。现在这个键在 php 中是 16 或 32 个字符长(取决于 128 和 256 block 大小)。这意味着 16 或 32 字节?字符串 1234567890123456789012 转换为字节时,ASCII 和 UTF8 中的字符串是否相同?

3) 就算法而言, block 大小和 key 大小有什么区别? (如果错误再次纠正)基本上它们都是相同的算法只是参数不同?使用 256 位 key 与 128 位 key 只是传递哪个 key 的问题

(另请注意,我一直使用 base64 编码在应用程序之间传输字符串以进行测试)

谢谢, 以利亚

最佳答案

要使解密正常进行,一切 必须完全相同。相同的键,相同的 IV,相同的模式。特别是 key 必须相同。字节字节相同。点点滴滴都一样。 AES 设计为即使 key 的一位不正确也无法正确解密。

看了你的问题,我怀疑你的问题出在key上。您的真正 key 不是字符,而是字节。在字符和字节之间进行转换有多种不同的方法,这可能会导致解密失败。您需要确定这两个键是逐字节匹配的,而不是逐字符匹配的。至少您需要明确说明使用的是什么映射。不要依赖系统默认值,因为它们可能因系统而异。

看看你的三个问题:

1) 对于纯文本编码,您将准确返回输入的内容:UTF-8 输入,UTF-8 输出。如果您想转换为不同的编码,则必须在解密后进行。

2) ECB 不需要 IV 是对的,但是 ECB 模式会泄露信息,应该避免。改用CBC或CTR模式,两端相同模式。 IV 与 block 大小相关,因此对于 AES,IV 始终为 16 字节或 128 位。您不能保证 ASCII 和 UTF-8 相同。 UTF 可能在开头有 BOM。 ASCII 可能在末尾有一个 C 风格的零字节。不要用字符来思考,要用字节来思考。一切都必须在字节级别匹配。在 CBC 模式下,错误的 IV 会破坏第一个 block ,但可以解密后续 block 。

3) AES 的 block 大小固定为 128 位,不能更改。 key 大小的限制较少,可以是 128、192 或 256 位。实际上,大多数人似乎使用 128 或 256 位。 block 是一个大小合适的处理单元,它以非常低的级别内置在密码中。 key 决定了在处理过程中对 block 做了什么。这为 key 提供了更大的灵 active 。您输入的 key 用于构建一些内部结构,即“圆形 key ”。这个过程称为“ key 扩展”。与正在处理的 block 交互的是轮 key 。因为 key 是间接使用的,所以它可以有多大的灵 active 。

关于php - 跨平台 AES 加密是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674749/

相关文章:

c# - CSP 未在远程桌面上检测到智能卡微型驱动程序

javascript - 带有 href 的 POST 请求

php - 在 JQVMAPS 中添加带有国家名称的实时时间

ios - 正在主线程上执行长时间运行的 Parse 操作

ios - 计算特定物体的视野角

cryptography - 我们可以有多个公钥和一个用于 RSA 的私钥吗?

php - 我什么时候编写自己的异常类?

php - 是否可以验证 Composer 中的供应商文件夹完整性?

ios - UIOffsetMake() 是使用传统的左上角原点 (0,0) 还是左下角原点?

c++ - AES 加密/解密文本