2017-10-27 8 views
0

暗号化されたデータを復号化しています。データが非常に限定的な情報であるとします。情報はtripledes_cbcアルゴリズムで暗号化されます。情報の暗号化に使用される秘密鍵は、rsaアルゴリズムで暗号化されています。NoPaddingスキームでtripledes_cbc暗号化を行った後にガベージを取得

しかし、DESede/CBC/NoPaddingアルゴリズムで情報を復号化しようとすると、元のデータが前面と最後に埋め込まれたガベージ文字とともに取得されます。

の代わりにDES/CBC/PKCS5Paddingを使用しようとすると、「最終ブロックが正しく埋められない」という例外が発生します。

以下はコードスニペットです。

 KeyStore ks = KeyStore.getInstance("jks"); 
     FileInputStream fis = new FileInputStream(ksFile); 
     ks.load(fis, "testing".toCharArray()); 

     PrivateKey privateKey = (PrivateKey) ks.getKey("keys", "1234".toCharArray()); 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, privateKey); 
     byte[] kekBytes = cipher.doFinal(Base64.decodeBase64(encKey.getBytes("UTF-8"))); 

     SecureRandom random = new SecureRandom(); 
     byte[] iv = new byte[8]; 
     random.nextBytes(iv); 

     SecretKey key = new SecretKeySpec(kekBytes, "DESede"); 
     Cipher cipher1 = Cipher.getInstance("DESede/CBC/NoPadding"); 
     cipher1.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); 
     byte[] out = cipher1.doFinal(Base64.decodeBase64(data.getBytes("UTF-8"))); 

     System.out.println("Data Length: " + out.length); 
     String result = new String(out, "UTF-8"); 
+1

1.新しい作業に3DESを使用しないでください.AESは、現在の対称的な使用方法です。しかし、私の推測では、これは学校プロジェクトであり、学校は現実世界の背後にある10年ほどです。 2. 16進数形式のデータ**の例を提供する**。 – zaph

+2

明らかに、暗号化側でどのようなパディングが使用されているかを調べる必要があります。また、DESまたはDESEDEを使用していますか? 'DES/CBC/PKCS5Padding'は' DESede/CBC/NoPadding'の賢明な選択肢ではないからです。おそらくあなたは 'DESede/CBC/PKCS5Padding'を意味しましたか? –

答えて

0

正しい部分が間違っていない場合は、正しいキーが正しいことをお知らせください。最初のブロックはおそらく暗号文に接頭辞として付けられたIVです。それを解読しようとすると、ゴミが出るでしょう。その後、IV自体は次のブロックのベクトルとして扱われるため、CBC暗号はそれ自体を修正して正しく処理します。理論的には、CBCはエラー伝播を制限しています

最後の部分は使用されているパディング方式です。試してみてください"DESede/CBC/PKCS5Padding"。それでもうまくいかない場合は、バイナリ値(実際には16進数でエンコードされたもの)を調べて、データをアンパッドできるように使用されているパディングスキームを調べる必要があります。

Java用の標準暗号化プロバイダには、多くの埋め込みスキームはないことに注意してください。したがって、あなたはプロバイダを見つける必要があります。または"NoPadding"を使用して自分自身をパディングしないで実行することができます。

オンラインプロトコルの場合は、パッディングのoracle攻撃、実際にAES/GCMやRSA/OAEPなどの最新のプロトコルについて学習する必要があります。

+0

復号化されたメッセージの16進表現からパディング文字を識別するにはどうすればよいですか? 16進数の結果は次のようになります(ここでは最初と最後の文字のみが表示されます): "5368f1b5beaa10ec3c6e73313a50617c6e656e7443616c6c6261636b496e707574 ..................... 7443616c6c6261636b496e7075743ec9de7dc99f437f08" –

+0

@ K.Nath何か不注意上記の16進数で符号化されたデータの不可視の文字は、8バイトのプリアンブルとそれに続く8バイトのASCIIコード化テキストです。なぜこれは間違っていると思いますか? – zaph

+0

@zaph - 出力が正しくないとは限りませんでした。私は、パッディングされたごみを除くテキストを抽出したかっただけです。最初の16文字(上記のコメント - '5368f1b5beaa10ec')を削除することで、出力文字列の先頭にパディングされたゴミを克服することができました。しかし、私は上記の最初の16文字を除いて出力文字列の末尾からガベージを削除することはできません。他の文字はすべてJavaコードを実行するたびに同じままです。 –

関連する問題