0

C# WCF で次の暗号化/復号化を使用しています。

    public static string EncryptString(string InputText, string Password)
    {
        RijndaelManaged RijndaelCipher = new RijndaelManaged();
        RijndaelCipher.Padding = PaddingMode.ISO10126;
        if (string.IsNullOrEmpty(Password) == true)
        {
            Password = "Test";
        }
        byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(InputText);
        byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());

        //This class uses an extension of the PBKDF1 algorithm defined in the PKCS#5 v2.0 
        //standard to derive bytes suitable for use as key material from a password. 
        //The standard is documented in IETF RRC 2898.

        PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
        //Creates a symmetric encryptor object. 
        ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
        MemoryStream memoryStream = new MemoryStream();
        //Defines a stream that links data streams to cryptographic transformations
        CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(PlainText, 0, PlainText.Length);
        //Writes the final state and clears the buffer
        cryptoStream.FlushFinalBlock();
        byte[] CipherBytes = memoryStream.ToArray();
        memoryStream.Close();
        memoryStream = null;
        cryptoStream.Close();
        cryptoStream = null;
        PlainText = null;
        Salt = null;
        try
        {
            GC.Collect();
        }
        catch { }
        return Convert.ToBase64String(CipherBytes);

    }


    public static string DecryptString(string InputText, string Password)
    {

        RijndaelManaged RijndaelCipher = new RijndaelManaged();
        RijndaelCipher.Padding = PaddingMode.ISO10126;
        if (string.IsNullOrEmpty(Password) == true)
        {
            Password = "Test";
        }
        byte[] EncryptedData = Convert.FromBase64String(InputText);
        byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());
        //Making of the key for decryption
        PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
        //Creates a symmetric Rijndael decryptor object.
        ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
        MemoryStream memoryStream = new MemoryStream(EncryptedData);
        //Defines the cryptographics stream for decryption.THe stream contains decrpted data
        CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);
        byte[] PlainText = new byte[EncryptedData.Length];
        int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);
        memoryStream.Close();
        memoryStream = null;
        cryptoStream.Close();
        cryptoStream = null;
        Salt = null;
        try
        {
            GC.Collect();
        }
        catch { }
        //Converting to string
        return Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);
    }

今、私は Java スクリプトを使用して Web でデータを暗号化し、WCF でデータを復号化できるようにしようとしています。このスクリプトを使用しようとしましたが、動作しませんでした。Javascript または JS と .ネットサンプル?

次のエラーが発生します:{「復号化するデータの長さが無効です。」}

ありがとう。

4

1 に答える 1

0

わかりました。正しく理解できれば、データをWCFサービスに安全に転送するために、ブラウザーでjavascriptのユーザー名/パスワードを暗号化する必要があります。これを実現するために、両側でAES(対称)暗号化を使用しています。

それが正しければ、実際にはSSLを使用しているはずです。なんで?SSLがこれを行うためですが、はるかに優れています。簡単に言うと、SSLはRSAキーの公開キーを認証した後にAESキーをネゴシエートします。したがって、クライアントjavascriptが正しいサーバーと通信していることを確認できるという、追加のメリットが得られます。

ロール・ユア・オウンAESアプローチで間違っていると思うのは、少なくとも、(公開鍵認証ステップなしで)鍵をクライアントのJavaScriptに公開する必要があるということです。これは、そのキーを持っている人なら誰でもサーバーにデータを送信できるようになるため、セキュリティを即座に破壊していることを意味します。

私が誤解している場合は、おそらくこれを行うのに適切な時期がありますが、現時点では見当たりません。

お役に立てれば。

于 2012-03-07T14:26:29.973 に答える