如何压缩随机字符串?

时间:2014-03-20 14:45:07

标签: c# .net string compression

我正在研究一种基于RSA非对称算法的加密器应用程序。 它生成一个密钥对,用户必须保留它。 由于密钥对是长随机字符串,我想创建一个函数,让我根据模式压缩生成的长随机字符串(键对)。

(例如,函数获取包含100个字符的字符串并返回包含30个字符的字符串)

因此,当用户输入压缩字符串时,我可以根据我压缩的模式重新生成密钥对。

但是有人告诉我,压缩随机的东西是不可能的,因为它们是随机的!

你的想法是什么? 有没有办法做到这一点?

由于

3 个答案:

答案 0 :(得分:6)

无法压缩(几乎任何)随机数据。学习一些关于信息理论,熵,压缩如何工作以及鸽笼原理的知识将使这一点变得非常清晰。

此规则的一个例外是,通过"随机字符串",您的意思是"以可压缩形式表示的随机数据,如十六进制"。在这种情况下,您可以压缩字符串或(更好的选项)简单地将字节编码为基数64而不是使其更短。 E.g。

// base 16, 50 random bytes (length 100)
be01a140ac0e6f560b1f0e4a9e5ab00ef73397a1fe25c7ea0026b47c213c863f88256a0c2b545463116276583401598a0c36
// base 64, same 50 random bytes (length 68)
vgGhQKwOb1YLHw5KnlqwDvczl6H+JcfqACa0fCE8hj+IJWoMK1RUYxFidlg0AVmKDDY=

您可以改为为用户提供较短的哈希值或指纹值(例如最后x个字节)。然后通过存储完整的密钥和哈希值,你可以在他们给你哈希时给他们密钥。您必须将此哈希足够长,以确保安全性不受损害。根据您的应用程序,这可能会破坏目的,因为哈希必须与密钥一样长,否则可能不是问题。

答案 1 :(得分:0)

public static string ZipStr(String str)
{
    using (MemoryStream output = new MemoryStream())
    {
        using (DeflateStream gzip = 
          new DeflateStream(output, CompressionMode.Compress))
        {
            using (StreamWriter writer = 
              new StreamWriter(gzip, System.Text.Encoding.UTF8))
            {
                writer.Write(str);           
            }
        }

        return Convert.ToBase64String(output.ToArray());
    }
}

public static string UnZipStr(string base64)
{
    byte[] input = Convert.FromBase64String(base64);

    using (MemoryStream inputStream = new MemoryStream(input))
    {
        using (DeflateStream gzip = 
          new DeflateStream(inputStream, CompressionMode.Decompress))
        {
            using (StreamReader reader = 
              new StreamReader(gzip, System.Text.Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

考虑到这根本不需要更短......取决于字符串的内容。

答案 2 :(得分:-2)

尝试使用gzip压缩并查看它是否对您有所帮助