7

文字列を入力として受け取る C# で記述された暗号化ツールがあります。コンパイルした exe ファイルを Windows マシンで実行すると、mono を使用してリモート UNIX サーバーで実行した場合とは異なる出力が得られます。

次に例を示します。

ウィンドウズ:

"encrypt.exe 01/01"
Output:
eR4et6LR9P19BfFnhGwPfA==

ユニックス:

"mono encrypt.exe 01/01"
Output:
Pa8pJCYBN7+U+R705TFq7Q==

入力値をスクリプトに入れてからコンパイルして再度実行しようとしても、同じ結果が得られました。

復号化関数はリモート Web サービスにあり、ハードコードされたキーと IV 値を使用します (これらの値を使用して暗号化しています)。復号化出力:

Input (String generated on windows):
eR4et6LR9P19BfFnhGwPfA==
Output:
01/01

Input (String generated on Unix):
Pa8pJCYBN7+U+R705TFq7Q==
Output:
????1

これが暗号化関数です。

string text = args[0];
byte[] clearData = Encoding.Unicode.GetBytes(text);
PasswordDeriveBytes bytes = new PasswordDeriveBytes(password, new byte[] { 0x19, 0x76, 0x61, 110, 0x20, 0x4d, 0x65, 100, 0x76, 0x65, 100, 0x65, 0xf6 });
string a = Convert.ToBase64String(Encrypt(clearData, bytes.GetBytes(0x20), bytes.GetBytes(0x10)));
Console.Write(a);

public static byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
{
    MemoryStream stream = new MemoryStream();
    Rijndael rijndael = Rijndael.Create();
    rijndael.Key = Key;
    rijndael.IV = IV;
    CryptoStream stream2 = new CryptoStream(stream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
    stream2.Write(clearData, 0, clearData.Length);
    stream2.Close();
    return stream.ToArray();
}

これは復号化関数です (これを変更することはできません):

byte[] cipherData = Convert.FromBase64String(encryptedString);
PasswordDeriveBytes bytes2 = new PasswordDeriveBytes(password, new byte[] { 0x19, 0x76, 0x61, 110, 0x20, 0x4d, 0x65, 100, 0x76, 0x65, 100, 0x65, 0xf6 });
byte[] buffer2 = Decrypt(cipherData, bytes2.GetBytes(0x20), bytes2.GetBytes(0x10));
string output = Encoding.Unicode.GetString(buffer2);
Console.Write(output); 

public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
{
        MemoryStream stream = new MemoryStream();
        Rijndael rijndael = Rijndael.Create();
        rijndael.Key = Key;
        rijndael.IV = IV;
        CryptoStream stream2 = new CryptoStream(stream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
        stream2.Write(cipherData, 0, cipherData.Length);
        stream2.Close();
        return stream.ToArray();
}
4

3 に答える 3

1

この質問の問題はあなたが扱っているものではありませんが、結果の違いを見ると、パディングが懸念事項だったようです。したがって、この質問の回答のいくつかを確認することをお勧めしますが、この回答は解決に役立つ可能性がありますあなたの問題。

http://social.msdn.microsoft.com/forums/en-US/clr/thread/3df8d5aa-ea99-4553-b071-42a2ea406c7f/

この問題は、KEY、IV、およびENCRYPTEDDATAがすべて正しいブロックサイズと「スキーム」ではない場合に発生します。この問題を回避する唯一の方法は、アルゴリズムによって生成されたIVとKEYを使用することです。GenerateIVを使用して、IVを生成するアルゴリズムを取得できます。必要になるので、これを安全な場所に保管してください。次に、encryptメソッドを呼び出して、データを渡します。次に、アルゴリズムはデータを暗号化し、Keyプロパティを新しく生成されたキーに設定します。これを暗号化されたデータと一緒に保存します。これですべてです。

日付はありますが、違いにはさまざまな理由がありますが、復号化できれば違いの理由が有効である可能性があります:http: //lists.ximian.com/pipermail/mono-list/ 2006年11月/033456.html

したがって、一方を暗号化し、もう一方を復号化できる場合(これを実行できますか?)、結果が異なる場合、どのような違いが生じますか?

于 2011-05-02T23:49:04.583 に答える
0

テスト文字列に新しい行がないか確認しましたか?Windowsのテスト文字列にはキャリッジリターン+ラインフィードがありますが、Unixの文字列にはラインフィードしかありません。

于 2013-03-03T07:42:10.817 に答える
0

おそらく問題は、出力がユニコードであり、端末がASCIIを表示していることです。私はよく見ますか?誤解されているUnicode文字の代わりに。

バイト配列の数値と数量を確認してください。

各文字に2バイトあるため、ASCIIはUnicodeの半分の量です。

于 2011-05-03T01:17:29.087 に答える