1

最近、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をリセットしようとしましたが、これは無駄に思えます。

私は本当に混乱しています。誰もが同じ問題を抱えていますか?

4

2 に答える 2

0

以前の回答を忘れて、削除しました。バッファで「間違ったバイト」を取得する理由は、それらが以前に復号化しようとしたバッファのプレーン テキストの最後の 8 バイトであるためです。

への最後の呼び出しの直後に呼び出す必要があります。これにより、プレーン テキストの最後の数バイトを書き込む前に、パディング バイトが削除されます。暗号は、最後のバッファの最後のブロックにパディング バイトが含まれていることを内部的に認識していないため、まだ出力バッファにデータを書き込むことができません。CCCryptorFinal()CCCryptorUpdate()

while ループ内で CCCryptor を破棄またはリセットしないでください。呼び出しをCCCryptorFinal()直後に追加するだけで、結果の出力をストリームにも書き込むことを忘れないでください。その後、CCCryptor をリセットできます。

ここでは、CBC モードと PKCS#5 パディングを使用した DESede を想定 (推測) しています。私が話していることを確認するには、ウィキペディアを参照してください。

于 2012-05-08T21:03:38.783 に答える