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

C# 加密/解密数字的简单方法,c#,asp.net-mvc,C#,Asp.net Mvc,我需要用一种简单的方法加密一个2位数的数字。我在谷歌找到的样本似乎相当复杂。有什么简单的方法可以做到这一点吗 更新 我正在为我的ASP.NET MVC应用程序编写自定义数字验证码。我已经创建了一个自定义html帮助程序,它将使用captcha图像的base-64编码字符串呈现图像标记。验证码图像类似于23+12=?。当用户提交答案时,我想验证它,对吗?我对在会话中存储总和不感兴趣,所以我想对总和进行加密并附加为隐藏字段,这样当用户提交表单时,我就可以轻松地进行验证。如果您的号码是x,那么您可以将

我需要用一种简单的方法加密一个2位数的数字。我在谷歌找到的样本似乎相当复杂。有什么简单的方法可以做到这一点吗

更新


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

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

没有比这更简单的了

解密只需
x=y-key
+100
(如有必要)

如果
为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或charles sun的示例。除非你用它做了一个载体,否则你永远不会实现你自己的加密/解密算法,那样做是疯狂的

编辑2:

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


为了安全起见,我会用很难的方法加密所有东西。

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

没有比这更简单的了

解密只需
x=y-key
+100
(如有必要)

如果
为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或charles sun的示例。除非你用它做了一个载体,否则你永远不会实现你自己的加密/解密算法,那样做是疯狂的

编辑2:

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


为了安全起见,我会用很难的方法加密所有内容。

这可能不太严重,但它确实有效

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

  }
静态IEnumerable GetRandomStringsForver()
{
var rng=new Random();//或者可能是new Random(14142848)
while(true)
{
char[]arr=新字符[8];
对于(int-idx=0;idx

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

这可能不是很严重,但它是有效的

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

  }
静态IEnumerable GetRandomStringsForver()
{
var rng=new Random();//或者可能是new Random(14142848)
while(true)
{
char[]arr=新字符[8];
对于(int-idx=0;idx

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

你看过System.Security.Cryptography了吗?n+=1。他们永远也看不到它的到来。@fire.eagle:那么99呢?你为什么要加密一个两位数的数字?那似乎没什么意义。还有其他要求吗?看起来太简单了…你看过系统安全加密吗?n+=1。他们永远也看不到它的到来。@fire.eagle:那么99呢?你为什么要加密一个两位数的数字?那似乎没什么意义。还有其他要求吗?这似乎太简单了。。。