如何使用Objective-C在iOS上执行相同的加密/解密PHP功能?

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函数兼容.

Yot*_*nin 8

因此,您希望在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输出与此长度不匹配.

  • 需要明确的是:此代码不能用于以下几个原因:1.它不使用具有256位块大小的Rijndael; 2.密钥不够大,只有128位(而预期为256位),默认情况下mcrypt零填充到256位; 3.对于256位块大小,IV不够大(尽管这与CommonCrypto无关,因为它使用 - 在这种情况下 - 不正确的128位块大小),再次mcrypt零填充IV. (2认同)