openssl smime演示程序(smenc.c和smdec.c)产生不一致的结果

时间:2017-11-21 17:11:23

标签: encryption openssl smime

我正在查看openssl-1.0.1e / demos / smime下的示例程序。以下是我的步骤:

gcc -o smenc smenc.c -lcrypto
gcc -o smdec smdec.c -lcrypto
./smenc     -> This encrypts encr.txt into smencr.txt
./smdec     -> This decrypts smencr.txt into encrout.txt

现在将往返结果与原始结果进行比较:

vimdiff -b encr.txt encrout.txt

您可以看到往返结果每行都有一个额外的'\ r'。有人知道这些'\ r'字符会在什么阶段添加?

提前致谢

1 个答案:

答案 0 :(得分:0)

答案实际上是在smime(1)手册页中。寻找“-binary”标签。在加密期间,如果未使用“-binary”标志,则代码将用“\ r \ n”替换所有EOL。

举个好例子,我认为演示代码应具有往返一致性。要获得此行为,您可以修改smenc.c以使标记行如下所示:

  int flags = PKCS7_STREAM|PKCS7_BINARY
但是,我发现这很难。对于那些对跟踪openssl代码感兴趣的人,我就是这样做的:

  • 下载openssl-1.0.1e,运行“./config --openssldir =”(否则你会得到关于openssl.cnf的投诉,但这很容易搞定),然后修改./Makefile来替换CFLAGS中带有-g的“-O3”,然后运行“make”。

  • 在demos / smime下,以这种方式构建加密和解密代码,这样你也可以跟踪加密库,否则你很可能在系统libcrypto中链接:

    gcc -g -o smdec smdec.c -L../../ -lcrypto -ldl
    gcc -g -o smenc smenc.c -L../../ -lcrypto -ldl
    
  • 现在您可以运行“gdb --args ./smenc”并在SMIME_crlf_copy()处中断。运行回溯,你可以看到它是如何到达的,以及如何将CRLF添加到每一行。