如何在java中的AES encreption中将加密数组构造为大小16

如何在java中的AES encreption中将加密数组构造为大小16,java,aes,encryption,Java,Aes,Encryption,我想写一个字节数组,下面是mycode,它工作正常,但是 给出一个长大小的输出新字节数组,我希望输出数组应该 可能是16号的吗 byte[]keyForEncription=新字节[16]; 字节[]keyForDescription=新字节[16]; 长固定键=81985526925837671L; 长变量键=744818830; for(inti1=0;i1>(8*i1)); keyForEncription[i1+8]=(字节)(VariableKey>>(8*i1)); } 字节[]数据

我想写一个字节数组,下面是mycode,它工作正常,但是 给出一个长大小的输出新字节数组,我希望输出数组应该 可能是16号的吗

byte[]keyForEncription=新字节[16];
字节[]keyForDescription=新字节[16];
长固定键=81985526925837671L;
长变量键=744818830;
for(inti1=0;i1<8;i1++)
{
keyForEncription[i1]=(字节)(FixedKey>>(8*i1));
keyForEncription[i1+8]=(字节)(VariableKey>>(8*i1));
}
字节[]数据=新字节[255];
数据[0]=2;
数据[1]=0;
数据[2]=0;
数据[3]=0;
数据[4]=0;
数据[5]=6;
数据[6]=6;
数据[7]=81;
数据[8]=124;
数据[9]=123;
数据[10]=123;
数据[11]=12;
数据[12]=3;
数据[13]=27;
数据[15]=12;
数据[16]=0;
数据[17]=0;
数据[18]=0;
数据[19]=0;
System.out.println(“原始字节数组:”+Arrays.toString(数据));
SecretKeySpec skeySpec=新的SecretKeySpec(keyForEncription,“AES”);
Cipher cipher1=Cipher.getInstance(“AES/ECB/NoPadding”);
cipher.init(cipher.ENCRYPT_模式,skeySpec);
字节[]新字节数组=新字节[data.length];
新字节数组=cipher.doFinal(byteArray);
System.out.println(“加密数组:“+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, 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、116、-28、-47、-77、-103、-61、78、-50、-116、-124、-116、-48、-77、-103、-61、62、42、-124、-116、-47、-48、-53、-28、-77、-94、94、-78]


下面的代码在这里运行良好:

    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)

但这是意料之中的,因为没有使用填充。如果这是您得到的异常(而不是您的问题所说的“invalide key”),那么请修复输入数据的长度。否则,请在问题中粘贴准确完整的错误堆栈跟踪。

CFB的ECB?您的问题是ECB,您的代码是线程“main”javax.crypto.IllegalBlockSizeException中的CFB.Exception:com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:853)com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:827)com.sun.crypto.provider.CipherCore.doFinal中的输入长度不是16字节的倍数(CipherCore.java:675)在com.sun.crypto.provider.aesciper.engineDoFinal(aesciper.java:313)在javax.crypto.Cipher.doFinal(Cipher.java:2087)在EncriptTest.main(EncriptTest.java:66)上然后你知道该怎么做了。这与我的答案中的异常完全相同,我向你解释了为什么会得到它以及如何不得到它。顺便说一句,异常的信息说明了一切。请注意,它说的是“输入长度”,而不是“键长度”。将输入数据的长度更改为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)