无法在iOS中解密Base64编码的AES-256-CBC加密字符串,始终导致nil字符串

时间:2016-12-12 09:50:41

标签: php ios objective-c encryption cryptography

我正在从服务器检索加密数据,加密是使用PHP中的以下代码完成的:

$password = '1234567890123456';

$iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encryptedString = openssl_encrypt('I am a testing string', "AES-256-CBC", $password, 0, $iv);

$json['encrypted_feed'] = base64_encode($iv . $encryptedString);
$json['iv'] = base64_encode($iv);

echo json_encode($json);

然后在以下JSON对象中从服务器检索数据之后:

{
    "encrypted_string":"IRcqgAMvXlEm17wUwrwwmE5NRmVrbUlpSEp4NUpta2JNdmMrdzhFOVVzRFR4bkVXUjluMVJwaXNYYTA9",
    "iv":"IRcqgAMvXlEm17wUwrwwmA=="
}

然后在我的iOS应用程序中,我尝试用各种方法解密它:

1。使用CommonCrypto tools here中的实用程序:

** responseObject是一本字典

NSString *password = @"1234567890123456";
NSData *pwData = [password dataUsingEncoding:NSUTF8StringEncoding];

NSString *base64FeedStr = [responseObject objectForKey:@"encrypted_feed"];
NSString *base64IVStr = [responseObject objectForKey:@"iv"];

NSData *base64FeedData = [[NSData alloc] initWithBase64EncodedString:b64FeedStr options:0];
NSData *base64IVData = [[NSData alloc] initWithBase64EncodedString:base64IVStr options:0];

NSData *decryptedFeedData = [b64FeedData decryptedDataUsingAlgorithm:kCCAlgorithmAES key:password initializationVector:b64IVData options:kCCOptionPKCS7Padding error:nil];

NSString *result = [[NSString alloc] initWithData:decryptedFeedData encoding:NSUTF8StringEncoding];

在此之后,我还尝试删除开头附带的IV数据,然后按照上面的解密顺序进行,但结果保持不变。

2。使用BBAES toos here

// According to the header:
// @param iv: the IV used to encrypt the data or nil if the encryption uses the `BBAESEncryptionOptionsIncludeIV` parameter
// i.e. the IV is saved along with the ciphertext (the IV is stored as the first block of the encrypted data).

// I also tried passing the IV into it but no luck.
NSData *resultData = [BBAES decryptedDataFromString:b64FeedStr IV:nil key:pwData];

NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];

我还尝试在php中使用AES-128,但结果保持不变,即生成的NSString中为nil

我对密码学只有非常浅薄的理解。经过所有这些调整后得到相同的结果,我感到沮丧,没有关于哪个部分出错的想法。

如果有任何关于如何解密和检索原始字符串的见解,我将非常感激。非常感谢!

1 个答案:

答案 0 :(得分:0)

  1. MCRYPT_CAST_256指定弃用的Cast加密算法,而不是AES。

  2. 请勿使用Cast,请使用AES

  3. AES是MCRYPT_RIJNDAEL_128(mcrypt没有说清楚)。

  4. 在加密期间使用IV并将其添加到加密数据之前。不必在解密时使用。 Base64解码,拆分IV和加密数据。

  5. 最好使用完整的跨平台库,例如RNCryptor。从加密原语很难获得加密的正确性和安全性。