我在Windows上配置并构建了openssl 3.0.15,并且运行良好。我也有静态库和共享库。当我尝试将我的应用程序链接到其中之一时,我注意到它适用于静态库,但不适用于 dll。看来导出的符号是不同的。是故意的吗?我是不是错过了什么?
我创建了一个虚拟应用程序:
#include <stdio.h>
#include <crypto/chacha.h>
int main() {
unsigned char key[32] = {0};
unsigned char nonce[12] = {0};
unsigned char in[64] = {0};
unsigned char out[64] = {0};
// Initialize the key and nonce with some values
for (int i = 0; i < 32; i++) key[i] = i;
for (int i = 0; i < 12; i++) nonce[i] = i;
// Encrypt the input data
ChaCha20_ctr32(out, in, sizeof(in), (const unsigned int *)key, (const unsigned int *)nonce);
// Print the encrypted output
printf("Encrypted output:\n");
for (int i = 0; i < sizeof(out); i++) {
printf("%02x", out[i]);
if ((i + 1) % 16 == 0) printf("\n");
}
return 0;
}
我尝试像这样构建它:
cl /I <path-to-openssl>\openssl-openssl-3.0.15\include linktest.c /link /LIBPATH:<path-to-openssl>\openssl-openssl-3.0.15 libcrypto_static.lib
这有效。
这不:
cl /I <path-to-openssl>\openssl-openssl-3.0.15\include linktest.c /link /LIBPATH:<path-to-openssl>\openssl-openssl-3.0.15 libcrypto.lib
编译器这样说:
linktest.obj : error LNK2019: unresolved external symbol ChaCha20_ctr32 referenced in function main
linktest.exe : fatal error LNK1120: 1 unresolved externals
我在Windows上配置并构建了openssl 3.0.15,并且运行良好。
您是否执行了
nmake install
步骤?或者您是否直接根据 OpenSSL 源目录中的标头构建应用程序?
您将
crypto/chacha.h
头文件包含在 OpenSSL 公共标头中,该文件不会通过 nmake install
安装。该头文件完全是 OpenSSL 的内部文件,不构成 OpenSSL 公共 API 的一部分。您不应该使用其中包含的任何符号 - 并且这些符号都没有记录在公共文档中。
静态链接时它恰好可以工作,因为这些内部符号存在于静态库中。但它们不是由 dll 导出的 - 这就是您遇到问题的原因。
为了使用 ChaCha20 算法,您应该使用
EVP_Encrypt*
和 EVP_Decrypt*
API:
https://docs.openssl.org/master/man3/EVP_EncryptInit/
另请参阅:
https://docs.openssl.org/master/man7/EVP_CIPHER-CHACHA/
这里有演示代码:
https://github.com/openssl/openssl/blob/master/demos/cipher/ariacbc.c
该演示适用于“ARIA-256-CBC”,但您可以简单地将其替换为“ChaCha20”