0

サードパーティプロバイダーが反対側の値を復号化できるように、Java暗号化と一致するソルトとキーを使用して文字列を暗号化する必要があります。

私は暗号化の専門家ではなく、サードパーティプロバイダーとしてSALTとKEYを使用して同じ暗号化文字列を取得できないため、いくつかのStackOverflowの記事を試しました。

ここで使用されているJavaのAES暗号化と一致させるために使用するC#の暗号化タイプとモードを知る必要があります

https://gist.github.com/ca958d5921d47c4c0a0f

4

1 に答える 1

3

OK - ある程度はごまかしていますが、私はそれを理解しました。サードパーティが提供するプレーンな AES 暗号化に一致する暗号化手法が見つからなかったため、サードパーティに変更するよう依頼しました。

暗号 cipher = 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 に答える