openssl与RNDecryptor不兼容?

时间:2013-12-07 00:39:13

标签: objective-c encryption openssl

我正在尝试使用RNDecryptor执行解密。我所做的是从openssl加密操作中获取输出并尝试使用RNDecryptor对其进行解码。

此命令使用aes-256-cbc加密此字符串,密码为abc.123。然后呢 将输出转换为base64。

$ echo "This is good" | openssl enc -e -aes-256-cbc  -k abc.123 -md md5 -base64
U2FsdGVkX1+mgp+PlVPeyjiEJzkN6jWwN9z5CynnHu4=

我然后采取的base64字符串 “U2FsdGVkX1 + MGP + PlVPeyjiEJzkN6jWwN9z5CynnHu4 =”,并把它放进我的目标C程序...

NSString *b64Encrypted = @"U2FsdGVkX1+mgp+PlVPeyjiEJzkN6jWwN9z5CynnHu4=";
NSData *notB64 = [b64Encrypted base64DecodedData];
NSData *decryptedData = [RNDecryptor decryptData:notB64 withPassword:@"abc.123" error:&decryptionError];
if (decryptionError != nil) {
        NSLog([decryptionError debugDescription]);
}

结果是

Error Domain=net.robnapier.RNCryptManager Code=2 "Unknown header" UserInfo=0x102505ab0 {NSLocalizedDescription=Unknown header}

当我仔细查看数据时,这是我注意到的一些事情...... 从openssl开始,来自hexdump的数据如下所示......(注意我没有转换为base64)

~ $ echo "This is good" | openssl enc -e -aes-256-cbc  -k abc.123 -md md5 -out g.1
~ $ hexdump g.1
00000   53 61 6c 74 65 64 5f 5f   19 dd cc 48 19 9e c3 2c     Salted__...H...,
00010   16 1c 71 c5 c7 56 3b 97   c8 48 fc ae 7c 56 a1 91     ..q..V;..H..|V..

我注意到数据以“Salted__”开头,然后接下来的8个字节是盐。

当我使用RNEncryptor方法时,结果数据永远不会以使用openssl时看到的“Salted__”开始。它始终以十六进制值0x0201

开头
NSData *encryptedData = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:password
                                           error:&error];

所以我的问题是...... RNEncryptor / RNDecryptor正在做正确的事情,它是否与openssl兼容?

2 个答案:

答案 0 :(得分:1)

所以我发现了问题。基本上要与opessl兼容,请使用RNOpenSSLEncryptor类。

作为参考,RNDecryptor类在预期数据中有一个标题。前两个字节构成标题。第一个字节表示存在v1hmac或RNCrypterFileVersion。第二个字节是与第一个字节一起使用的选项。

因此,如果您想与opnssl兼容,请使用RNOpenSSLEnryptor/RNOpenSSLDecryptor类。

答案 1 :(得分:0)

OpenSSL添加了自己的盐。您可以在-nosalt命令中尝试enc选项。