我目前正在开展一项需要我解密数据的项目。我有一个PHP版本工作,并希望将其移植到我的iOS项目。
这是工作的php函数:
public function decryptCBC($data, $key, $iv) {
// Decode the key and IV.
$iv = base64_decode($iv);
$key = base64_decode($key);
// Decrypt the data.
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
在目标C中,这是我尝试但尚未成功的
- (NSData *) decryptCBC:(NSData*)data WithKey:(NSString *)key andIv:(NSString *)iv {
NSData *keyData = [[NSData alloc] initWithBase64EncodedString:key options:0];
NSData *ivData = [[NSData alloc] initWithBase64EncodedString:iv options:0];
key = [[NSString alloc] initWithData:keyData encoding:NSASCIIStringEncoding];
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr)); // fill with 0s - padding
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0 ,
keyPtr, kCCKeySizeAES128,
[ivData bytes],
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
NSData *response = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted-1];
return response;
}
free(buffer); //free the buffer;
return nil;
}
如果有人知道我做错了什么,我会很感激。
由于 /乔纳森
答案 0 :(得分:0)
如果完全相同的输入且输入完全正确的长度,您将获得完全相同的结果。
一个问题:必须为每个使用相同的填充,但是你没有在解密中使用填充,你正在做一些外部的填充。