【问题标题】:Encrypt/decrypt byte array > 256 bytes using AES-128使用 AES-128 加密/解密字节数组 > 256 字节
【发布时间】:2012-07-03 20:35:54
【问题描述】:

以下代码使用 AES-128 将字节数组 SOURCE_DATA 加密为另一个字节数组 ENCRYPTED_DATA,然后再次将其解密为 DECRYPTED_DATA。对于

输出:

源数据:...fbfcfdfeff0001
解密数据:...fbfcfdfeff0000

代码:

// 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));            

【问题讨论】:

  • “我错过了什么?”密码算法的块长度?
  • 为什么选择欧洲央行?为什么没有静脉注射?为什么没有身份验证/MAC?
  • @CodeInChaos 我刚刚尝试了带有 IV 的 CBC(根据this post,问题仍然存在。
  • @kv3980 我的问题不是关于你眼前的问题,而是关于你为什么选择弱加密。
  • @kv3980:欢迎来到 stackoverflow 上的第一个 问题 :) 请不要将答案放在问题中,让网站完成工作 - 你找到了“接受" 按钮看起来不错。

标签: java encryption


【解决方案1】:

尝试使用DataInputStream.readFully(即您只读取部分结果,这就是为什么您总是在while循环中调用InputStream.read)。

【讨论】:

  • 这确实是问题所在。该问题与密码填充或操作模式无关,而只是与DataInputStream 的滥用有关。我更新了上面的解决方案。
  • 我的“更新的解决方案”被回滚了,简而言之,这成功了:dis.readFully(DECRYPTED_DATA);
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2013-08-12
  • 2013-08-11
  • 2019-05-08
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多