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

openssl smime demo programs (smenc.c and smdec.c) produces inconsistent result

我在看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' 字符是在什么阶段添加的吗?

提前致谢

答案实际上在 smime(1) 联机帮助页中。寻找“-binary”标签。在加密过程中,如果不使用“-binary”标志,代码会将所有 EOL 替换为“\r\n”。

作为一个很好的例子,我认为演示代码应该具有往返一致性。要具有此行为,您可以修改 smenc.c 以具有如下标志行:

  int flags = PKCS7_STREAM|PKCS7_BINARY

虽然我发现它很困难。对于有兴趣跟踪 openssl 代码的人,这是我所做的:

  • 下载openssl-1.0.1e, 运行 "./config --openssldir=" (不然会被投诉openssl.cnf, 不过这个很容易搞定around),然后修改./Makefile,将CFLAGS中的“-O3”替换为-g,然后运行 "make".

  • 在 demos/smime 下,以这种方式构建加密和解密代码,以便您也可以跟踪加密库,否则您可能会 link 在系统 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 是如何添加到每一行的。