2017-03-14 18 views
0

私はthis codeを使用しています。暗号でメッセージを復号する際にエラーが発生しました

メインメソッド内ですべてのコードが1つのtryキャッチに含まれていても、別のクラスに分離され、復号化されたコードがSecurityオブジェクトを通じて呼び出されたときは機能しません。

私はクラスが正しく初期化されていないと推測しています。

エラー:

­¬Uˆ±‡Qœò|À'Zâ\\SEPERATION\\ javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:934) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845) at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314) at javax.crypto.Cipher.doFinal(Cipher.java:2165) at Security.decrypt(Security.java:62) at EncryptAndDecrypt.main(EncryptAndDecrypt.java:15) null

+2

コードに問題がある場合は、問題を示す[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を提供する必要があります。推測に時間を無駄にせずにお手伝いします。また、コードへのリンクを提供しないでください。代わりに、あなたの質問を編集してコードを含めるようにしてください。リンクは常に壊れていて、そうであれば、この質問はすべての価値を失います。 –

答えて

1

これはおそらく、符号化/復号化プロセスの問題です。 cipher.doFinal()の生のバイト出力を最初にBase64や16進のような堅牢なエンコーディングスキームにエンコードするのではなく、DES暗号化された暗号テキストをStringオブジェクトに格納します。 DES暗号化では、0x000xFF0〜255)の範囲の値を含む各バイトが出力されますが、この出力はStringに格納されます(実際には文字エンコーディングは指定されていません)US-ASCII,UTF-8、これはプラットフォームに依存し、Charset.defaultCharset()によって決定できます)。 Stringにエンコードされていないバイトを格納する問題は、Unicode、ASCIIなどで、0x00 - 0xFFのすべての値が有効な文字であるとは限りません。

このような理由から、最初に暗号テキストを16進数またはBase64でエンコードし、それをStringとして格納します。復号化するときは、エンコードを逆にして(つまり、デコードデコードする)、復号化を実行します。

+0

eli5?私は本当に暗号化のシーンを理解していません。 – irlhotboi

+0

UTF-8、ASCIIなどで表現されたデータは人間が読める形式です - 「Hello world」は実際にはバイトで、「0x48 0x65 0x6c 0x6c 0x6f ...」です。 「文字エンコーディング」に応じて、コンピュータはそれらのバイトを理解できる文字として表すことができます。各文字エンコーディングには、値がASCII、 '0x65' = 'e'の各文字を意味する定義リストがあります。すべての価値が何かを意味するわけではありません。 ASCIIでは0〜127の値しか定義されませんが、バイトは0〜255の値を保持でき、暗号化を実行すると元のデータの目的が何であるか気にしません。したがって、非常に高い確率があります... – Andy

+0

...暗号文のバイトの中には128〜255の値を持つものがあります。これらのバイトを 'String'に格納しようとすると、Javaは解釈方法を理解できませんそれら。値127の偶数は、ASCIIで「DEL」、または「delete」を意味します。他の「制御文字」も存在する。したがって、0〜255のあらゆる値に対して回復可能な解釈を保証する暗号化テキストを暗号化して保存する必要があります。これを行う2つの便利な方法は、[16進数](https://en.wikipedia.org/wiki/)です。 16進数)と[Base64](https://en.wikipedia.org/wiki/Base64)を参照してください。 – Andy

関連する問題