使用 bouncycastle 将 encrypt/decrypt 从 Java 转换为 C#
Convert encrypt/decrypt from Java to C# using bouncycastle
我正在尝试使用 Portable.BouncyCastle 将一些函数从 Java 转换为 c#,虽然那里有很多示例,但我似乎无法找到一个为了满足我的要求,因为大多数示例似乎都解释了一种特定的 encryption/decryption 方法,而此函数似乎更通用。当然我可能是错的,因为我是一个完全的新手并且在 BouncyCastle,Java 或加密方面没有任何经验,所以请耐心等待我。
java函数是:
public static byte[] Cipher(int mode, byte[] key,
byte[] data, string algorithm, AlgorithmParameterSpec spec)
{
Cipher cipher = Cipher.getInstance(algorithm);
SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
if (spec != null)
cipher.init(mode, keySpec, spec);
else
cipher.init(mode, keySpec);
return cipher.doFinal(data);
}
我从 BouncyCasle 中找到了一些代码,其中我可以匹配我所看到的大部分功能:
byte[] K = Hex.Decode("404142434445464748494a4b4c4d4e4f");
byte[] N = Hex.Decode("10111213141516");
byte[] P = Hex.Decode("68656c6c6f20776f726c642121");
byte[] C = Hex.Decode("39264f148b54c456035de0a531c8344f46db12b388");
KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
IBufferedCipher inCipher = CipherUtilities.
GetCipher("AES/CCM/NoPadding");
inCipher.Init(true, new ParametersWithIV(key, N));
byte[] enc = inCipher.DoFinal(P);
1. SecretKeySpec:
SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
How do I create this using BC? Is that the equivalent of the SecretKeySpec:
KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
If it is, can I pass the "AES/CCM/NoPadding" instead of AES as it is done in Java?
2。规格参数:
It passes parameters of type IvParameterSpec to the Cypher function when called from `Java` via the `AlgorithmParameterSpec spec` parameter:
Cipher(ENCRYPT_MODE, key, clearBytes,
algorithm,
new IvParameterSpec(iv))
`BouncyCastle` does not have an overloaded function for `.Init` to allow me to pass the spec parameter as it does in `Java`, so how do I mimic this behaviour?
3。 IvParameterSpec: 您可以看到,当从 java 调用 cypher 时,它将 AlgorithmParameterSpec spec
作为 new IvParameterSpec(iv)
传递,但是对于 BouncyCastle,它似乎需要一个密钥?
ParametersWithIV(key, N)
这种差异会对 encryption/decryption 产生任何影响吗?
这是我目前对 "converting" 这个功能的尝试:
public static byte[] Cipher(bool isEncrypt, byte[] key, byte[] data,
string algorithm, ICipherParameters spec)
{
IBufferedCipher cipher = CipherUtilities.GetCipher(algorithm);
KeyParameter keySpec = ParameterUtilities.
CreateKeyParameter(algorithm, key);
cipher.Init(isEncrypt, new ParametersWithIV(keySpec,
keySpec.GetKey()));
return cipher.DoFinal(data);
}
如您所见,我已将 spec 参数更改为 ICipherParameters spec
,但我不知道这是否会像使用 Bouncy 时那样工作,当我创建 new ParametersWithIV
时看起来是这样,它需要一个密钥,根据我上面提供的测试示例,该密钥是使用 KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
创建的,因此在尝试调用我的 Cipher 函数时技术上不起作用,因为我将调用此函数。我应该将 spec 参数更改为 iv 并改为传递 byte[]
吗?
如果有混淆或解释不正确,我深表歉意,但正如我所说,我是新手,我试图在转换的同时更好地理解它。我希望其中的大部分内容都有意义,并且您将能够提供帮助。
非常感谢。
PS:请注意,我还不能在 Java 中测试这些,但我希望在新的几天内正确设置环境,这有望有所帮助.net & java.
之间的测试值
更新 1
将 AES/CCM/NoPadding
传递给:
KeyParameter key = ParameterUtilities.CreateKeyParameter
抛出错误,因此这部分回答了我的一个问题。 BouncyCastle
中是否有一个函数来确定所需的正确值,即 AES
当 AES/CCM/NoPadding
被传递时?
最终使用了下面的代码,因为它似乎按预期工作但仍然很恼火,我不得不将 AES
硬编码为 IV 参数部分的键。理想情况下,我希望它基于我的算法。所以,现在我只有一个函数来加密和解密:
public static byte[] Cipher(bool forEncryption, byte[] key,
byte[] data, string algorithm, byte[] iv)
{
IBufferedCipher cipher = CipherUtilities.GetCipher(algorithm);
KeyParameter keySpec = ParameterUtilities.CreateKeyParameter("AES", key);
cipher.Init(forEncryption, new ParametersWithIV(keySpec, iv));
return cipher.DoFinal(data);
}
希望对您有所帮助。
我正在尝试使用 Portable.BouncyCastle 将一些函数从 Java 转换为 c#,虽然那里有很多示例,但我似乎无法找到一个为了满足我的要求,因为大多数示例似乎都解释了一种特定的 encryption/decryption 方法,而此函数似乎更通用。当然我可能是错的,因为我是一个完全的新手并且在 BouncyCastle,Java 或加密方面没有任何经验,所以请耐心等待我。
java函数是:
public static byte[] Cipher(int mode, byte[] key,
byte[] data, string algorithm, AlgorithmParameterSpec spec)
{
Cipher cipher = Cipher.getInstance(algorithm);
SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
if (spec != null)
cipher.init(mode, keySpec, spec);
else
cipher.init(mode, keySpec);
return cipher.doFinal(data);
}
我从 BouncyCasle 中找到了一些代码,其中我可以匹配我所看到的大部分功能:
byte[] K = Hex.Decode("404142434445464748494a4b4c4d4e4f");
byte[] N = Hex.Decode("10111213141516");
byte[] P = Hex.Decode("68656c6c6f20776f726c642121");
byte[] C = Hex.Decode("39264f148b54c456035de0a531c8344f46db12b388");
KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
IBufferedCipher inCipher = CipherUtilities.
GetCipher("AES/CCM/NoPadding");
inCipher.Init(true, new ParametersWithIV(key, N));
byte[] enc = inCipher.DoFinal(P);
1. SecretKeySpec:
SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
How do I create this using BC? Is that the equivalent of the SecretKeySpec:
KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
If it is, can I pass the "AES/CCM/NoPadding" instead of AES as it is done in Java?
2。规格参数:
It passes parameters of type IvParameterSpec to the Cypher function when called from `Java` via the `AlgorithmParameterSpec spec` parameter:
Cipher(ENCRYPT_MODE, key, clearBytes,
algorithm,
new IvParameterSpec(iv))
`BouncyCastle` does not have an overloaded function for `.Init` to allow me to pass the spec parameter as it does in `Java`, so how do I mimic this behaviour?
3。 IvParameterSpec: 您可以看到,当从 java 调用 cypher 时,它将 AlgorithmParameterSpec spec
作为 new IvParameterSpec(iv)
传递,但是对于 BouncyCastle,它似乎需要一个密钥?
ParametersWithIV(key, N)
这种差异会对 encryption/decryption 产生任何影响吗?
这是我目前对 "converting" 这个功能的尝试:
public static byte[] Cipher(bool isEncrypt, byte[] key, byte[] data,
string algorithm, ICipherParameters spec)
{
IBufferedCipher cipher = CipherUtilities.GetCipher(algorithm);
KeyParameter keySpec = ParameterUtilities.
CreateKeyParameter(algorithm, key);
cipher.Init(isEncrypt, new ParametersWithIV(keySpec,
keySpec.GetKey()));
return cipher.DoFinal(data);
}
如您所见,我已将 spec 参数更改为 ICipherParameters spec
,但我不知道这是否会像使用 Bouncy 时那样工作,当我创建 new ParametersWithIV
时看起来是这样,它需要一个密钥,根据我上面提供的测试示例,该密钥是使用 KeyParameter key = ParameterUtilities.CreateKeyParameter("AES", K);
创建的,因此在尝试调用我的 Cipher 函数时技术上不起作用,因为我将调用此函数。我应该将 spec 参数更改为 iv 并改为传递 byte[]
吗?
如果有混淆或解释不正确,我深表歉意,但正如我所说,我是新手,我试图在转换的同时更好地理解它。我希望其中的大部分内容都有意义,并且您将能够提供帮助。
非常感谢。
PS:请注意,我还不能在 Java 中测试这些,但我希望在新的几天内正确设置环境,这有望有所帮助.net & java.
之间的测试值更新 1
将 AES/CCM/NoPadding
传递给:
KeyParameter key = ParameterUtilities.CreateKeyParameter
抛出错误,因此这部分回答了我的一个问题。 BouncyCastle
中是否有一个函数来确定所需的正确值,即 AES
当 AES/CCM/NoPadding
被传递时?
最终使用了下面的代码,因为它似乎按预期工作但仍然很恼火,我不得不将 AES
硬编码为 IV 参数部分的键。理想情况下,我希望它基于我的算法。所以,现在我只有一个函数来加密和解密:
public static byte[] Cipher(bool forEncryption, byte[] key,
byte[] data, string algorithm, byte[] iv)
{
IBufferedCipher cipher = CipherUtilities.GetCipher(algorithm);
KeyParameter keySpec = ParameterUtilities.CreateKeyParameter("AES", key);
cipher.Init(forEncryption, new ParametersWithIV(keySpec, iv));
return cipher.DoFinal(data);
}
希望对您有所帮助。