简单的短加密字符串到固定长度n,无论输入字符串的长度是多少

本文关键字:字符串 输入 多少 简单 加密 | 更新日期: 2023-09-27 18:04:35

我想加密一个字符串,它必须被解密回来。输入字符串可以是不同的长度,但加密字符串必须是最多15个字符和字母数字。这是针对内部网应用程序的,因此安全性不是一个大问题。我应该能把它解密回另一页。我使用vs2012, c#, asp.net。请建议。我试过rijndael,但它的字符串很长。加密的字符串必须对用户友好,因为用户需要记住并输入它。

谢谢,DotNet

简单的短加密字符串到固定长度n,无论输入字符串的长度是多少

输入字符串可以是不同长度的,但是加密字符串必须是最多15个字符和字母数字。

这显然是不可能的。如果你解决了这个问题,你将解决所有可能的存储问题-毕竟,你将能够存储整个互联网(视为一个长字符串)在15个字母数字字符(解密后)。

您也没有告诉我们输入字符串可能由什么组成——假设您所说的"字母数字"是指A-Z, A-Z, 0-9,那么只有62个可能的字符。所以有62个15个可能的加密字符串。如果你的输入是UTF-16编码单位,那么只有6编码单位有更多的可能性(655366大于6215)。

基本上,你在做一个失败的提议——你应该重新考虑你的设计。

也许你应该将原始值存储在服务器中,返回一些令牌,然后能够在需要时获取值?这不是加密,但它可能满足您的实际需求。

进一步阅读:鸽子洞原理

我想你不是在寻找加密,而是哈希算法。哈希算法生成特定长度的哈希值(非加密文本)

John skeet几乎是对的。

如果转换为以10为基数的加密,则转换回添加字符:

! @ # $ % ^和 ;*()_+-=;:'"& lt;>。/' to the 0-9, A-Z, A-Z

那么你有时会缩小尺寸,所有的时间它将无法识别。

基本上是从大进制转换成10进制然后再转换成更大的进制

谢谢你的建议!我必须使用我的同伴使用的相同技术生成密码,也就是SHA

Convert.ToBase64String(new SHA1CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(username)));

正如Jon Skeet所指出的,您可能需要的是一个标记。您需要将数据存储在服务器(数据库?)上。使用令牌值作为检索数据的键。

如果您根本不需要任何安全性,您可以使用Identity字段(自动递增)。如果你想让它更难被猜测,你需要这样的东西:

    public static string GetRandomToken()
    {
        // create a guid and convert to a byte array
        var guid = Guid.NewGuid();
        var bytes = guid.ToByteArray();
        // xor the first 8 bytes with the last
        for (int i = 0; i < 8; i++)
        {
            bytes[i] = (byte)(bytes[i] ^ bytes[i + 8]);
        }
        // resize the array down to eight bytes
        Array.Resize<byte>(ref bytes, 8);
        // return the hexidecimal representation, with the last character lopped off
        return BitConverter.ToString(bytes).Replace("-", string.Empty).Substring(0, 15);
    }

这只处理生成长度为15的令牌。您仍然需要自己处理数据库访问。