我需要以一种简单的方式加密一个 2 位数字。我在 google 中找到的样本似乎相当复杂。有什么简单的方法可以实现吗?
更新
我正在为我的 ASP.NET MVC 应用程序开发自定义数字验证码。我创建了一个自定义 html 帮助程序,它将使用验证码图像的 base-64 编码字符串呈现图像标记。验证码图像将类似于23 + 12 = ?
. 当用户提交答案时,我想验证它对吗?我对在会话中存储总和不感兴趣,所以我想加密总和并将其附加为隐藏字段,因此当用户提交表单时,我可以轻松地进行验证。
我需要以一种简单的方式加密一个 2 位数字。我在 google 中找到的样本似乎相当复杂。有什么简单的方法可以实现吗?
更新
我正在为我的 ASP.NET MVC 应用程序开发自定义数字验证码。我创建了一个自定义 html 帮助程序,它将使用验证码图像的 base-64 编码字符串呈现图像标记。验证码图像将类似于23 + 12 = ?
. 当用户提交答案时,我想验证它对吗?我对在会话中存储总和不感兴趣,所以我想加密总和并将其附加为隐藏字段,因此当用户提交表单时,我可以轻松地进行验证。
如果您的号码是,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 以及来自谷歌或查尔斯孙评论的那些不那么复杂的样本. 除非你用它做一个载体,否则永远不要实现你自己的加密/解密算法,那样就很疯狂。
编辑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);
}
好吧,如果人们知道您正在使用我的想法执行此操作,他们可能能够自己构建secretKey
(使用与您相同版本的 .NET),所以这并不安全。