gpt4 book ai didi

ios - 不同的 AES 加密器给我不同的结果……为什么?

转载 作者:行者123 更新时间:2023-11-28 11:49:40 24 4
gpt4 key购买 nike

我尝试过使用三个不同的库来对字符串进行 AES 加密。

当我使用工具时 found here我得到以下结果:

Input: "Test" 
key: "MyEncryptionKey1MyEncryptionKey1" (256 Bit)
ECB mode.

这给了我输出 Cidor8Ph7pZqPw0x2AwIKw==

但是当我在 Swift 中使用这些库时,我得到了不同的结果。

使用 RNCryptor

当我使用 RNcryptor 时,我使用以下代码:

class func encryptMessage(message: String) throws -> String {
guard let messageData = message.data(using: .utf8) else { return message }
let cipherData = RNCryptor.encrypt(data: messageData, withPassword: key)
return cipherData.base64EncodedString()
}

输出:AwF8a+HziYkO4iHdcI3jY8p9QAY461DVgkjkYUFMkuh4A2a8FCfa4RgS9Z37QhJGxIL0Q20RE3BL4nmLQVFOfZmBpj8l0wj9YZgqZmrkxRFYQQ==

使用 AESCrypt

当我使用 RNcryptor 时,我使用以下代码:

class func encryptMessageAES(message: String) -> String{
guard let encryptedData = AESCrypt.encrypt(message, password: key) else { return message }
return encryptedData
}

输出:T5/mR8UT/EXeUobPTLhcFA==

此外,如果我使用 CryptoSwift,我会得到第三个结果。我做 Android 的同事总是得到相同的结果 - 匹配网络工具。

我对加密完全陌生,我发现我做错了什么。但我真的不明白是什么。我还应该提到,对于那些有权访问数据库的人,这种加密仅用于在 Firebase 中不显示原始字符串中的聊天消息。

最佳答案

AES 的定义非常精确,当不同实现之间无法正常工作时,通常是因为在 AES 之上构建了各种东西。 AES 算法本身总是对二进制数据进行操作。您加密的数据需要是二进制的。您用来加密的 key 必须是二进制的,如果正在使用 IV,它也必须是二进制的。

在您向实现提供非二进制数据的所有实现中,已选择如何将数据转换为可与 AES 一起使用的格式。有时,这些转换只是简单的数据转换,如十六进制或 base64 解码,但其他时候会出现全新的概念,如从密码中导出加密 key 。

您的所有三个示例都使用文本作为 Key 的输入,并且每个实现都对如何支持它做出了一些选择。

您链接到的第一页已选择仅将 ASCII 字符串解释为二进制 key 。这是一个糟糕的选择,因为它(除了与其他所有内容不兼容之外)有效地消除了 key 的每个字节 1-2 位,从而大大降低了强度。

RNCryptor 示例中,您使用 withPassword: key 指定 key 。这里 RNCryptor 团队选择使用 PBKDF2 key 派生函数来制作实际的 AES key 。这解决了一个不同的用例,您有一个潜在的弱密码需要 stretching加密是安全的。如果您有一把真正的 key ,这不是要走的路。

AESCrypt 的情况下,您似乎还提供了一个密码作为输入。目前尚不清楚如何将其转换为实际 key 。

关于ios - 不同的 AES 加密器给我不同的结果……为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com