将字符串加密为固定长度

时间:2011-03-03 07:21:38

标签: c# .net encryption base64

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

答案 1 :(得分:0)

如果您正在寻找单向加密(无需解密),您可以使用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。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

首先,“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);
        }
    }
}