2013-03-15 61 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