gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:33:36 30 4
gpt4 key购买 nike

最近我正在实现一个使用 3DES 的加密算法。但是,我发现4096数据 block 的前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 来解密几个 block 。第一个被解密的 block 是正确的,但后面的 block 都在开头有损坏的字节。我还尝试重置 CCCryptoRef,这似乎是徒劳的。

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

最佳答案

忘了我之前的回答,我把它删掉了。您在缓冲区中得到“错误字节”的原因是它们是您之前尝试解密的缓冲区的最后 8 个纯文本字节。

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

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

我假设(猜测)DESede 使用 CBC 模式和 PKCS#5 填充。参见 wikipedia看看我在说什么。

关于objective-c - CCCryptor 3DES 解密的前 8 个字节总是损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10491898/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com