Java 加密/解密字节数组>;256字节使用AES-128

Java 加密/解密字节数组>;256字节使用AES-128,java,encryption,Java,Encryption,下面的代码使用AES-128将字节数组源_数据加密为另一个字节数组加密的_数据,然后再次将其解密为解密的_数据。当字节数组大小为时,尝试使用DataInputStream.readFully(即,您只读取结果的一部分,这就是为什么您总是在while循环中调用InputStream.read)。“我缺少了什么?”密码算法的块长度?为什么?为什么没有静脉注射?为什么没有身份验证/MAC?@CodeInChaos我刚刚尝试了带IV的CBC(根据,问题仍然是一样的。@kv3980我的问题不是关于您当前的

下面的代码使用AES-128将字节数组源_数据加密为另一个字节数组加密的_数据,然后再次将其解密为解密的_数据。当字节数组大小为时,尝试使用
DataInputStream.readFully
(即,您只读取结果的一部分,这就是为什么您总是在while循环中调用
InputStream.read
)。

“我缺少了什么?”密码算法的块长度?为什么?为什么没有静脉注射?为什么没有身份验证/MAC?@CodeInChaos我刚刚尝试了带IV的CBC(根据,问题仍然是一样的。@kv3980我的问题不是关于您当前的问题,而是关于您为什么选择弱加密。@kv3980:欢迎您提出关于stackoverflow的第一个问题:)请不要将答案放在问题内,让网站来做这项工作——你似乎很好地找到了“接受”按钮。这确实是个问题。问题与密码填充或操作模式无关,只是与误用
DataInputStream
有关。我更新了上面的解决方案。我的“更新的解决方案”被回滚,所以简而言之,这就成功了:
dis.readfull(解密的_数据)
// Create data array with size greater 256 bytes
byte[] SOURCE_DATA = new byte[257];     
for (int i=0;i<SOURCE_DATA.length; i++) {
    SOURCE_DATA[i] = (byte)((i+1) & 0xff);
}

// Init ciphers
Cipher encC = Cipher.getInstance("AES/ECB/PKCS5Padding");
Cipher decC = Cipher.getInstance("AES/ECB/PKCS5Padding");
encC.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(new byte[] {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6}, "AES"));                  
decC.init(Cipher.DECRYPT_MODE, new SecretKeySpec(new byte[] {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6}, "AES"));          

// Encrypt
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(bos, encC);
DataOutputStream dos = new DataOutputStream(cos);

dos.write(SOURCE_DATA, 0, SOURCE_DATA.length);
dos.close();

byte[] ENCRYPTED_DATA = bos.toByteArray();

// Decrypt
ByteArrayInputStream bis = new ByteArrayInputStream(ENCRYPTED_DATA);
CipherInputStream cis = new CipherInputStream(bis, decC);
DataInputStream dis = new DataInputStream(cis);

byte[] DECRYPTED_DATA = new byte[SOURCE_DATA.length];
dis.read(DECRYPTED_DATA, 0, DECRYPTED_DATA.length);
cis.close();

System.out.println("Source Data:    "+toHex(SOURCE_DATA));
System.out.println("Decrypted Data: "+toHex(DECRYPTED_DATA));