0

我需要以一种简单的方式加密一个 2 位数字。我在 google 中找到的样本似乎相当复杂。有什么简单的方法可以实现吗?

更新

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

4

2 回答 2

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;

更简单的是加密xx. 他们绝对不会想到……

编辑1:

更严肃地说,如果这不是某种个人实验/家庭作业,我会远离这种“简单”的算法,并使用 System.Security.Cryptography 以及来自谷歌或查尔斯孙评论的那些不那么复杂的样本. 除非你用它做一个载体,否则永远不要实现你自己的加密/解密算法,那样就很疯狂。

编辑2:

因此,您想将验证码及其正确响应都发送给客户端?我不认为这就是它的完成方式(但这又不是我的领域......)。我一直认为验证是在服务器端完成的(你控制并保持安全的部分)。

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

于 2013-01-03T16:28:39.033 回答
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),所以这并不安全。

于 2013-01-03T17:06:50.793 回答