Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Bouncy Castle PBewithsha256和256在C中进行加密#_C#_Bouncycastle - Fatal编程技术网

C# Bouncy Castle PBewithsha256和256在C中进行加密#

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

我试图用C#复制这段Java代码

这就是我目前所拥有的,但它失败了。我是一个新的加密世界(所以可能有一个更简单的方法来做这件事,我不知道),所以任何帮助将不胜感激。谢谢

        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);