加密/解密数字的简单方法

时间:2013-01-03 16:21:15

标签: c# asp.net-mvc

我需要以简单的方式加密2位数字。我在谷歌找到的样本似乎相当复杂。有没有简单的方法来实现这一目标?

更新

我正在为我的ASP.NET MVC应用程序开发自定义数字验证码。我创建了一个自定义的html帮助器,它将使用验证码图像的base-64编码字符串渲染图像标记。验证码图像将类似于23 + 12 = ?。当用户提交答案时我想验证它吗?我对在会话中存储总和不感兴趣所以我想加密总和并附加为隐藏字段,因此当用户提交表单时,我可以轻松地进行验证。

2 个答案:

答案 0 :(得分:2)

如果您的号码是x,那么您可以将其加密为(x + key) mod 100。这将产生另一个2位数字y

它并没有那么简单。

如果需要,解密只是x = y - key+100

如果key是2:

x = 15
y = 15 + 2 = 17
x = 17 - 2 = 15

x = 99
y = 99 + 2 mod 100 = 101 mod 100 = 1
x = 1 - 2 + 100 = 99;

更简单的方法是将x加密为x。他们绝对不会期待......

编辑1:

更严重的是,如果这不是某种个人实验/家庭作业,我将不再使用这种“简单”算法,而应使用System.Security.Cryptography以及那些来自Google或Google的非复杂样本。查尔斯太阳的comment。除非你制造一个载体,否则永远不会实现你自己的加密/解密算法,这种方式就是疯狂。

编辑2:

所以你想要将验证码及其正确的响应发送给客户端吗?我不认为这是怎么做的(但这又不是我的领域......)。我一直认为验证是在服务器端完成的(您控制的部分并保持安全)。

为了安全起见,我会以艰难的方式做到这一点并正确地加密一切。

答案 1 :(得分:1)

这可能并不完全严重,但它确实有效!

  static IEnumerable<string> GetRandomStringsForever()
  {
    var rng = new Random();  // or maybe new Random(14142848)
    while (true)
    {
      char[] arr = new char[8];
      for (int idx = 0; idx < arr.Length; ++idx)
        arr[idx] = (char)rng.Next('A', 'Z' + 1);
      yield return new string(arr);
    }
  }

  static void Main()
  {
    var secretKey = GetRandomStringsForever().Distinct().Take(100).ToList();

    int message = 42;

    // encrypt:
    string cryptic = secretKey[message];

    Console.WriteLine("Who can guess the number from this: " + cryptic);

    // decrypt:
    int reconstructed = secretKey.IndexOf(cryptic);

    Console.WriteLine("The message was: " + reconstructed);

  }

好吧,如果人们知道你正在使用我的想法这样做,他们可能会自己构建secretKey(使用与你相同的.NET版本),所以这不是真的安全。