【问题标题】:ascii output of string compression in CC中字符串压缩的ascii输出
【发布时间】:2012-10-24 21:21:06
【问题描述】:

我需要在项目中同时使用压缩和加密。项目中有两个程序。

在第一个程序中,一个 ascii 文本文件首先被压缩然后加密。对该文件的这个加密版本进行进一步的操作。然而,项目中的第二个程序遵循相反的过程,即首先解密然后解压缩以获得原始的 ascii 文本文件。

我已经实现了加密模块(aes via openssl)并且工作正常。但是当我在 linux 中寻找压缩选项时,我发现 gzip、zlib 等会抛出他们自己的文件版本,即 filename.gz 或其他扩展名,其内容不是纯粹的 ascii。 (例如,当我在终端中查看输出时,我看到菱形符号)正因为如此,我无法在我的 C 程序中完全读取压缩文件。

简而言之,我需要一个仅包含 ascii 字符的压缩文件。这有可能吗?

【问题讨论】:

  • 您的加密算法不会发出纯 asci 字符(谢天谢地)。为什么对您的压缩机有这样的限制?你什么时候不能在 C 程序中读取 binary 文件了?
  • 您可以使用base64 或类似编码对压缩输出进行后处理,但这会花费您 25% 的效率(它是 8 位编码中的 6 位)。解决程序无法读取二进制编码文件的问题可能会更好。
  • 通过使用压缩文件的“仅ASCII”表示,您将取消压缩的大部分好处。仅 ASCII 表示将比二进制表示占用更多空间。要读取文件,请使用“二进制模式”(类 Unix 平台上的无操作,在 Windows 上至关重要)。并且不要对二进制数据使用字符串操作函数; 数据中有空字节(压缩或加密或两者兼有)。
  • @fvu:33%? Base-64 增长了三分之一(每 3 in 需要 4 个字节)。
  • @JonathanLeffler 同样的事情,不同的视角 4/3 = 133% 用于 33% 开销,但 3/4 = 75% 和 1 - 75% = 25% 扩展......

标签: c encryption compression


【解决方案1】:

终于解决了这个问题。该程序正在正确处理所有内容。

发送方:

compression: gzip -c secret.txt -9 > compressed.txt.gz
encryption: openssl enc -aes-256-cbc -a -salt -in compressed.txt.gz -out encrypted.txt

压缩输出 (gz) 作为输出文本文件的加密输入。结果输出是纯 ascii。

在接收方:

decryption: openssl enc -d -aes-256-cbc -a -in decryptme.txt -out decrypted.txt.gz
decompression: gunzip -c decrypted.txt.gz > message.txt

【讨论】:

    【解决方案2】:

    您可以在压缩和加密之间添加 uuencode / uudecode 过滤器 - 或者您可能希望放松压缩数据的限制为 ascii 格式:选项:

    • 从您的 c 程序中读取二进制数据。 (例如char buffer[256]; c=fread(buffer,1,256,stdin);
    • 将数据转换为十六进制格式
      static char encrypted_file[]={ 0x01,0x6e, ... };

    【讨论】:

    • 甚至可以从标准输入读取二进制数据
    • uuencode 是一种可怕的格式,因为它可以包含空格。改用 Base-64 编码;它从 uuencode 中学习,避免 uuencode 犯的错误。
    • 你是对的。只是将其用作剥离 MSB 的可逆过程的示例。同样出于安全目的,它不适合拥有大量已知的纯文本。
    • @AkiSuihkonen uuencode 和 base64 编码都没有任何安全含义。它们都只是简单的编码,使用简化的代码集进行传输(例如 8 位不干净的通道)。 base64 具有与uuencode 一样多的“已知纯文本”,就像霍夫曼编码、算术编码或任何其他算法一样,其唯一目的是将一组代码字重新编码为不同的字母表或结构(向我只是在那里拉伸变形的定义)。
    • uuencode 有一个结构:它通常以 'begin 644' 开始,以反引号结束;它还包含周期性序列 CR+ascii M.
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多