不幸的是,我对密码学不太熟悉,但是我需要在java8中实现this algorithm。这意味着,我已经用这种用C编写的方法加密了一些数据,并且密钥是256位,并且我需要使用一些Java代码解密该数据。请注意,Erdelsky方法中所拥有的只是一个密钥,没有“盐”和“初始化向量”(至少是显式的,但我可能会误会)。
我尝试了什么?好吧,一点:
我正在使用Java 1.8.112,但出现了“密钥大小或默认参数非法”异常,并且我尝试Hack my JDK使其与256位密钥一起使用,(它也使用了“ iv” ),但它也无法解密我的数据。代码如下:
public static void DecryptData(byte[] Contents, int NumBytes, byte[] KeyBytes, int KeyOffset, int NumKeyBytes)
{
final int AESBlockSize = 16;
final byte[] EncryptionDecryptionBuffer = new byte[AESBlockSize];
final byte[] InitializingVector = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
};
try
{
final Cipher AES256Cipher = Cipher.getInstance("AES/CBC/NoPadding");
final SecretKeySpec secretKeySpec = new SecretKeySpec(KeyBytes, KeyOffset, NumKeyBytes, "AES");
AES256Cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(InitializingVector));
// Decrypt the data a block at a time
for (int Offset = 0; Offset < NumBytes; Offset += AESBlockSize)
{
// Update and copy to the EncryptionDecryptionBuffer
AES256Cipher.update(Contents, Offset, AESBlockSize, EncryptionDecryptionBuffer);
// Copy to the initial array
System.arraycopy(EncryptionDecryptionBuffer, 0, Contents, Offset, AESBlockSize);
}
}
catch (GeneralSecurityException e)
{
throw new RuntimeException(e);
}
}
我仍在寻找解决方案,请提供帮助。谢谢。
答案 0 :(得分:0)
一些额外的背景。 我试图为某些游戏引擎创建打包算法的Java实现。我假设,选择了 ECB 加密以减少不同版本的打包资产之间的熵(因为修补系统正在尝试将已加密内容的块安装到现有数据中)。关于JDK 1.8.112,该如何处理-我使用Excelsior Jet来AOT编译我的程序(它将是开源的,我将在稍后将链接附加到这篇文章),但是不幸的是,我的上一个版本AOT编译器仅支持1.8.112,因此我使用相同的JDK版本以确保兼容性。
事实上,对于非密码专家(如我)的详细回答:
感谢大家的回答和讨论。干杯!