AES加密:InvalidKeyException异常:密钥长度不是128/192/256位

20
我正在尝试在Android上使用AES加密字符串。对称密钥先前是用Diffie-Hellman算法确定的,并且似乎没问题(密钥长度为128位,如下所示)。然而,我收到了一个"InvalidKeyException:“密钥长度不是128 / 192 / 256位。”的错误信息。
代码:
KeyAgreement keyAgree = KeyAgreement.getInstance("DH", "BC");
keyAgree.init(this.smartphonePrivKey);
keyAgree.doPhase(serverPubKey, true);
SecretKey key = keyAgree.generateSecret("AES");
System.out.println("Key Length: " + key.getEncoded().length);
System.out.println("Key Algorithm: "+ key.getAlgorithm());
System.out.println("Key Format: "+ key.getFormat());

byte[] encrypted = null;
  Cipher cipher;
  try {
   cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   System.out.println("Allowed Key Length: "
     + cipher.getMaxAllowedKeyLength("AES"));
   cipher.init(Cipher.ENCRYPT_MODE, key);
   encrypted = cipher.doFinal("YEAH".getBytes("UTF8"));
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  } catch (NoSuchPaddingException e) {
   e.printStackTrace();
  } catch (InvalidKeyException e) {
   e.printStackTrace();
  } catch (IllegalBlockSizeException e) {
   e.printStackTrace();
  } catch (BadPaddingException e) {
   e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
上面的代码将导致以下输出:
_12-10 20:24:53.119: INFO/System.out(757): Key Length: 128_  
_12-10 20:24:53.119: INFO/System.out(757): Key Algorithm: AES_   
_12-10 20:24:53.119: INFO/System.out(757): Key Format: RAW_  
_12-10 20:24:53.470: INFO/System.out(757): Allowed Key Length: 2147483647_ 

之后,我遇到了InvalidKeyException: Key length not 128/192/256 bits. 但是您可以看到,SecretKey的长度为128位!

有什么想法吗?

2个回答

33

你生成的密钥长度是128 字节,而不是128 。 "密钥长度" 应该是 16。


+1 你比我先说了。@Peter:唯一能找到表示位数的Length属性将是一个专门的位集合。99.9%的情况下,它将是字符或字节的计数。 - Paul Sasik
嗯,你显然是正确的。因此,使用KeyAgreement.generateSecret(“AES”)返回长度为128字节的密钥。显然,那太多了……我该如何获得一个256位的密钥?谢谢。 - Peter
@Peter - 如果你只是在自己之间交换消息,那么你可以只使用共享密钥的前16个字节。通常,共享密钥会与其他信息一起进行哈希处理,以生成实际的对称密钥。如果你需要互操作,你就必须找出是否应该使用类似RFC 2631的东西来生成密钥。你也可能在使用ECB时遇到问题。它只在有限的条件下才是安全的。 - erickson
使用SHA-256对共享密钥进行哈希处理解决了问题。现在我可以使用这个密钥了。不过,我还需要更仔细地研究ECB... - Peter
你的意思是使用这个 SecretKey key = keyAgree.generateSecret("ECB"); 吗? - Ahmad Arslan

12

这个异常基本上是由于您传递给加密的密钥长度而导致的。如果您正在使用AES加密,则字符数必须为128/192/256位长度。 例如,您可以使用16个字符、24个字符或32个字符的密钥。

String encrypted_data=AES.encrypt("HELLO","ASDFGHJKLASDFGHJ");

希望这可以帮助到您...


1
不,这扩展和详细说明了被接受的答案。为被接受的答案点赞并追加此内容。 - granadaCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接