我有做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;
}


我对密码学不是很满意。提前致谢!

最佳答案

错误消息很清楚:“初始化向量的长度必须与块大小相同”。您正在指定256位(32字节)的块大小,请确认iv_byte是32字节。

有几个问题:


为了使IV从散列中获取字节,请将字节传递给加密函数,BigInteger在其中没有位置。
sha256(appId)提供一个256位密钥,只需使用它即可。


不需要以下内容,sha256的结果为256位:

final int keysize = 256;
byte[] keyData = new byte[keysize];
System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));



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


不需要以下内容:

final int keysize = 256;
byte[] keyData = new byte[keysize];
System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));



mcrypt“ MCRYPT_RIJNDAEL_256”指定了256位的块大小,这意味着它不是AES,“ MCRYPT_RIJNDAEL_128”是应使用的AES。
mcrypt使用非标准的空填充,需要填充。
使用SHA-256哈希不够安全,请使用密码派生功能(例如PBKDF2)。

关于java - 在Java中使用IV进行RIJNDAEL 256 CBC加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45442114/

10-15 04:40