【问题标题】:CCCrypt fails when decrypting in another application在另一个应用程序中解密时 CCCrypt 失败
【发布时间】:2013-12-10 01:20:37
【问题描述】:

我的应用程序中有一些加密和解密类方法。我可以使用“密钥”加密“数据”,效果很好。我可以将该数据写入磁盘,然后稍后使用应用程序读取数据并调用 decryptWithKey 来解密数据块。一切都很好。但是,如果我将此 .m 类文件包含到另一个应用程序中,编译该应用程序并尝试解密使用第一个应用程序加密的相同数据,CCCrypt(decrypt) 调用失败......嗯,不完全是,它返回 Success但数据未解密。我已经比较了两个应用程序中的数据和键值,它们是相同的,精确到字节。

有什么想法吗?

+(BOOL)encryptWithKey:(NSMutableData*)data withKey:(NSString *)key
{
    CCCryptorStatus result = kCCSuccess;

   @try
    {
        char keyPtr1[kCCKeySizeAES256+1]; // room for terminator (unused)
        bzero( keyPtr1, sizeof(keyPtr1) ); // fill with zeroes (for padding)
        [key getCString: keyPtr1 maxLength: sizeof(keyPtr1) encoding: NSUTF8StringEncoding];
        size_t numBytesEncrypted = 0;
        size_t dataInLength = [data length];
        size_t dataOutLength = 18*dataInLength;

        [data setLength:dataOutLength];
        result = CCCrypt( kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
                                         (const void*)keyPtr1, kCCKeySizeAES256, 0 /* initialization vector (optional) */,
                                         [data mutableBytes], dataInLength, /* input */
                                         [data mutableBytes], dataOutLength, /* output */
                                         &numBytesEncrypted );
        [data setLength:numBytesEncrypted]; 
    }
    @catch (NSException *exception)
    {
        WDCATCH(exception);

    }
    return ( result == kCCSuccess );
}

+(BOOL)decryptWithKey:(NSMutableData*)data plaintext:(NSString**)plaintext withKey:(NSString *)key
{
    CCCryptorStatus result = kCCSuccess;

    @try
    {
        // 'key' should be 32 bytes for AES256, will be null-padded otherwise
        char  keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
        char szPlaintext[1024]={0};
        bzero( keyPtr, sizeof(keyPtr) ); // fill with zeroes (for padding)
        [key getCString: keyPtr maxLength: sizeof(keyPtr) encoding: NSUTF8StringEncoding];
        size_t numBytesEncrypted = 0;

        result = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                         (const void*)keyPtr, kCCKeySizeAES256,
                         0 /* initialization vector (optional) */,
                         [data mutableBytes], [data length], /* input */
                         szPlaintext,1024,// [data mutableBytes], dataOutLength, /* output */
                         &numBytesEncrypted );
        if (result == kCCSuccess)
        {
            szPlaintext[numBytesEncrypted] = 0;
            *plaintext = [[NSString alloc] initWithFormat:@"%s",szPlaintext];
        }
    }
    @catch (NSException *exception)
    {
        WDCATCH(exception);

    }   return ( result == kCCSuccess );
}

【问题讨论】:

  • 请注意,上面的代码非常不安全(详见robnapier.net/blog/aes-commoncrypto-564)。 18*dataInLength 也很奇怪。最多需要dataInLength+16,但这仍然可以解决(它太大了)。奇怪的是,您加密原始数据,然后期望解密 ASCII(甚至不是 UTF-8)字符串。当你说解密失败时,是numBytesEncrypted大于0吗?也许 %s ASCII 转换失败(尽管你应该得到垃圾)。当您说“不解密”时,实际症状是什么?
  • CCCrypt(kCCDecrypt)执行后,numBytesEncrypted(应该改名为numBytesDecrypted)为0,szPlainText为空,结果为=0/kCCSuccess。
  • 我做了更多的探索,看起来它可能与应用程序“A”有关,加密应用程序针对 OSX 10.7 部署/baseSDK 和应用程序 B,解密应用程序,针对 OSX 10.9 部署/baseSDK; @RobNapier,这会导致问题吗?

标签: objective-c encryption cryptography


【解决方案1】:

我不是 Objective-C 专家,但 decryptWithKey 中的 char szPlaintext[1024]={0}; 对我来说似乎很可疑。首先分配 1024 个字节,然后将指针分配给包含元素 0? 的数组。 plaintext 作为字符串的生成看起来也很可疑,但它可能适用于 ASCII 编码的纯文本 (?)。

【讨论】:

  • ={0};在声明中会将整个缓冲区初始化为 null/0,类似于 bzero 或 memset
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2018-08-30
  • 2020-12-14
  • 2019-11-09
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
相关资源
最近更新 更多