2017-11-02 23 views
0

トークンの復号化に必要なトークンと秘密があります。私は何が間違っていて、「違法な鍵サイズ」を得続けているのか分かりません。私の鍵のサイズは44バイトです。静的ブロックにBouncyCastleProviderを追加しています。以下は、私がやろうとしていることの小さなスニペットです。DES/CBC/ZeroBytePaddingデータの復号化

SecretKeySpec skeySpec = new SecretKeySpec(keyText.getBytes(), "DES"); 
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC"); 
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8])); 
byte[] tokenData = des.doFinal(Base64.decodeBase64(token)); 

答えて

1

あなたのkeyTextはBase64でエンコードされていると思います。おそらく、それをデコードして32バイトのバイト[]を得るべきです。 Java 8では、次のようなことができます:

byte[] key = java.util.Base64.getDecoder().decode(keyText.getBytes()); 
SecretKeySpec skeySpec = new SecretKeySpec(key, "DES"); 
Cipher des = Cipher.getInstance("DES/CBC/ZeroBytePadding", "BC"); 
des.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[8])); 
byte[] tokenData = des.doFinal(Base64.decodeBase64(token)); 

この他の質問には、Base64に関する情報があります。 Converting Secret Key into a String and Vice Versa

私はまだあなたが無効なキーサイズのエラーを得るだろうと思う。 DESキーは56ビット(8パリティビット)ですか?だから、それは44バイトではなく8バイトにすぎず、32ビットではBase64をデコードしたときに得られると思います。

+0

はい、DESは8バイトのキーを使用します。 – zaph

+0

私は既にdoFinalでそれをデコードしています。 – Bytekoder

3

DESのキーサイズは8バイトで56ビットですが、各バイトのlsbはパリティ用に予約されていますが、通常は無視されます。

「キーのサイズは44バイトです」は間違っています。

次に、復号に使用されるIVは、暗号化に使用されたものと同じでなければなりません。 DESのブロックサイズは8バイトなので、IVは8バイトにする必要があります。 IVを処理する一般的な方法の1つは、暗号化されたデータに接頭辞を付けることであり、IVは秘密にする必要はありません。

最後に、ゼロ埋め込みは一般的には良い解決策ではありませんが、ゼロバイトで終了するバイナリデータはサポートしていません。 PKCS#5は一般に使用されるパディングです。

+0

ほとんどの場合、ゼロ埋め込みは悪い考えですが、(非トリプル)DESはずっと悪いものです。 –

+0

3DESをAESにスキップするのが最適ですが、現在の標準です。 – zaph

+0

私はゼロ埋め込みについてのあなたのコメントに同意しますが、それは単にレガシーシステムを持っており、それをさらに数日間使用する必要があるということだけです。したがって、問題は鍵と暗号化されたデータの両方でした。 – Bytekoder

関連する問題