1

この Java コードを C# で複製しようとしています。

        BASE64Decoder dec = new BASE64Decoder();
    byte[] salt = null;
    try {
        salt = dec.decodeBuffer(saltStr);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
    String alg = "PBEWITHSHA256AND256BITAES-CBC-BC";
    int derivedKeyLength = 256;
    int iterations = 20000;
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations,
            derivedKeyLength);
    try {
        SecretKeyFactory f = SecretKeyFactory.getInstance(alg);
        byte[] result = f.generateSecret(spec).getEncoded();
        BASE64Encoder endecoder = new BASE64Encoder();
        System.out.println(endecoder.encode(result));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

これは私がこれまでに持っているものですが、失敗しています。私はCryptoの世界に慣れていないので(私が知らないより簡単な方法があるかもしれません)、助けていただければ幸いです。ありがとう!

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

問題は、暗号化された結果が 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));
4

2 に答える 2

2

への呼び出しは、JavaGenerateDerivedParameters("AES256", 256)とは異なるキーの長さを指定しています。derivedKeyLength

于 2013-02-11T18:23:13.027 に答える
1

これがあなたの問題だと思います:

ここでは、派生キーの長さを 128 に指定します。

int derivedKeyLength = 128;
...
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations,
        derivedKeyLength);

ここでは、派生キーの長さを 256 に指定します。

ICipherParameters par = pGen.GenerateDerivedParameters("AES256", 256);
于 2013-02-11T18:28:02.227 に答える