0

カスタム暗号化のコードを書きました。挑戦です。現在、次のような理由で機能しません。

Encrypt("abc", "こんにちはみんな") 戻り値: sdfhsjfjs Decrypt("abc", "sdfhsjfjs") 戻り値: diuifidu

    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);
}

また、文字列には長さのプロパティがあることを知っていますが、それを修正するのを忘れています。

4

2 に答える 2

2

行を変更する

return Count - 1;

CountCharInStringAccordingToArray_

return Count;

コードの表現:

String That(String key, String text, int sign) {
    return new String(Enumerable.Range(0, text.Length).Select((x, i) => (char)(text.ToArray()[i]+sign*key.ToArray()[i%key.Length])).ToArray());
}

public String Encrypt(String key, String text) {
    return That(key, text, 1);
}

public String Decrypt(String key, String text) {
    return That(key, text, -1);
}

それがどのように機能するかの原則は簡単です。グラフを見てください:

例B5n.jpg

の文字は、keyに追加するために繰り返し使用され、暗号化されtextたと見なされるシーケンスが生成されます。復号化は、単に減算による逆操作です。

1 バイトに格納できる最大値は ですが、表示可能な文字0x0ffの最大値は、つまり、およびです。0x7e~0x7e+0x7e=0xfc

したがって、キーとテキストが表示可能な文字の範囲内にある限り、オーバーフローは発生しません。つまり、暗号化されたシーケンスを元に正しく復号化できます。

于 2013-03-28T03:53:21.767 に答える
0

文字列の長さと出力文字列を取得する

システムを使用して;

class MainClass {   
  public static void Main() {   
    string str1 = "ABCDEabcde1234567890";   

    Console.WriteLine("str1: " + str1); 

    Console.WriteLine("Length of str1: " + str1.Length);   
  }
}
于 2013-03-28T03:11:35.403 に答える