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



我有一些字符串是通过使用Windows.Net中System.Security.Cryptography中的Rijndael托管类加密文本字符串生成的,我想在MacOS上使用Objective C解密这些字符串。使用CommCrypto.h中定义的CCCrypt方法,在我使用https://www.codegrepper.com/code-examples/objectivec/objective+c+加密+解密+字符串,如下所示,修改为设置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.bytes,替换(iv)?nil:iv.bytes,,如下所示

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

解决了问题。

相关内容

  • 没有找到相关文章

最新更新