Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 不同的AES加密机给我不同的结果。。。为什么?_Ios_Swift_Encryption_Aes - Fatal编程技术网

Ios 不同的AES加密机给我不同的结果。。。为什么?

Ios 不同的AES加密机给我不同的结果。。。为什么?,ios,swift,encryption,aes,Ios,Swift,Encryption,Aes,我尝试使用三个不同的库对字符串进行AES加密 当我使用该工具时,我得到以下结果: Input: "Test" key: "MyEncryptionKey1MyEncryptionKey1" (256 Bit) ECB mode. 这给了我输出cidor8ph7pzqpw0x2awkw== 但是当我使用Swift中的库时,我得到了不同的结果 使用RNCryptor 当我使用RNcryptor时,我使用以下代码: class func encryptMes

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

当我使用该工具时,我得到以下结果:

Input: "Test" 
key: "MyEncryptionKey1MyEncryptionKey1" (256 Bit)
ECB mode.
这给了我输出
cidor8ph7pzqpw0x2awkw==

但是当我使用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()
}
class func encryptMessageAES(message: String) -> String{
    guard let encryptedData = AESCrypt.encrypt(message, password: key) else { return  message }
    return encryptedData
}
输出:
AwF8a+HziYkO4iHdcI3jY8p9QAY461DVgkjkYUFMkuh4A2a8FCfa4RgS9Z37QhJGxIL0Q20RE3BL4nmLQVFOfZmBpj8l0wj9YZgqZmrkxRFYQQ=

使用AESCrypt 当我使用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()
}
class func encryptMessageAES(message: String) -> String{
    guard let encryptedData = AESCrypt.encrypt(message, password: key) else { return  message }
    return encryptedData
}
输出:
T5/mR8UT/EXeUobPTLhcFA==

另外,如果我使用的是
CryptoSwift
,我会得到第三个结果。我的同事做安卓的时候总是得到同样的结果——匹配网络工具


我对加密一无所知,我发现我做错了什么。但我真的不知道是什么。我还应该提到,这种加密仅用于在Firebase中不显示原始字符串中的聊天消息,供有权访问数据库的人使用。

您还必须在AES中设置另一个值,即
iv
。所以试着在所有三个库中找到
iv
。并尝试为
iv
设置相同的值。然后您可以从所有库中获得相同的结果。

在AES中还需要设置一个值,即
iv
。所以试着在所有三个库中找到
iv
。并尝试为
iv
设置相同的值。然后,您可以从所有库中获得相同的结果。

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

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

您的三个示例都使用文本作为键的输入,每个实现都在如何支持这一点上做出了一些选择

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

RNCryptor示例中,您使用
withPassword:key
指定密钥。在这里,RNCryptor团队选择使用PBKDF2密钥派生函数来生成实际的AES密钥。这解决了一个不同的用例,在这个用例中,您可能有一个需要加密的安全密码。如果你有一把真正的钥匙,这不是办法


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

AES的定义非常精确,当不同的实现之间出现问题时,通常是由于在AES的基础上构建了不同的东西。AES算法本身总是对二进制数据进行操作。加密的数据必须是二进制的。您用来加密的密钥需要是二进制的,如果有IV,它也需要是二进制的

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

您的三个示例都使用文本作为键的输入,每个实现都在如何支持这一点上做出了一些选择

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

RNCryptor示例中,您使用
withPassword:key
指定密钥。在这里,RNCryptor团队选择使用PBKDF2密钥派生函数来生成实际的AES密钥。这解决了一个不同的用例,在这个用例中,您可能有一个需要加密的安全密码。如果你有一把真正的钥匙,这不是办法


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

我猜那些不接受iv值的函数每次都会生成一个随机值,这可以解释不同的值……我猜那些不接受iv值的函数每次都会生成一个随机值,这将解释不同的值…算法、键、模式和填充。为了实现互操作性,您必须匹配这四个加密参数。您只需要注意匹配算法和密钥,但模式和填充也很关键。此外,密钥派生函数(如何从给定的输入密码短语中精确获得所需的密钥位数)、IV、MAC/HMAC以及生成的二进制流的形成方式完全取决于实现。算法、密钥、模式和填充