2013-03-15 57 views
0

我想encript一個字節數組下面是mycode的它工作正常,但 使長尺寸的輸出newByteArray我想outputed陣列應該 是大小圖16是有可能如何trucate的encripted數組大小16 AES encreption在java中

byte [] keyForEncription= new byte[16]; 
     byte [] keyForDecription= new byte[16]; 
     long FixedKey= 81985526925837671L; 
     long VariableKey=744818830; 
      for (int i1 = 0; i1 < 8; i1++) 
     { 

      keyForEncription[i1] = (byte)(FixedKey >> (8 * i1)); 
      keyForEncription[i1 + 8] = (byte)(VariableKey >> (8 * i1)); 
     } 


    byte[] data = new byte[255]; 

    data[0]= 2; 
    data[1]= 0; 
    data[2]= 0; 
    data[3]= 0; 
    data[4]= 0; 
    data[5]= 6; 
    data[6]= 6; 
    data[7]= 81; 
    data[8]= 124; 
    data[9]= 123; 
    data[10]= 123; 
    data[11]= 12; 
    data[12]= 3; 
    data[13]= 27; 
    data[15]= 12; 
    data[16]= 0; 
    data[17]= 0; 
    data[18]= 0; 
    data[19]= 0; 

    System.out.println("Original byte Array : " +Arrays.toString(data)); 

    SecretKeySpec skeySpec = new SecretKeySpec(keyForEncription, "AES"); 
    Cipher cipher1 = Cipher.getInstance("AES/ECB/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] newByteArray = new byte[data.length]; 
    newByteArray = cipher.doFinal(byteArray); 
    System.out.println("Encrypted Array : " +Arrays.toString(newByteArray)); 

這裏是輸出加密陣列:[110,-118,-119,-88,73,-118, 57,圖15,-52,-78, 100,104,102,-42,-102,-45,-50,-116,-47,-53, 103,-40,-61,6 2,42,15,-124,98,-28,-77,94,78,-50,-116,-47, -53,103,-40,-61,62,42,15,-124 ,98,-28,-77,94,78,-50,-116,-47,-53,103,-40,-61,62,42,15,-124,98,-28,-77, 94,78,-50,-116,-47,-53,103,-40,-61,62,42,15,-124,98,-28,-77,94,78,-50,-116 ,-47,-53,103,-40,-61,62,42,15,-124,98,-28,-77,94,78]

+0

CFB的ECB?你的問題說歐洲央行,你的代碼說CFB。 – 2013-03-15 10:36:37

+0

要設置ECB – Jivan 2013-03-15 10:39:44

回答

1

下面的代碼正常工作位置:

byte[] key = new byte[16]; 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

    byte[] data = "hello world.....".getBytes(); 
    byte[] encrypted = cipher.doFinal(data); 
    System.out.println("Encrypted Array : " + Arrays.toString(encrypted)); 

它不會與"hello world".getBytes()的工作,雖然,自輸入大小不是16的倍數:

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes 
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:854) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:828) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2086) 
    at com.foo.bar.CryptoTest.main(CryptoTest.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

由於沒有使用填充,所以期望使用Bute。如果這是你得到的例外(而不是你的問題所說的「無效鑰匙」),那麼請修正輸入數據的長度。否則,請在您的問題中粘貼確切且完整的錯誤堆棧跟蹤。

+0

異常在線程「主」 javax.crypto.IllegalBlockSizeException:輸入長度在com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:853)不是16個字節 \t多個 \t在玉米.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:827) \t在com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:675) \t在com.sun.crypto.provider.AESCipher .engineDoFinal(AESCipher.java:313) \t at javax.crypto.Cipher.doFinal(Cipher.java:2087) \t at EncriptTest.main(EncriptTest.java:66) – Jivan 2013-03-15 10:49:31

+0

然後你就知道該怎麼做了。這與我的回答中的例外情況完全相同,我向你解釋了爲什麼你得到它,以及如何得到它。順便說一下,這個例外的信息說明了一切。請注意,它顯示「輸入長度」而不是「密鑰長度」。 – 2013-03-15 10:51:05

+0

將輸入數據的長度更改爲16的倍數並解決問題 – Jivan 2013-03-15 11:01:26