如何将此解密功能从PHP转换为Objective C?

时间:2014-12-21 23:48:28

标签: php objective-c encryption base64 aes

我目前正在开展一项需要我解密数据的项目。我有一个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;
}

如果有人知道我做错了什么,我会很感激。

由于 /乔纳森

1 个答案:

答案 0 :(得分:0)

如果完全相同的输入且输入完全正确的长度,您将获得完全相同的结果。

一个问题:必须为每个使用相同的填充,但是你没有在解密中使用填充,你正在做一些外部的填充。