在另一个应用程序中解密时,CCCrypt失败

时间:2013-12-09 15:41:13

标签: objective-c encryption cryptography

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

有什么想法吗?

+(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 );
}

1 个答案:

答案 0 :(得分:0)

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