1

セキュリティ サイトでこの質問をしたところ、ここに投稿するべきだったと言われました。

いくつかの背景。独自の OS で c を実行する独自のデバイスと、Windows OS で ac# dll を実行するその他のデバイスがあります。どちらもTCP接続を介してサーバーに接続します。サーバーの場合、両方のタイプのリクエストは同じです。TCP サーバーは、http バインディングを通じて、要求の一部をセルフホステッド WCF サービスに転送します。リンクに示されているように、リクエストは暗号化されます(C#dllが暗号化するように)。

TCP サーバーを切り離して、WCF サービスに直接リクエストを送信しようとしています。

私の問題は、WCF サービスが要求文字列を間違って受信したようで、復号化できないことです。

サーバー側の受信文字列に \t \n が追加されているようです。それ以外は同じように見えます。

これは、サーバー側の復号化コードです。

            byte[] byteChiperText = Encoding.Default.GetBytes(input);

            if (k.Length != 16)
            {
                throw new Exception("Wrong key size exception");
            }
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

            des.Mode = CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            des.Key = k;
            ICryptoTransform ic = des.CreateDecryptor();
            MemoryStream ms = new MemoryStream(byteChiperText);
            CryptoStream cStream = new CryptoStream(ms,
                 ic,
                 CryptoStreamMode.Read);
            StreamReader sReader = new StreamReader(cStream);
            byte[] data = new byte[byteChiperText.Length];
            int len = sReader.BaseStream.Read(data, 0, data.Length);
            output = Encoding.Default.GetString(data, 0, len);

            cStream.Close();
4

2 に答える 2

6

まあ、これはそもそも壊れているように見えます:

byte[] byteChiperText = Encoding.Default.GetBytes(input);

暗号化されたデータを、プラットフォームのデフォルトのエンコーディングでエンコードされたテキストであるかのように扱っています。これは、データを失うのに最適な方法です。暗号化されたデータテキストではありません。これは任意のバイナリ データであり、そのように扱う必要があります。

代わりに、base64 を使用して暗号化されたデータをテキストとしてエンコードし( )、後でConvert.ToBase64Stringそれを逆にして ( ) 元の暗号テキストに戻す必要があります。Convert.FromBase64Stringもちろん、最初はテキスト形式で必要であると仮定しています。byte[]そもそもとして渡すことができれば、さらに良いでしょう。

また、テキストを取得するためのアプローチがやや奇妙であることに注意してください。 を作成StreamReaderし、ベースストリームのみを使用しています。使用する方が良いでしょう:

// You should be using "using" statements for all your streams, by the way...
using (TextReader reader = new StreamReader(cStream))
{
    output = reader.ReadToEnd();
}

これは、プラットフォームのデフォルトのエンコーディングではなく UTF-8 を使用することに注意してください。ただし、暗号化コードに対応する変更を加える限り、これは良いことです。プラットフォームのデフォルトのエンコーディングを使用することは、ほとんどの場合間違いです。すべての Unicode をサポートしているわけではなく、マシンによって異なります。

于 2012-06-19T06:08:07.487 に答える
2

問題はEncoding.Defaultにある可能性があります。

異なるコンピューターでは、異なるエンコーディングをデフォルトとして使用できます。

特定の標準エンコーディング (UTF-8、UTF-16 など) を使用する必要があります。

于 2012-06-19T06:10:28.857 に答える