我想加密一个字符串,它必须被解密回来。输入字符串的长度可能不同,但加密字符串的最大长度必须为15个字符和字母数字。这适用于Intranet应用程序,因此安全性不是一个大问题。我应该能够解密它以匹配另一页。我正在使用vs2012,c#,asp.net。请指教。我试过rijndael,但它给了一个很长的字符串。加密的字符串必须是用户友好的,因为用户需要记住并输入它。
谢谢, DOTNET的
答案 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的令牌。您仍然需要自己处理数据库访问。