2016-12-13 48 views
-2

32バイトのキーを持つAES 256を使用してXMLメッセージを暗号化する必要があります。私は(http://aesencryption.net/から)次のことを試してみました:AES 256 32バイトキー暗号化/復号化Java

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 
import org.apache.commons.codec.binary.Base64; 
/** 
Aes encryption 
*/ 
public class AES 
{ 

    private static SecretKeySpec secretKey ; 
    private static byte[] key ; 

    private static String decryptedString; 
    private static String encryptedString; 

    public static void setKey(String myKey){ 


     MessageDigest sha = null; 
     try { 
      key = myKey.getBytes("UTF-8"); 
      System.out.println(key.length); 
      sha = MessageDigest.getInstance("SHA-1"); 
      key = sha.digest(key); 
      key = Arrays.copyOf(key, 16); // use only first 128 bit 
      System.out.println(key.length); 
      System.out.println(new String(key,"UTF-8")); 
      secretKey = new SecretKeySpec(key, "AES"); 


     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



    } 

    public static String getDecryptedString() { 
     return decryptedString; 
    } 
    public static void setDecryptedString(String decryptedString) { 
     AES.decryptedString = decryptedString; 
    } 
    public static String getEncryptedString() { 
     return encryptedString; 
    } 
    public static void setEncryptedString(String encryptedString) { 
     AES.encryptedString = encryptedString; 
    } 
    public static String encrypt(String strToEncrypt) 
    { 
     try 
     { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 

      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 


      setEncryptedString(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8")))); 

     } 
     catch (Exception e) 
     { 

      System.out.println("Error while encrypting: "+e.toString()); 
     } 
     return null; 
    } 
    public static String decrypt(String strToDecrypt) 
    { 
     try 
     { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 

      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      setDecryptedString(new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)))); 

     } 
     catch (Exception e) 
     { 

      System.out.println("Error while decrypting: "+e.toString()); 
     } 
     return null; 
    } 
    public static void main(String args[]) 
    { 
       final String strToEncrypt = "My text to encrypt"; 
       final String strPssword = "C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE6C76A5C1F1716E"; 
       AES.setKey(strPssword); 

       AES.encrypt(strToEncrypt.trim()); 

       System.out.println("String to Encrypt: " + strToEncrypt); 
       System.out.println("Encrypted: " + AES.getEncryptedString()); 

       final String strToDecrypt = AES.getEncryptedString(); 
       AES.decrypt(strToDecrypt.trim()); 

       System.out.println("String To Decrypt : " + strToDecrypt); 
       System.out.println("Decrypted : " + AES.getDecryptedString()); 

    } 

    } 

私は16から32にキー配列な長さを変更しようと、より大きな入力文字列を使用
を(私はそれが32な長さのキーだと思う)が、それは動作しません。 。

key = Arrays.copyOf(key, 32); 

暗号化するメッセージは、のように簡単になります:暗号化するときに

エラー:java.securityを私は次の例外を取得することを実行すると

<Estructure> 
    <General>GENERAL DATA</General> 
</Estructure> 
<Datos> 
    <DATE>20140606</DATE> 
</Datos> 

.InvalidKeyException:不正なキーサイズまたはデフォルトパラメータ

16バイトのLenghtキーを使用すると完全に機能します。どうすれば32バイトで動作させることができますか?

+2

あなたのJRE/JDKにjarファイルを配置する必要があり、ここで質問がありますか? 「うまくいかない」というのは受け入れられない。 –

+0

例外はどこにありますか? – Vadim

+0

投稿が編集されました。 256ビットのキー(32バイト)を使用しようとすると、例外が発生します。 128ビット(16バイト)を使用すると、同じコードが完全に機能します。どうすれば修正できますか? –

答えて

1

デフォルトでは、Oracleは米国の管轄下で動作しているため、JVMでは128ビット以上の暗号化は無効になっています。

あなたは128以上のビットの暗号化をしたい場合は、Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Downloadをダウンロードして

+0

ありがとうございました!私はそれを試みるつもりです! –

+0

それは私のためにそれを解決しました。しかし、私は[Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files 7]をダウンロードする必要がありました。From:[1]:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html –