2016-09-11 9 views
1

最近、AESの暗号化/復号化を試し始めました。 私の最初の実験はhereから引き出され、若干修正されました。AES暗号化/復号化で256ビット鍵の「不正な鍵サイズ」が返される

暗号化された文字列を生成し、16ビットのIVと256ビットのパスワード(この例で使用した元のパスワードは128ビットであり、それは私のために働いた)を使用して再度復号化しようとしました。 私もthis postと比較し、本当に私は以下に簡単なコードを実行しようとすると、私はこの例外を得続ける違い

を見ていない:

java.security.InvalidKeyException: Illegal key size 

マイコード:

public static void main(String[] args) throws Exception { 
     // byte [] key = "Bar12345Bar12345".getBytes("UTF-8"); // 128 bit key 
     byte[] key = Hex.decode("8ec8f262e96e3d80ef52b530a5bc7b7baaf6e4357a363119b0a636b2034e298e"); 
     byte[] iv = Hex.decode("a5e8d2e9c1721ae0e84ad660c472c1f3"); 
     System.out.print(Arrays.toString(key)); 
     System.out.println(key.length); 
     System.out.print(Arrays.toString(iv)); 
     System.out.println(iv.length); 

     System.out.println(decrypt(key, iv, encrypt(key, iv, "Hello World"))); 

    } 

    public static String encrypt(byte[] key, byte[] initVector, String value) { 
     try { 
      IvParameterSpec iv = new IvParameterSpec(initVector); 
      SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");/// CBC/PKCS5PADDING 
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 

      byte[] encrypted = cipher.doFinal(value.getBytes()); 
      System.out.println("encrypted string: " + Base64.encodeBase64String(encrypted)); 

      return Base64.encodeBase64String(encrypted); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return null; 
    } 

    public static String decrypt(byte[] key, byte[] initVector, String encrypted) { 
     try { 
      IvParameterSpec iv = new IvParameterSpec(initVector); 
      SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 

      byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted)); 

      return new String(original); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return null; 
    } 

全出力:

[-114, -56, -14, 98, -23, 110, 61, -128, -17, 82, -75, 48, -91, -68, 123, 123, -86, -10, -28, 53, 122, 54, 49, 25, -80, -90, 54, -78, 3, 78, 41, -114]32 
[-91, -24, -46, -23, -63, 114, 26, -32, -24, 74, -42, 96, -60, 114, -63, -13]16 
java.security.InvalidKeyException: Illegal key size 
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1034) 
    at javax.crypto.Cipher.implInit(Cipher.java:800) 
    at javax.crypto.Cipher.chooseProvider(Cipher.java:859) 
    at javax.crypto.Cipher.init(Cipher.java:1370) 
    at javax.crypto.Cipher.init(Cipher.java:1301) 
    at TestMain.encrypt(TestMain.java:76) 
    at TestMain.main(TestMain.java:66) 
java.security.InvalidKeyException: Illegal key size 
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1034) 
    at javax.crypto.Cipher.implInit(Cipher.java:800) 
    at javax.crypto.Cipher.chooseProvider(Cipher.java:859) 
    at javax.crypto.Cipher.init(Cipher.java:1370) 
    at javax.crypto.Cipher.init(Cipher.java:1301) 
    at TestMain.decrypt(TestMain.java:95) 
    at TestMain.main(TestMain.java:66) 
null 

は注意してください、その目出力の最後の 'null'は、mainの最後の行のSystem.outに出力された操作の結果です。

キー変数をコメント行( )(使用した例の元の128ビットキー)と交換すると、このコードは正常に動作します。

この例外がスローされる理由とその解決方法について考えてください。

答えて

2

256ビットキーを使用するには、JCEの無制限強度管轄ポリシーファイルをインストールする必要があります(http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.htmlを参照)。

+0

ありがとうございました。私はこれをインストールしようとしていましたが、そのファイルがすでに存在していたことに気づきました。だから私はそれをインストールしていないのです。 もう1つ: 移植性を維持するために、これらのファイルをjarアーカイブに保存することはできますか? – Omega1001

関連する問題