RIJNDAEL 256 CBC加密与java中的IV

时间:2017-08-01 15:38:19

标签: java encryption bouncycastle rijndael

我有一个使用Rijndael加密的PHP代码的参考。我想将它转换为java代码,我尝试了几个例子,但没有一个适合我。 这是php代码:

$initialisationVector = hash("sha256", utf8_encode($myiv), TRUE);
$key = hash("sha256", utf8_encode($mykey), TRUE);
$encryptedValue = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$encryptKey, utf8_encode($mydata), MCRYPT_MODE_CBC, $initialisationVector));

这是我抛出的java代码:密钥长度不是128/160/192/224/256位

public static String encrypt() throws Exception{
    String myiv = "somevalue";
    String mykey = "somevalue";
    String mydata = "somevalue";
    String new_text = "";

    RijndaelEngine rijndael = new RijndaelEngine(256);
    CBCBlockCipher cbc_rijndael = new CBCBlockCipher(rijndael);
    ZeroBytePadding c = new ZeroBytePadding();
    PaddedBufferedBlockCipher pbbc = new PaddedBufferedBlockCipher(cbc_rijndael, c);

    byte[] iv_byte = sha256(myiv);

    byte[] givenKey = sha256(mykey);

    CipherParameters keyWithIV = new ParametersWithIV(new KeyParameter(givenKey), iv_byte);

    pbbc.init(true, keyWithIV);
    byte[] plaintext = mydata.getBytes(Charset.forName("UTF-8"));
    byte[] ciphertext = new byte[pbbc.getOutputSize(plaintext.length)];
    int offset = 0;
    offset += pbbc.processBytes(plaintext, 0, plaintext.length, ciphertext, offset);
    offset += pbbc.doFinal(ciphertext, offset);
    new_text = new String(new Base64().encode(ciphertext), Charset.forName("UTF-8"));
    System.out.println(new_text);
    return new_text;
}

public static byte[] sha256(String input) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    byte[] messageDigest = md.digest(input.getBytes(Charset.forName("UTF-8")));
    return messageDigest;
}

我对密码学不是很了解。提前谢谢!

1 个答案:

答案 0 :(得分:3)

错误消息很明确:“初始化向量必须与块大小相同”。您指定的是256位(32字节)块大小,请验证iv_byte是否为32字节。

有一些问题:

  1. 对于IV从哈希中获取字节,将字节传递给加密函数,BigInteger没有位置。

  2. sha256(appId)提供256位密钥,只需使用它即可。

  3. 不需要以下内容,sha256的结果是256位:

    final int keysize = 256;
    byte[] keyData = new byte[keysize];
    System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));
    
    1. sha256(appId)提供256位密钥,只需使用它即可。
    2. 不需要以下内容:

      final int keysize = 256; 
      byte[] keyData = new byte[keysize];
      System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));
      
      1. mcrypt“MCRYPT_RIJNDAEL_256”指定256位块大小,这意味着它不是AES,“MCRYPT_RIJNDAEL_128”是应该使用的AES。

      2. mcrypt使用非标准的空填充,需要适应。

      3. 使用SHA-256哈希是不够安全的,请使用密码派生函数,如PBKDF2。