Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CCCryptor 3DES解密的前8个字节总是损坏?_Objective C_Ios_Cryptography - Fatal编程技术网

Objective c CCCryptor 3DES解密的前8个字节总是损坏?

Objective c CCCryptor 3DES解密的前8个字节总是损坏?,objective-c,ios,cryptography,Objective C,Ios,Cryptography,最近我实现了一个使用3DES的加密算法。然而,我发现4096数据块的前8个字节总是被损坏。但可以肯定的是,它可以在java中正确解密。以下是我的代码: + (void) DecryptBy3DES:(NSInputStream*)strmSrc Output:(NSOutputStream*)strmDest CryptoRef:(CCCryptorRef)tdesCrypto { size_t dataOutMoved; uint8_t inputBuf[Blo

最近我实现了一个使用3DES的加密算法。然而,我发现4096数据块的前8个字节总是被损坏。但可以肯定的是,它可以在java中正确解密。以下是我的代码:

+ (void) DecryptBy3DES:(NSInputStream*)strmSrc Output:(NSOutputStream*)strmDest CryptoRef:(CCCryptorRef)tdesCrypto
{       
    size_t  dataOutMoved;
    uint8_t inputBuf[BlockSize];
    uint8_t outputBuf[BlockSize];

    CCCryptorStatus cryptStatus;
    int iBytesRead = 0;
    int iBuffUsed = 0;

    while ( (iBytesRead = [strmSrc read:inputBuf maxLength:BlockSize]) > 0 ) 
    {
        cryptStatus = CCCryptorUpdate(tdesCrypto, &inputBuf, iBytesRead, &outputBuf, BlockSize, &dataOutMoved);
        assert(cryptStatus==noErr);
        [strmDest write:outputBuf maxLength:dataOutMoved];
    }

    CCCryptorReset(tdesCrypto, nil);
}
其中BlockSize为4096

我重用了CCCryptoRef tdesCrypto来解密几个块。要解密的第一个块是正确的,但是下面的块在开始时都有损坏的字节。我还尝试重置CCCryptoRef,这似乎是徒劳的


我真的很困惑。有人有同样的问题吗?

忘记我以前的答案,我把它删除了。缓冲区中出现错误字节的原因是,它们是您之前尝试解密的缓冲区的最后8字节纯文本

您必须在上次调用CCCryptoRuUpdate之后立即调用CCCryptorFinal。这将在写入最后几个字节的纯文本之前删除填充字节。因为密码在内部不知道最后一个缓冲区的最后一个块包含填充字节,所以它还不能将数据写入输出缓冲区

请不要在while循环中销毁或重置CCCryptor。只需在后面添加对CCCryptorFinal的调用,并且不要忘记将结果输出写入流。之后,您可以重置CCCryptor

我猜是CBC模式和PKCS5填充的DESede。看看我在说什么。

这是我的CryptoRef:

CCCryptorCreateWithMode(kCCEncrypt, kCCModeCBC, kCCAlgorithm3DES, ccNoPadding, [abIV bytes], [abKey bytes], [abKey length], nil, 0, 0, kCCModeOptionCTR_BE, &cryptRef);
因为我使用CBC模式和ccNoPadding,所以不需要调用CCCryptorFinal。相反,当我完成一个操作(即完成加密/解密一个文件等)时,我应该调用CCCryptorReset在下一个操作之前将CryptoRef的iv重置为初始状态。否则,第一个数据块将出现缺陷


感谢您的评论,很抱歉将此问题抛在脑后。我希望这能帮助遇到同样问题的人。

不要让我们猜测。原因是什么?错误IV?如果第一个块正确,则可能使用零IV。后续不正确的块可能使用错误模式。使用ECB解密的零IV CBC会出现这些症状。@rossum:似乎只有每个后续4KB缓冲区的前8个字节是错误的,如果使用ECB模式解密CBC加密的密码文本,这是不可能的。请不要使用块大小名称作为缓冲区大小。DESede块大小是并且将始终是8字节,因此您对该名称产生了很多混淆。试试BufferSize。@HubertWang:问题不仅仅是为了让你满意,也是其他用户寻找答案的一种方法。如果你有答案,请允许我们回答。如果我猜对了,也可以接受我的。很抱歉,我把这个问题留了这么久,没有提供足够的信息。我没有使用填充,而是使用CBC模式,因此我必须在下一次操作之前重置IV。无论如何,谢谢你的回答。