Iphone iOS上的AES-256加密不会产生与openssl相同的结果

Iphone iOS上的AES-256加密不会产生与openssl相同的结果,iphone,ios,openssl,aes,commoncrypto,Iphone,Ios,Openssl,Aes,Commoncrypto,我已经看了好几个小时了。我拼命想让iOS使用AES-256加密对一小段文本进行加密,然后通过openssl对其进行解密 直截了当?没有 我发现iOS的代码与openssl的密钥和IVs不兼容,所以我不得不对其进行修改,但显然不起作用 这是我正在使用的加密代码。。。传入字符串以加密(dataString)字符串密钥(key)和字符串初始化向量(iv) 对于要编码的相同字符串,这不会产生与使用具有相同密钥和iv。。。e、 g.此命令行: openssl enc -aes-256-cbc -e -in

我已经看了好几个小时了。我拼命想让iOS使用AES-256加密对一小段文本进行加密,然后通过openssl对其进行解密

直截了当?没有

我发现iOS的代码与openssl的密钥和IVs不兼容,所以我不得不对其进行修改,但显然不起作用

这是我正在使用的加密代码。。。传入字符串以加密(dataString)字符串密钥(key)和字符串初始化向量(iv)

对于要编码的相同字符串,这不会产生与使用具有相同密钥和iv。。。e、 g.此命令行:

openssl enc -aes-256-cbc -e -in secrets.txt -a -iv 0000 -K 0000 -p
secrets.txt只是一个包含要加密的字符串的文本文件

这将输出如下内容:

salt=3C66000000000000
key=0000000000000000000000000000000000000000000000000000000000000000
iv =00000000000000000000000000000000
qTMfgtAxbF8Yyh27ZDrcIQ==
要解密,请执行相反的操作(假设上面加密的最后一行数据在test.secrets.out中)

openssl enc-aes-256-cbc-d-in-test.secrets.out-a-iv 0000-K 0000-p
盐=3C66000000000000
key=0000000000000000000000000000000000000000000000000000000000
iv=00000000000000000000

现在,如果我使用4个字符的键和iv,这在iOS中编码不正确。如果我使用全长键和iv,这也不能正确编码

基本上,这是一个检查,看看如果我发送一段加密数据,它是正确的数据

我错过了什么

一些代码我已经看过,试图找到一个答案

在这里也进行了广泛的搜索,但找不到答案

非常感谢您的帮助。

OpenSSL有一种独特的(读作“不接近任何标准,也不特别安全”)方法将密码转换为IV和密钥。如果您查看,您将看到使用的算法:

// For aes-128:
//
// key = MD5(password + salt)
// IV = MD5(Key + password + salt)

//
// For aes-256:
//
// Hash0 = ''
// Hash1 = MD5(Hash0 + Password + Salt)
// Hash2 = MD5(Hash1 + Password + Salt)
// Hash3 = MD5(Hash2 + Password + Salt)
// Hash4 = MD5(Hash3 + Password + Salt)
//
// Key = Hash1 + Hash2
// IV = Hash3 + Hash4
//

// File Format:
//
// |Salted___|<salt>|<ciphertext>|
//
//对于aes-128:
//
//key=MD5(密码+salt)
//IV=MD5(钥匙+密码+盐)
//
//对于aes-256:
//
//Hash0=''
//Hash1=MD5(Hash0+Password+Salt)
//Hash2=MD5(Hash1+Password+Salt)
//Hash3=MD5(Hash2+Password+Salt)
//Hash4=MD5(Hash3+Password+Salt)
//
//Key=Hash1+Hash2
//IV=哈希3+哈希4
//
//文件格式:
//
//|腌制___|||
//
使用
RNOpenSSLCryptor
允许
RNCryptor
支持OpenSSL格式。我目前正在重新编写分支上的代码以支持异步操作,该分支还不支持OpenSSL,但我确实计划很快(到2012年7月中旬)重新编写该代码

如果您想要实现此功能的代码供自己使用,请查看
keyForPassword:salt:
IVForKey:password:salt:


请注意,OpenSSL文件格式有几个安全问题,如果可以避免的话,我不推荐使用它。它没有使用非常好的KDF来生成密钥,没有像它应该的那样随机的IV,并且没有提供用于身份验证的HMAC。这些安全问题就是我设计a的原因,就像我讨厌创建“另一个不兼容的容器”一样。

看看你是否可以让IOS解密它加密的内容。同意Hot Clicks,但是如果他试图使用IOS加速例程在本地加密,通过SSL连接到其他东西,那么。。。。。我注意到SSL使用AES的CBC模式。您确定已将iOS设置为CBC模式吗。AES以128位数据块处理数据块,也许值得研究iOS是以小端还是大端解释输入数据。这也适用于密钥和IV。另一个注意事项是,您可能还需要查看最后一个128位块的数据填充方式(如果数据未在128位绑定上对齐)。热舔:是-已检查它是否解密了我加密的内容。这似乎不是问题所在。。。尽管这里不需要解密数据。特朗普利克斯:我们已经研究了填充和小/大端。。。虽然我不确定我是否知道如何详细了解这一点。该代码纯粹是为了提供一个加密的数据包以及一个带有共享私钥的HTTP POST操作。这样,另一端可以检查数据是否被篡改。所以不需要解密之类的。
openssl enc -aes-256-cbc -d -in test.secrets.out -a -iv 0000 -K 0000 -p 
salt=3C66000000000000
key=0000000000000000000000000000000000000000000000000000000000000000
iv =00000000000000000000000000000000
< text of the secrets.txt file >
// For aes-128:
//
// key = MD5(password + salt)
// IV = MD5(Key + password + salt)

//
// For aes-256:
//
// Hash0 = ''
// Hash1 = MD5(Hash0 + Password + Salt)
// Hash2 = MD5(Hash1 + Password + Salt)
// Hash3 = MD5(Hash2 + Password + Salt)
// Hash4 = MD5(Hash3 + Password + Salt)
//
// Key = Hash1 + Hash2
// IV = Hash3 + Hash4
//

// File Format:
//
// |Salted___|<salt>|<ciphertext>|
//