0

我需要使用盐和密钥加密字符串以匹配 java 加密,以便第 3 方提供者可以解密另一端的值。

我已经尝试了几篇 StackOverflow 文章,因为我不是加密专家,只是无法使用 SALT 和 KEY 作为第 3 方提供商获得相同的加密字符串。

我需要知道 C# 中使用哪种加密类型和模式来匹配这里使用的 java 的 AES 加密

https://gist.github.com/ca958d5921d47c4c0a0f

4

1 回答 1

3

好的-即使在一定程度上作弊,我也想通了。因为我找不到任何与第 3 方提供的纯 AES 加密相匹配的加密技术,所以我要求他们将其更改为

密码密码 = Cipher.getInstance("AES/CBC/PKCS5Padding");

有了这个,我修改了我的 C# 代码并最终使集成工作:

public static string Encrypt2(string plainText)
    {
        string PassPhrase = "somepassphrase";
        string SaltValue = "somesalt";
        int PasswordIterations = 0; //amend to match java encryption iteration
        string InitVector = "someiv";
        int KeySize = 0; //amend to match java encryption key size

        byte[] initVectorBytes = Encoding.ASCII.GetBytes(InitVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(SaltValue);

        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        Rfc2898DeriveBytes password = new Rfc2898DeriveBytes(
                                                        PassPhrase,
                                                        saltValueBytes,
                                                        PasswordIterations);

        byte[] keyBytes = password.GetBytes(KeySize / 8);
        RijndaelManaged symmetricKey = new RijndaelManaged();
        symmetricKey.Mode = CipherMode.CBC;

        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                         keyBytes,
                                                         initVectorBytes);
        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                     encryptor,
                                                     CryptoStreamMode.Write);

        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
        cryptoStream.FlushFinalBlock();
        byte[] cipherTextBytes = memoryStream.ToArray();

        memoryStream.Close();
        cryptoStream.Close();

        string cipherText = Convert.ToBase64String(cipherTextBytes);

        return cipherText;
    }
于 2012-07-03T10:12:22.107 回答