将字符串加密为固定长度

我想将字符串加密到base64,字符串输入可以是差分长度(限制为16个字符),我想获得固定长度的加密字符串。

有谁知道在.NET框架中这样做的方法? 或者有算法来做到这一点?

如果您正在寻找单向加密(无需解密),则可以使用SHA1

string secretKey = "MySecretKey"; string salt = "123"; System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); byte[] preHash = System.Text.Encoding.UTF32.GetBytes(secretKey + salt); byte[] hash = sha.ComputeHash(preHash); string password = System.Convert.ToBase64String(hash); 

如果要加密和解密,可以使用RSA。

(编辑:我一直假设您要加密一个字符串,然后将结果编码为base64,总是以相同的输出长度结束。如果您可以澄清问题以确认这一点或解释您什么会有所帮助。想要,如果这不是它。)

好吧,有一个非常简单的算法可以使用任何加密方案,它总是将固定长度的输入加密到固定长度的输出(并且有很多这些):

  • 使用UTF-16将字符串编码为二进制文件(对于相同的字符串输入,它总是给出相同的字节数组长度)
  • 使用随机数据将二进制数据填充到32字节(即最大大小)
  • 在结尾(或开始)添加一个额外的字节,表示原始长度
  • 加密二进制数据(总是33个字节)
  • 使用Convert.ToBase64String将结果转换为base64

要解密,只需撤消该过程:

  • 使用Convert.FromBase64String将base64文本转换为加密的二进制数据
  • 解密二进制数据(返回“明文”二进制)
  • 从第一个或最后一个字节中查找长度
  • 将明文二进制文件的相关部分解码为UTF-16文本

(使用MSDN查找每个步骤的详细信息,并随意在特定部分寻求帮助。您选择的加密算法将取决于您尝试做什么,而且我不是专家,我是害怕。)

编辑:如果你只需要哈希,那么其他问题就会发挥作用。 你是否总是希望相同的字符串最终被哈希同一个字符串? 这通常适用于散列但不是加密。

这个MSDN参考的底部有一个非常明显的例子
换句话说,您需要在前面的示例中使用带有散列算法的RSA ,例如SHA1 。 SHA算法的使用是将任意长度的字符串转换为固定长度的字符串,因此如果您的字符串长度为1,000,000,000个字符,则不需要1,000,000,000个字节来存储它们。 在SHA1的情况下,您只需要在应用SHA算法后存储生成的字符串,该算法为160个字符。 我认为在你的情况下你只需要哈希而不是加密。使用SHA算法的好处是保护你的编码数据。 否则,任何聪明的家伙都能解密你的加密字符串。

编辑
由于您需要的结果散列长度小于着名的散列函数,因此有几种方法,一种着名的方法是将For循环中结果散列的前22个字节与原始散列的末尾进行异或 。 这将使你最终得到一个22个字符的字符串。 但是 ,不建议您散列的字符越少,您发生碰撞的可能性就越大,或者产生的长度较小的散列与系统中的另一个散列相似。

首先,“base64”不加密,它只是一种编码或传输封装。 它旨在通过仅允许ASCII字符的传输传输二进制数据。

其次,“base64”本身是可变长度的,所以我们必须手动填充编码的String,并删除用于解码的填充。

但是,以下代码演示了如何实现目标。

 using System; using System.Text; namespace encodingtest { class Program { public static void Main(string[] args) { string encoded = Encode("Hello World!", 43); Console.WriteLine(encoded); Console.WriteLine(Decode(encoded)); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } static public string Encode(string source, int length) { byte[] bytes = Encoding.UTF8.GetBytes(source); StringBuilder buffer = new StringBuilder(length); buffer.Append(System.Convert.ToBase64String(bytes)); while (buffer.Length < length) { buffer.Append('='); } return buffer.ToString(); } static public string Decode(string encoded) { int index = encoded.IndexOf('='); if (index >0) { encoded = encoded.Substring(0, ((index + 3) / 4) * 4); } byte[] bytes = System.Convert.FromBase64String(encoded); return System.Text.Encoding.UTF8.GetString(bytes); } } }