我正在开发一个基于RSA非对称算法的加密应用程序。它生成一个密钥对,用户必须保留它。由于密钥对是长随机字符串,我想创建一个函数,允许我根据模式压缩生成的长随机字符串(密钥对)。
(例如,函数获取包含100个字符的字符串,并返回包含30个字符的字符串)
因此,当用户输入压缩字符串时,我可以根据我使用的模式重新生成密钥对。
但是一个人告诉我,压缩随机的东西是不可能的,因为它们是随机的!
你的主意是什么?有办法这样做吗?
谢谢
发布于 2014-03-20 14:52:24
压缩(几乎任何)随机数据是不可能的。学习一下信息论,熵,压缩工作原理,以及鸽子洞原理,这将使这一点变得更加清晰。
这个规则的一个例外是,如果使用“随机字符串”,意思是“以可压缩形式表示的随机数据,如十六进制”。在这种情况下,您可以压缩字符串或(更好的选项)将字节编码为基64,而不是使其更短。例如。
// base 16, 50 random bytes (length 100)
be01a140ac0e6f560b1f0e4a9e5ab00ef73397a1fe25c7ea0026b47c213c863f88256a0c2b545463116276583401598a0c36
// base 64, same 50 random bytes (length 68)
vgGhQKwOb1YLHw5KnlqwDvczl6H+JcfqACa0fCE8hj+IJWoMK1RUYxFidlg0AVmKDDY=相反,您可能会给用户一个更短的哈希或该值的指纹(例如,最后的x字节)。然后,通过在某个地方存储完整的密钥和散列,您可以在他们给您哈希时给他们密钥。您必须让这个散列足够长,这样安全性才不会受到损害。根据应用程序的不同,这可能会失败,因为散列必须与密钥一样长,或者可能不是问题。
发布于 2014-03-20 15:01:22
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();
}
}
}
}考虑到这不需要更短的时间。取决于字符串的内容。
发布于 2014-03-20 14:52:43
尝试使用gzip压缩,看看它是否对您有帮助。
https://stackoverflow.com/questions/22536489
复制相似问题