在 MacOS 上的 Objective-C 中解密使用 Windows .Net 中的 Rijndael 托管对象加密的字符串

问题描述

我有一些字符串是通过使用 Windows .Net 中 System.Security.Cryptography 中的 Rijndael Managed 类加密文本字符串生成的,我想在 MacOS 上使用 Objective C 对其进行解密。使用 CommCrypto.h 中定义的 CCCrypt 方法,在我使用 https://www.codegrepper.com/code-examples/objectivec/objective+c+encrypt+decrypt+string 中的代码提供 Windows 上使用的密钥和初始化向量(分别为 32 和 16 字节,包括一些 ASCII 代码 > 127)后,解密运行没有错误,如图所示下面,修改为为 IVKEY 设置其他值:

Nsstring *const IV = @"AEE0515D0B08A4E4";
Nsstring *const KEY =  @"9336565521E5F082BB5929E8E033BC69";


#import "SecurityUtils.h"


@implementation SecurityUtils


+ (Nsstring *)encrypt:(Nsstring *)plainText error:(NSError **)error {
    NSMutableData *result =  [SecurityUtils doAES:[plainText dataUsingEncoding:NSUTF8StringEncoding] context: kCCEncrypt error:error];
    return [result base64EncodedStringWithOptions:0];
}


+ (Nsstring *)decrypt:(Nsstring *)encryptedBase64String error:(NSError **)error {
    NSData *dataToDecrypt = [[NSData alloc] initWithBase64EncodedString:encryptedBase64String options:0];
    NSMutableData *result = [SecurityUtils doAES:dataToDecrypt context: kCCDecrypt error:error];
    return [[Nsstring alloc] initWithData:result encoding:NSUTF8StringEncoding];

}

+ (NSMutableData *)doAES:(NSData *)dataIn context:(Ccoperation)kCCEncrypt_or_kCCDecrypt error:(NSError **)error {
        CCCryptorStatus ccStatus   = kCCSuccess;
        size_t          cryptBytes = 0;
        NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeBlowfish];
        NSData *key =[KEY dataUsingEncoding:NSUTF8StringEncoding];
        NSData *iv = [IV dataUsingEncoding:NSUTF8StringEncoding];

        ccStatus = CCCrypt( kCCEncrypt_or_kCCDecrypt,kCCAlgorithmAES,kCcoptionPKCS7Padding,key.bytes,key.length,(iv)?nil:iv.bytes,dataIn.bytes,dataIn.length,dataOut.mutableBytes,dataOut.length,&cryptBytes);

        if (ccStatus == kCCSuccess) {
            dataOut.length = cryptBytes;
        }
        else {
            if (error) {
                *error = [NSError errorWithDomain:@"kEncryptionError"
                                             code:ccStatus
                                         userInfo:nil];
            }
            dataOut = nil;
        }

        return dataOut;
}


@end

但是,输出字节数组不包含原始文本,无法通过[[Nsstring alloc] initWithData:result encoding:NSUTF8StringEncoding转换为字符串。我做错了什么?

解决方法

问题出在初始值设置上。将 (iv)?nil:iv.bytes, 替换为 iv.bytes,,如下所示

ccStatus = CCCrypt( kCCEncrypt_or_kCCDecrypt,kCCAlgorithmAES,kCCOptionPKCS7Padding,key.bytes,key.length,iv.bytes,dataIn.bytes,dataIn.length,dataOut.mutableBytes,dataOut.length,&cryptBytes);

解决了问题。