C#加密字符串

时间:2013-06-08 13:21:00

标签: c# encryption

我有以下代码来加密字符串。

    private void Crypt(int n, int m, int d)
    {
        n = Convert.ToInt32(n);
        m = Convert.ToInt32(m);
        d = Convert.ToInt32(d);


        // make a block from the string
        string invoerstring = invoer.Text;
        int stringlength = invoerstring.Length; 
        var blok = invoer.Text.PadRight(stringlength, ' ').Substring(0, stringlength);

        // the letters are shifted d times
        char [] buf = invoerstring.ToArray<char>();
        foreach (char c in buf)
        {
           var letter = uitvoer.Text += (char)( c + (char)d);
        }

        // shift characters inside a block
        var shift = String.Concat(invoerstring.Skip(m).Concat(invoerstring.Take(m)));
        uitvoer.Text = shift;  


    }

    private void button1_Click(object sender, EventArgs e)
    {

        Crypt(8,2,1);

    }

    private void clearbutton_Click(object sender, EventArgs e)
    {
        invoer.Text = "";
        uitvoer.Text = "";
    }


}

}

这是练习的解释:

  • crypt n m d text
  • 文本用空格填充,直到其长度为n
  • 的倍数
  • 文本中的字符通过位移d
  • 在字母表中循环移位
  • 示例:如果d = 1,则'a' - &gt; 'b','b' - &gt; 'c'....等...'z' - &gt; 'a'
  • 文本分为长度为n个字符的块
  • 在每个n块内,字符循环移位m次到左边
  • 移位的组被连接

当我运行我的代码时,字母不会移动d次。例如字符串: “aap noot mies”必须改为“q oppubbjft n”(当Crypt是Crypt(8,2,1))。我需要更改什么才能获得此结果?

1 个答案:

答案 0 :(得分:3)

你有很多问题/奇怪之处:<​​/ p>

  • Convert intInt32 s PadRight s,但前者只是后者的合成糖。
  • 您的string调用将返回初始字符串,因为您传递的长度等于Substring的长度。
  • 您的blok来电将返回初始字符串。
  • 您永远不会使用string
  • 您实际上从未将输入分成块或填充它。
  • IEnumerable已经实现了letter(你已经隐式使用的事实),所以不需要将它转换为数组只是为了循环它。
  • 您永远不会使用(char)( c + (char)d)
  • uitvoer.Text没有实现您正在寻找的Caeser cipher,您最终会将一些字母转换为非字母(除了一个退化的情况)。
  • 您将转换的结果连接到Concat(不清除它),然后在不使用它的情况下覆盖它。
  • 您正在调用string的单个参数静态版本(将其传递的对象转换为string)并将其传递给{{1}}。

首先修复你知道该怎么做的问题,如果你遇到问题就编辑问题。