简单短加密字符串到固定长度n与输入字符串长度有关

时间:2014-05-22 17:51:42

标签: c# asp.net-mvc-4 encryption

我想加密一个字符串,它必须被解密回来。输入字符串的长度可能不同,但加密字符串的最大长度必须为15个字符和字母数字。这适用于Intranet应用程序,因此安全性不是一个大问题。我应该能够解密它以匹配另一页。我正在使用vs2012,c#,asp.net。请指教。我试过rijndael,但它给了一个很长的字符串。加密的字符串必须是用户友好的,因为用户需要记住并输入它。

谢谢, DOTNET的

5 个答案:

答案 0 :(得分:8)

  

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

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

您还没有告诉我们输入字符串可能包含的内容 - 假设“字母数字”表示A-Z,a-z,0-9只有62个可能的字符。因此有62个 15 可能的加密字符串。如果您的输入是UTF-16代码单元,那么只有 6 代码单元有更多可能性(65536 6 大于62 15 )。

基本上,你在这里遇到了一个失败的主张 - 你应该重新考虑你的设计。

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

进一步阅读:the pigeonhole principle

答案 1 :(得分:0)

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

答案 2 :(得分:0)

John skeet几乎是对的。

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

!@#$%^& *()_ + - = ;:'“<>,。?/ \到0-9,A-Z,a-z

然后你有时会缩小它的大小和所有无法识别的时间。

基本上从大基数转换为基数10,然后将其转换为更大的基数

答案 3 :(得分:0)

感谢您的建议!我必须使用我的同伴使用的SHA相同的技术生成密码。

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

答案 4 :(得分:-1)

当Jon Skeet提出时,您可能需要的是令牌。您需要将数据存储在服务器上(数据库?)。使用标记值作为密钥来检索数据。

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

    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的令牌。您仍然需要自己处理数据库访问。