Eth*_*len 4 php encryption objective-c ios
我有一个PHP函数加密和解密字符串:
function encrypt_decrypt($action, $string)
{
$output = false;
$key = 'mykeyhereblah';
$iv = md5(md5($key));
if( $action == 'encrypt' ) {
$output = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, $iv);
$output = base64_encode($output);
}
else if( $action == 'decrypt' ){
$output = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, $iv);
$output = rtrim($output, "");
}
return $output;
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
echo encrypt_decrypt('decrypt', '2Fa9cICuUFa/UnmAAa5FjXZK4ht9q3cN2qgk1pCvDSs=');
Run Code Online (Sandbox Code Playgroud)
如何在iOS上使用Objective-C执行相同的操作NSString?它需要与此PHP函数兼容.
因此,您希望在CBC模式下使用AES256进行加密.你正在寻找的图书馆是CommonCrypto,你可以在这里找到一篇关于它的好文章:http://robnapier.net/aes-commoncrypto .
您还需要一个MD5功能,您可以在这里找到:http://www.makebetterthings.com/iphone/how-to-get-md5-and-sha1-in-objective-c-ios-sdk/
您的代码应如下所示:
NSString *originalString,*keyString;
NSData *key = [[self md5:keyString] dataUsingEncoding:NSUTF8StringEncoding];
NSData *iv = [[self md5:[self md5:key]] dataUsingEncoding:NSUTF8StringEncoding];
NSData *data = [originalString dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *cipherData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128]; //The block size of MCRYPT_RIJNDAEL_256 is just like AES128
size_t outLength;
CCCryptorStatus result
= CCCrypt(kCCEncrypt, // operation, replace with kCCDecrypt to decrypt
kCCAlgorithmAES, // Same as MCRYPT_RIJNDAEL_256
nil, // CBC mode
key.bytes, // key
32, // Since you are using AES256
iv.bytes,// iv
data.bytes, // dataIn
data.length, // dataInLength,
cipherData.mutableBytes, // dataOut
cipherData.length, // dataOutAvailable
&outLength); // dataOutMoved
NSString resultString = [cipherData base64Encoding];
Run Code Online (Sandbox Code Playgroud)
并确保在两种情况下使用相同的UTF8编码,并使用此导入:
#import <CommonCrypto/CommonCryptor.h>
Run Code Online (Sandbox Code Playgroud)
我很确定这应该有效.
编辑:密钥长度应为32,因为您使用AES256 256位= 32字节.我认为默认情况下MD5输出与此长度不匹配.