C# Bouncy Castle PBewithsha256和256在C中进行加密#
我试图用C#复制这段Java代码 这就是我目前所拥有的,但它失败了。我是一个新的加密世界(所以可能有一个更简单的方法来做这件事,我不知道),所以任何帮助将不胜感激。谢谢C# Bouncy Castle PBewithsha256和256在C中进行加密#,c#,bouncycastle,C#,Bouncycastle,我试图用C#复制这段Java代码 这就是我目前所拥有的,但它失败了。我是一个新的加密世界(所以可能有一个更简单的方法来做这件事,我不知道),所以任何帮助将不胜感激。谢谢 var iterations = 20000; PbeParametersGenerator pGen = new Pkcs12ParametersGenerator(new Sha256Digest()); pGen.Init(Encoding.ASCII.GetBytes(pa
var iterations = 20000;
PbeParametersGenerator pGen = new Pkcs12ParametersGenerator(new Sha256Digest());
pGen.Init(Encoding.ASCII.GetBytes(password), Convert.FromBase64String(salt), iterations);
ICipherParameters par = pGen.GenerateDerivedParameters("AES256", 256);
IBufferedCipher c = CipherUtilities.GetCipher("PBEWITHSHA256AND256BITAES-CBC-BC");
Console.WriteLine(c.AlgorithmName);
c.Init(true, par);
byte[] enc = c.DoFinal(Convert.FromBase64String(salt));
Console.WriteLine("The output is :");
Console.WriteLine(Convert.ToBase64String(enc));
问题在于,使用相同的密码、相同的salt和相同的迭代次数,Java和C#中的加密结果不同
更新:
问题是Java代码(不是我写的,不是做密码加密)只是生成密钥参数。此代码将提供与Java代码相同的输出
var iterations = 20000;
var sltBytes = Convert.FromBase64String(salt);
byte[] byteSalt = Convert.FromBase64String(salt);
byte[] pwdb = PbeParametersGenerator.Pkcs12PasswordToBytes(password.ToCharArray());
PbeParametersGenerator pGen = new Pkcs12ParametersGenerator(new Sha256Digest());
pGen.Init(pwdb, Convert.FromBase64String(salt), iterations);
var par = (ParametersWithIV)pGen.GenerateDerivedParameters("AES256", 256, 128);
var kpar = (KeyParameter)par.Parameters;
byte[] by = kpar.GetKey();
Console.WriteLine(Convert.ToBase64String(by));
您对GenerateDrivedParameters(“AES256”,256)的调用指定的密钥长度与Java中的
derivedKeyLength
不同。我认为这是您的问题:
这里指定的派生密钥长度为128
int derivedKeyLength = 128;
...
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations,
derivedKeyLength);
这里指定的派生密钥长度为256
ICipherParameters par = pGen.GenerateDerivedParameters("AES256", 256);
失败的地方是什么?我对此感到抱歉,我添加了一个问题,即Java版本和C#版本的结果不同,参数相同。您能否验证
salt
的两个版本最终是否相同?它们是相同的,C#返回一个无符号字节数组,该数组与Java的有符号字节数组版本相同。实际上,捕捉得很好!但事实并非如此。结果仍然不同。在这种情况下,由于代码本身没有明显的问题,可能是salt并不像您所想的那样完全相同。另外,我不是100%确定这一点,但是Encoding.ASCII.GetBytes
可能会提供与Java中调用tocharray()
略有不同的输出。在这一点上,请尝试一下Encoding.UTF8.GetBytes
。还有UTF16.GetBytes和Unicode.GetBytes的选项。如果两者都不起作用,那么我会再次将盐视为可能的罪魁祸首。
ICipherParameters par = pGen.GenerateDerivedParameters("AES256", 256);