我正在查看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'字符会在什么阶段添加?
提前致谢
答案 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添加到每一行。