-6

カスタムの暗号化/復号化ソフトウェアを作成しています。私はすでにコードを書いています:

    public int CountCharInStringAccordingToArray(string Text)
    {
        int Count = 0;
        foreach (char x in Text)
        {
            Count++;
        }
        return Count - 1;
    }

    public int CountCharInString(string Text)
    {
        int Count = 0;
        foreach (char x in Text)
        {
            Count++;
        }
        return Count;
    }
    public string Encrypt(string Key, string PlainText)
    {
        int[] TempKey = new int[CountCharInString(Key)];
        int[] TempText = new int[CountCharInString(PlainText)];
        int[] EncryptedInt = new int[CountCharInString(PlainText)];
        char[] EncryptedChar = new char[CountCharInString(PlainText)];
        for (int i = 0; i < CountCharInStringAccordingToArray(Key); i++)
        {
            TempKey[i] = (int)Key[i];
        }
        for (int i = 0; i < CountCharInStringAccordingToArray(PlainText); i++)
        {
            TempText[i] = (int)PlainText[i];
        }
        int Index = 0;
        for (int i = 0; i < CountCharInStringAccordingToArray(PlainText); i++)
        {
            if (Index == CountCharInStringAccordingToArray(Key))
            {
                Index = 0;
            }
            EncryptedInt[i] = TempKey[Index] + TempText[i];
            Index++;
            EncryptedChar[i] = (char)EncryptedInt[i];
        }
        return new string(EncryptedChar);
    }

    public string Decrypt(string Key, string EncryptedText)
    {
        int[] TempKey = new int[CountCharInString(Key)];
        int[] TempText = new int[CountCharInString(EncryptedText)];
        int[] DecryptedInt = new int[CountCharInString(EncryptedText)];
        char[] DecryptedChar = new char[CountCharInString(EncryptedText)];
        for (int i = 0; i < CountCharInStringAccordingToArray(Key); i++)
        {
            TempKey[i] = (int)Key[i];
        }
        for (int i = 0; i < CountCharInStringAccordingToArray(EncryptedText); i++)
        {
            TempText[i] = (int)EncryptedText[i];
        }
        int Index = 0;
        for (int i = 0; i < CountCharInStringAccordingToArray(EncryptedText); i++)
        {
            if (Index == CountCharInStringAccordingToArray(Key))
            {
                Index = 0;
            }
            DecryptedInt[i] = TempText[i] - TempKey[Index];
            Index++;
            DecryptedChar[i] = (char)DecryptedInt[i];
        }
        return new string(DecryptedChar);
    }

しかし、私の問題は、暗号化するときです:

キー = abc123

PlainText = 皆さん、こんにちは。お元気ですか?

暗号化結果:§ÑÕ

そして、復号化すると:

キー = abc123

EncryptedText = §ÑÕ

復号結果:゚゙ンᅥ

暗号化されたテキストを復号化すると、「こんにちは、皆さん、お元気ですか?」とはまったく異なるメッセージが表示されます。

誰か助けてくれませんか?前もって感謝します。

4

1 に答える 1

0

他の人はすでに多くのことを言っていますが、コードの実際の問題は、Encrypt 関数と Decrypt 関数でプロパティ "Text" を使用することです。関数ヘッダーでは、入力引数は「PlainText」と「EncryptedText」ですが、関数の本体では「Text」を使用してそれらを参照しようとしています。Text プロパティは、プログラムのメイン ウィンドウに属します。Encrypt 関数と Decrypt 関数の両方が、入力した実際のテキストに関係なく、そのテキストに対して操作を実行します。

C# の原則として、ローカル変数を大文字で始めないようにしてください。大文字で始まる名前は通常、プロパティとメソッド用に予約されています。コードのエラーからわかるように、予期していた変数とはまったく異なるプロパティを参照しました。キャメルケースなどの命名スキームを採用すると、この種の意図しない参照が回避され、この種の間違いを犯したときにデバッガーが通知できるようになります。

于 2013-03-18T02:46:52.403 に答える