2016-11-23 30 views
0

我有在Java中AES自定义键,而不是16,24个或32字节

与键AES问题,这是我的代码:

public Core(String key) { 
    try { 
     this.SecretKey = key; 
     this.ivspec = new IvParameterSpec(this.iv.getBytes()); 
     this.keyspec = new SecretKeySpec(SecretKey.getBytes("UTF-8"), "AES"); 
     try { 
      this.cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
} 

每当我把这个字符串的“钥匙”,它包含例如Pizza,它只是产生错误。当我传递一个包含16个字节的字符串时,它可以工作。我想使用AES,但我不希望它仅限于16,24或32字节。我怎样才能解决这个问题。

+1

我刚刚被一个加密中小企业问道:“你为什么要使用非标准的密钥大小? – zaph

回答

4

对于具有不同密钥大小(以及不同块大小)的AES,请看Rijndael。但是,鉴于您使用“比萨”作为关键,使用Rijndael可能对您而言太过先进。请使用Key Derivation Function(KDF)将密码(“Pizza”)变成密码密钥。如果您不确定使用什么KDF,请查看PBKDF2。

我还建议使用密码而不是密码作为KDF的输入:“我喜欢火腿和菠萝比萨。”

ETA:首选将PKCS7填充到NoPadding。这样,当填充不匹配时,您将在代码中捕获更多错误。

+0

[Here](http://android-developers.blogspot.de/2013/02/using-cryptography- to-store-credentials.html)是包含Android特定代码的链接 –

+0

填充不应该用于“捕获错误”,事实上报告填充错误给调用者是一个安全错误,允许填充oracle攻击。 – zaph

+0

AES有一个块大小:128位和三个密钥大小:128,192和256位。任何其他Rijndael值都不是AES。 – zaph

相关问题