首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何压缩随机字符串?

如何压缩随机字符串?
EN

Stack Overflow用户
提问于 2014-03-20 14:45:06
回答 3查看 1.2K关注 0票数 1

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

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

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

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

你的主意是什么?有办法这样做吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-20 14:52:24

压缩(几乎任何)随机数据是不可能的。学习一下信息论,熵,压缩工作原理,以及鸽子洞原理,这将使这一点变得更加清晰。

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

代码语言:javascript
复制
// base 16, 50 random bytes (length 100)
be01a140ac0e6f560b1f0e4a9e5ab00ef73397a1fe25c7ea0026b47c213c863f88256a0c2b545463116276583401598a0c36
// base 64, same 50 random bytes (length 68)
vgGhQKwOb1YLHw5KnlqwDvczl6H+JcfqACa0fCE8hj+IJWoMK1RUYxFidlg0AVmKDDY=

相反,您可能会给用户一个更短的哈希或该值的指纹(例如,最后的x字节)。然后,通过在某个地方存储完整的密钥和散列,您可以在他们给您哈希时给他们密钥。您必须让这个散列足够长,这样安全性才不会受到损害。根据应用程序的不同,这可能会失败,因为散列必须与密钥一样长,或者可能不是问题。

票数 6
EN

Stack Overflow用户

发布于 2014-03-20 15:01:22

代码语言:javascript
复制
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();
            }
        }
    }
}

考虑到这不需要更短的时间。取决于字符串的内容。

票数 0
EN

Stack Overflow用户

发布于 2014-03-20 14:52:43

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22536489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档