2011/08/28

[java]鍵が違うのに同じ結果になるなあ

こんなソースを書いた。
いや、書いたというのはおこがましい。
こちらの記事のソースファイルをまるまるコピーして一部書き換えただけだ。
http://www.trustss.co.jp/Java/JEncrypt122.html


追加したのは、秘密鍵SecretKeyのところ。
鍵が違えば、復号しても失敗するよね、というのを見たかったのだ。

   1: import java.util.Arrays;
   2:  
   3: import javax.crypto.Cipher;
   4: import javax.crypto.SecretKey;
   5: import javax.crypto.SecretKeyFactory;
   6: import javax.crypto.spec.DESedeKeySpec;
   7:  
   8: public class CipherTest {
   9:  
  10:     /**
  11:      * @param args
  12:      */
  13:     public static void main(String[] args) {
  14:         try {
  15:             /*
  16:              * 鍵
  17:              */
  18:             SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
  19:  
  20:             // 秘密鍵1を準備
  21:             byte[] key1 = "12345678abcdefgh12345678".getBytes();
  22:             DESedeKeySpec dk1 = new DESedeKeySpec(key1);
  23:             Arrays.fill(key1, (byte)0x00);
  24:             SecretKey sk1 = kf.generateSecret(dk1);
  25:             dk1 = null;
  26:  
  27:             // 秘密鍵2を準備
  28:             byte[] key2 = "12345678abcdefgh12345679".getBytes();
  29:             DESedeKeySpec dk2 = new DESedeKeySpec(key2);
  30:             Arrays.fill(key2, (byte)0x00);
  31:             SecretKey sk2 = kf.generateSecret(dk2);
  32:             dk2 = null;
  33:  
  34:             kf = null;
  35:  
  36:             /*
  37:              * 暗号化
  38:              */
  39:             // 暗号化準備
  40:             Cipher c = Cipher.getInstance("DESede/ECB/NoPadding");
  41:  
  42:             c.init(Cipher.ENCRYPT_MODE, sk1);
  43:             byte[] cleartext = "abcdefghijklmnop".getBytes();
  44:             // 暗号化
  45:             byte[] encrypted = c.doFinal(cleartext);
  46:  
  47:             /*
  48:              * 復号1
  49:              */
  50:             // 復号準備
  51:             c.init(Cipher.DECRYPT_MODE, sk1);
  52:             // 復号
  53:             byte[] output = c.doFinal(encrypted);
  54:  
  55:             // 表示
  56:             System.out.println("[sk1]The string was ");
  57:             System.out.println(new String(output));
  58:  
  59:             /*
  60:              * 復号2
  61:              */
  62:             // 復号準備
  63:             c.init(Cipher.DECRYPT_MODE, sk2);
  64:             // 復号
  65:             byte[] output2 = c.doFinal(encrypted);
  66:  
  67:             // 表示
  68:             System.out.println("[sk2]The string was ");
  69:             System.out.println(new String(output2));
  70:  
  71:         } catch (Exception e) {
  72:             e.printStackTrace();
  73:         }
  74:     }
  75: }

結果

   1: [sk1]The string was 
   2: abcdefghijklmnop
   3: [sk2]The string was 
   4: abcdefghijklmnop

 

あれ?
違う鍵で復号させたのに、正しい結果が出てしまった。

12345678abcdefgh12345678

12345678abbdefgh12345678→一致
12345678abddefgh12345678→不一致
12345678accdefgh12345678→一致
12345678adcdefgh12345678→不一致

文字位置とずらし方に関係がありそうだ。

03254769`cbedgfi03254769→一致

うーん、何か間違ってるのかなぁ・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。