2016-10-15 8 views
0

私は、組み込みのライブラリを使用してJavaでDESをコード化しましたが、正しい暗号化結果が得られません。 0e329232ea6d0d73
テキスト:8787878787878787
暗号化: ' - M^MUE +' +©ôËÓ-
Java DES誤った暗号化

-m^MUE私はキーの間違い

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
import javax.xml.bind.DatatypeConverter; 

public class MainClass { 

    public static void main(String[] args) { 

     String l = "0e329232ea6d0d73"; 

     byte[] a = DatatypeConverter.parseHexBinary(l); 

     try{ 
      DESKeySpec dks = new DESKeySpec(a); 
      SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
      SecretKey sk = skf.generateSecret(dks); 
     Cipher c = Cipher.getInstance("DES"); 
     c.init(Cipher.ENCRYPT_MODE, sk); 
     String M = "8787878787878787"; 
     byte[] b = c.doFinal(M.getBytes()); 

     System.out.println(new String(b)); 
     c.init(Cipher.DECRYPT_MODE, sk); 
     System.out.println(new String(c.doFinal(b))); 
     } 
     catch(Exception e) 

     { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 

進16桁を作っていますどこに私を教えてください

必要な暗号化:

:0000000000000000

は、これは私がオンライン計算機で暗号化された出力の答えが0000であると言っています、と私は完全に異なっているものです0

Image

+0

希望の結果はどういう意味ですか?暗号化されたメッセージまたは暗号化されたメッセージが必要ですか? –

+0

希望する暗号化メッセージ –

+0

http://www.emvlab.org/descalc/ 私はこの計算機と私の結果を一致させていました。それは私の –

答えて

1

変更

byte[] b = c.doFinal(M.getBytes());

また、あなたのコードで使用するモードECB(あなたは、あなたの写真でECBをマークしているため)。同様に:

Cipher c = Cipher.getInstance("DES/ECB/NoPadding"); 

String.getBytes()は、結果を新規バイト配列に格納し、プラットフォームのデフォルト文字セットを使用してバイトシーケンスに文字列をエンコードします。長さの配列であるあなたのケース16の含む値ではあなたが必要なもの8787...

56 55 56 55...ASCII表現はバイナリに六角8787...に変換されます。

+0

私の人生を保存するためのありがとう男..それは私のために働いた。 私は別の質問があります。どのように私は通常の文字列をヘキサに変換するだろう –

+0

あなたは[Javaで文字列を16進数に変換する]を意味する(http://stackoverflow.com/questions/923863/converting-a-string-to-hexadecimal-in-java)? –

+0

@ user2747596 "プラットフォームのデフォルトの文字セット"はおそらくあなたが望むものではないでしょう。特にそれが変わる可能性があり、あなたが何がわからないのならば、あなたのテキストを解読しなければならない人物とは通信できません。 –

1

データは16進数8787878787878787であり、バイナリに変換する必要があります。 `

+0

しかし、そのメソッドはbyte [] –

+0

を受け取ります。hax文字列を 'byte []'データに変換します。 – zaph

+0

あなたは Mをヘキサバイナリに変換しましたか? –

0

オンライン計算機への入力は、データ変換を意味する16進数で表されます。コードで16進数の変換を実行していません。ASCIIで10進数を入力するだけです。

byte[] b = c.doFinal(DatatypeConverter.parseHexBinary(M));

+0

私のコードにHexをどうやって提供するのですか? –

+0

実際には16進数のASCIIは10進数ではなく、バイナリが必要です。 – zaph

+1

@zaphこれは、受信者がそれを扱う場合は、それが何であるかにかかわらず、「16進ASCII」のみです。バイナリは、暗号化の入力として必要ですが、16進数はバイナリの表現です。 ASCIIの下位10桁もバイナリの表現ですが、この場合は誤ったバイナリ値です。 – EJP

関連する問題