Erdelsky Rijndael 128 位块 256 位密钥 java 中的实现
Erdelsky's Rijndael 128bit blocks 256bit keys Implementation in java
不幸的是,我对密码学不太熟悉,但我需要在 java8 中实现 this algorithm。这意味着,我已经有了一些用 C 语言编写的方法加密的数据,以及 256 位的密钥,我需要使用一些 java 代码来解密这些数据。请注意,我们在 Erdelsky 的方法中所拥有的只是一个关键,没有 'salt' 也没有 'initializing vector'(至少是明确的,但我可能会弄错)。
我尝试了什么?嗯,有点:
- 我试过BouncyCastle,但它无法解密我的数据(它使用'iv',我把它全设置为零,所以这可能是个问题)
我正在使用 java 1.8.112 我遇到了一个 'Illegal key size or default parameters' 异常,我试图 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);
}
}
我还在寻找解决方案,请帮忙。谢谢。
一些额外的背景。
我试图为某些游戏引擎创建打包算法的 java 实现。我假设选择了ECB加密来减少不同版本打包资产之间的熵(因为补丁系统正试图将已经加密的内容块安装到现有数据)。 JDK 1.8.112 怎么样 - 我使用 Excelsior Jet 来 AOT 编译我的程序(它将是开源的,我将把 link 附加到这个 post a稍后),但不幸的是,我以前的 AOT 编译器版本只支持 1.8.112,所以我使用相同的 JDK 版本以确保兼容性。
事实上,对于非加密货币人士(比如我)的详细回答:
- 块大小总是 16 字节宽,这完全没问题。
- 密钥长度为 256 位宽(或 32 字节),您不能在较旧的 JDK 补丁,但后来,限制已被删除,因此请将您的 JDK 更新为 Java 9、Java 8u161、Java 7u171 或 6u181,或下载并安装这个 Unlimited Strength Jurisdiction Policy.
- 你必须使用 ECB 加密来匹配 Erdelsky 的 Rijndael,这比 CBC less secure,但出于兼容性原因它仍然可以使用。
感谢大家的回答和讨论。干杯!
不幸的是,我对密码学不太熟悉,但我需要在 java8 中实现 this algorithm。这意味着,我已经有了一些用 C 语言编写的方法加密的数据,以及 256 位的密钥,我需要使用一些 java 代码来解密这些数据。请注意,我们在 Erdelsky 的方法中所拥有的只是一个关键,没有 'salt' 也没有 'initializing vector'(至少是明确的,但我可能会弄错)。
我尝试了什么?嗯,有点:
- 我试过BouncyCastle,但它无法解密我的数据(它使用'iv',我把它全设置为零,所以这可能是个问题)
我正在使用 java 1.8.112 我遇到了一个 'Illegal key size or default parameters' 异常,我试图 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); } }
我还在寻找解决方案,请帮忙。谢谢。
一些额外的背景。 我试图为某些游戏引擎创建打包算法的 java 实现。我假设选择了ECB加密来减少不同版本打包资产之间的熵(因为补丁系统正试图将已经加密的内容块安装到现有数据)。 JDK 1.8.112 怎么样 - 我使用 Excelsior Jet 来 AOT 编译我的程序(它将是开源的,我将把 link 附加到这个 post a稍后),但不幸的是,我以前的 AOT 编译器版本只支持 1.8.112,所以我使用相同的 JDK 版本以确保兼容性。
事实上,对于非加密货币人士(比如我)的详细回答:
- 块大小总是 16 字节宽,这完全没问题。
- 密钥长度为 256 位宽(或 32 字节),您不能在较旧的 JDK 补丁,但后来,限制已被删除,因此请将您的 JDK 更新为 Java 9、Java 8u161、Java 7u171 或 6u181,或下载并安装这个 Unlimited Strength Jurisdiction Policy.
- 你必须使用 ECB 加密来匹配 Erdelsky 的 Rijndael,这比 CBC less secure,但出于兼容性原因它仍然可以使用。
感谢大家的回答和讨论。干杯!