如何压缩随机字符串?

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

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

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

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

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

谢谢

压缩(几乎任何)随机数据是不可能的。 学习一点信息理论,熵,压缩如何工作以及鸽子原理将使这一点非常清楚。

这个规则的一个例外是,如果用“随机字符串”,你的意思是“随机数据以可压缩的forms表示,如hex”。 在这种情况下,您可以压缩字符串或(更好的选项)简单地将字节编码为基数64而不是使其更短。 例如

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

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

 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(); } } } } 

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

尝试使用gzip压缩,看看它是否有帮助