标签归档: openssl

OPENSSL AES解密文件遇到的一个小坑

    openssl aes解密需要用到 EVP_CIPHER_CTX_new EVP_DecryptInit_ex EVP_DecryptUpdate EVP_DecryptFinal_ex EVP_CIPHER_CTX_free 五个函数。

默认启用了填充,如果不需要需调用EVP_CIPHER_CTX_set_padding设成0禁用。

在解密大文件的时候需要持续调用EVP_DecryptUpdate来解密,我犯了个错误就是inbuf大小和outbuf大小设成一样,出问题查官方文档才知道outbuf大小要比inbuf大。

EVP_DecryptInit_ex(), EVP_DecryptUpdate() and EVP_DecryptFinal_ex() are the corresponding decryption operations. EVP_DecryptFinal() will return an error code if padding is enabled and the final block is not correctly formatted. The parameters and restrictions are identical to the encryption operations except that if padding is enabled the decrypted data buffer out passed to EVP_DecryptUpdate() should have sufficient room for (inl + cipher_block_size) bytes unless the cipher block size is 1 in which case inl bytes is sufficient.

网上的代码不能乱抄啊!看官方文档的重要性。

https://www.openssl.org/docs/man1.0.2/crypto/EVP_DecryptUpdate.html

https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption

vc6编译libcurl-7.30.0

下载
curl-7.30.0
http://curl.haxx.se/download/curl-7.30.0.zip
zlib-1.2.8
http://zlib.net/zlib128.zip
openssl-1.0.1e
http://www.openssl.org/source/openssl-1.0.1e.tar.gz

编译openssl
首先要安装 ActivePerl
命令行方式进入openssl目录
不使用“-DOPENSSL_USE_IPV6=0”参数会有一个结构未定义的错误。
C:\\openssl-1.0.1e\\perl Configure VC-WIN32 -DOPENSSL_USE_IPV6=0
C:\\openssl-1.0.1e\\ms\\do_ms
静态的 C:\\openssl-1.0.1e\\nmake -f ms\\nt.mak
动态的 C:\\openssl-1.0.1e\\nmake -f ms\\ntdll.mak
最会会输出到目录 C:\\openssl-1.0.1e\\out32dll

编译zlib
命令行方式进入zlib目录
nmake -f win32/Makefile.msc

最后编译libcurl
在curl-7.30.0\\lib目录下新建build.bat,输入以下内容

call "C:/Program Files/Microsoft Visual Studio/VC98/Bin/vcvars32.bat"
set CFG=release-dll-ssl-dll-zlib-dll
set OPENSSL_PATH=C:/openssl-1.0.1e
set ZLIB_PATH=C:/zlib-1.2.8
nmake -f Makefile.vc6

保存,然后运行。
如果已经装了February 2003 Platform SDK 还遇到 .\\curl_setup.h(588) : fatal error C1189: #error : MSVC 6.0 requires "February 2003 Platform SDK"
打开 Makefile.vc6 找 CFLAGS 宏 后面加 /I "C:\\Program Files\\Microsoft SDK\\include" 就ok了。我遇到的是vc6明明装了PSDK 目录也设了就是没找到。只能这样了。

最后就会在C:\\curl-7.30.0\\lib 目录输出dll 和 lib了

编译好的 libcurl-7.30.0

CURL全局初始化问题

最近一个例子调试很久才找到问题。

情况是这样的

A函数里先调用B函数,再调用C函数。

C函数要用到curl openssl版的,在C函数开始部分curl_global_init(CURL_GLOBAL_ALL); 全局初始化,在结尾部分curl_global_cleanup();全局释放。

假如B函数也用到了openssl。这个A函数如果在main函数里执行一遍是没有问题的。如果在主函数里执行两遍以上A函数,问题就会出现了。最后查找原因是因为curl_global_cleanup();把openssl给释放了。造成第二次执行A再执行B的时候B出问题了,间接造成B出问题。

结论:curl_global_init(CURL_GLOBAL_ALL); 一定要放在主程序开头。curl_global_cleanup();函数一定要放在主程序结尾