Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中字符串压缩的ascii输出_C_Encryption_Compression - Fatal编程技术网

C语言中字符串压缩的ascii输出

C语言中字符串压缩的ascii输出,c,encryption,compression,C,Encryption,Compression,我需要在项目中同时使用压缩和加密。项目中有两个项目 在第一个程序中,ascii文本文件首先被压缩,然后被加密。在此加密版本的文件上执行进一步的操作。然而,项目中的第二个程序遵循相反的过程,即首先解密,然后解压缩以获得原始ascii文本文件 我已经实现了加密模块(aes通过openssl),它运行良好。但是当我在linux中寻找压缩选项时,我发现gzip、zlib等抛出了它们自己的文件版本,即filename.gz或其他一些扩展名,其内容不完全是ascii。(例如,我在终端中查看输出时看到菱形符号

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

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

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


简而言之,我需要一个只包含ascii字符的压缩文件。通过任何方式都可以做到这一点吗?

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

  • 从c程序中读取二进制数据。 (例如,
    char缓冲区[256];c=fread(缓冲区,1256,stdin);
  • 将数据转换为十六进制格式
    静态字符加密的_文件[]={0x01,0x6e,…}

    • 终于解决了这个问题。程序正在正确处理一切

      在发送端:

      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
      

      您的加密算法不会发出仅asci字符(感谢上帝)。为什么对压缩机有这样的限制?从什么时候开始,你不能在C程序中读取二进制文件了?你可以使用或类似的编码对压缩输出进行后处理,但这会使你的效率降低25%(这是一种8位编码中的6位编码)。解决程序无法读取二进制编码文件的问题可能更好。通过使用压缩文件的“仅ASCII”表示形式,您可以取消压缩带来的大部分好处。仅ASCII表示法将比二进制表示法占用更多空间。要读取文件,请使用“二进制模式”(在类似Unix的平台上是不可操作的,在Windows上至关重要)。不要对二进制数据使用字符串操作函数;数据中将有空字节(压缩或加密或两者兼有)。@fvu:33%?Base-64增长了三分之一(每3英寸需要4个字节)。@JonathanLeffler同样的事情,不同的透视图4/3=133%,33%的开销,但3/4=75%和1-75%=25%的扩展…即使从stdin读取二进制数据也是一种可选的UENCODE格式,因为它可能包含空格。改用Base-64编码;它从uuencode学习,避免uuencode犯的错误。你是对的。只是将其用作剥离MSB的可逆过程的示例。此外,出于安全目的,拥有大量已知纯文本是一个不好的选择。@akishuihkonen无论是
      uuencode
      还是base64编码都不会有任何安全含义。它们都只是简单的编码,使用简化的代码集进行传输(例如,8位不干净通道)。base64的“已知纯文本”与
      uuencode
      一样多,哈夫曼编码、算术编码或任何其他算法的唯一目的都是将一组码字重新编码为不同的字母表或结构(对于我刚才在这里所给出的定义,我深表歉意).uuencode有一个结构:它通常以“begin 644”开头,以backquote结尾;它还包含周期序列CR+ascii M。