【问题标题】:How to use CCCrypt() to encrypt a file?如何使用 CCCrypt() 加密文件?
【发布时间】:2011-07-30 16:41:17
【问题描述】:

当我加密文件(doc、pdf 等)时,我使用:

size_t bufferSize = dataLength + kCCBlockSizeAES128;    
CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                 keyPtr, kCCKeySizeAES256,
                                 NULL /* initialization vector (optional) */,
                                 dataBytes, dataLength, /* input */
                                 buffer, bufferSize,/* output */
                                 &numBytesEncrypted );

解密时,我使用:

size_t bufferSize = dataLength + kCCBlockSizeAES128;
CCCryptorStatus result = CCCrypt( kCCDecrypt, kCCAlgorithmAES128,    kCCOptionPKCS7Padding,
                                 keyPtr, kCCKeySizeAES256,
                                 NULL /* initialization vector (optional) */,
                                 dataBytes, dataLength,/* input */
                                 buffer, bufferSize,/* output */
                                 &numBytesEncrypted );

但是解密时返回错误:kCCDecodeError = -4304。

如果我在解密时删除 kCCOptionPKCS7Padding 的参数,则没有错误。但是文件也打不开。

那么,你能告诉我如何传递这些参数吗?

非常感谢!

【问题讨论】:

    标签: iphone objective-c ios ipad


    【解决方案1】:

    这用于加密

        NSString *key =@"YourKey";
        char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
        bzero( keyPtr, sizeof(keyPtr) ); // fill with zeroes (for padding)
    
        // fetch key data
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
        char *dataIn = "This is your data";
        char dataOut[500];// set it acc ur data
        bzero(dataOut, sizeof(dataOut));
        size_t numBytesEncrypted = 0;
    
        CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,  keyPtr,kCCKeySizeAES256, NULL, dataIn, strlen(dataIn), dataOut, sizeof(dataOut), &numBytesEncrypted);
    

    这是为了解密

    char dataOut2[500];
    bzero(dataOut2, sizeof(dataOut2));
    size_t numBytesDecrypted = 0;   
    
    CCCryptorStatus result = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding, keyPtr,kCCKeySizeAES256, NULL, dataOut, numBytesEncrypted, dataOut2, sizeof(dataOut2), &numBytesDecrypted);
    

    【讨论】:

    • 加密时不检查 CCCryptorStatus。你确定它有效吗?另外,如何创建“缓冲区”。是基于bufferSize的吗?
    • 通过 NSString 从字符串派生密钥是一个相当棘手的过程。因为一个 char 字节通常有很多前导零,并且在您的 AES 密钥中放置了很多零。 IOS 提供了一个不错的密钥派生算法,如此处所述stackoverflow.com/questions/8569555/…
    【解决方案2】:

    换行

    bzero(dataOut, sizeof(dataOut2));
    

    bzero(dataOut2, sizeof(dataOut2));
    

    感谢因德

    【讨论】:

      【解决方案3】:

      好的,我明白了!也测试成功了。该行应该是:

      CCCrypt(kCCDecrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding, keyPtr,kCCKeySizeAES256, NULL, dataOut, numBytesEncrypted, dataOut2, sizeof(dataOut2), &numBytesDecrypted);
      

      【讨论】:

      • 您好,请分享完整代码。我也在尝试文件加密和解密。这里有什么 dataIn 和 dataout。它的文件路径?如何在ios设备中进行测试。我是 ios 的新手。请帮我。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2011-06-21
      • 2012-06-18
      相关资源
      最近更新 更多