在 Visual Studio 2012 中,我尝试使用具有AES
加密和CBC
模式的Crypto ++库对文件进行加密,如下所示:
#include <Windows.h>
#include "aes.h"
#include "modes.h"
#include "files.h"
#include <Shlwapi.h>
using namespace CryptoPP;
INT main(INT argc, CHAR *argv[])
{
CHAR szKey[16] = {0};
CHAR szInitVector[AES::DEFAULT_KEYLENGTH] = {0};
StrCpyA(szKey, "qqwweeff88lliioo");
StrCpyA(szInitVector, "eerrttooppkkllhh");
CBC_Mode<AES>::Encryption encryptor((byte*)szKey, AES::DEFAULT_KEYLENGTH, (byte*)szInitVector);
FileSource fs("in.txt", true, new StreamTransformationFilter(encryptor, new FileSink("out.aes")));
return 0;
}
在Qt
中它确实起作用!,但是在这里,我想知道为什么得到以下error
:
error C2872: 'byte' : ambiguous symbol
could be 'c:\program files (x86)\windows kits\8.0\include\shared\rpcndr.h(164) : unsigned char byte'
or 'z:\cryptography\app_aesencryption\aes headers\config.h(237) : CryptoPP::byte'
由于防止了ambiguous symbol
错误,即使我用CryptoPP::byte*
进行了波纹管语句:
CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);
'byte' : ambiguous symbol
没有任何错误,但是它给了我很多errors
的信息:
error LNK 2038
顺便说一句,我链接了Crypto ++的.lib
文件,因此我认为此错误不太可能。
最后一个error
与CryptoPP::byte*
相关吗?有什么解决办法吗?
答案 0 :(得分:2)
'byte':使用Crypto ++时模棱两可的符号错误
由于C ++ 17和byte
,我们不得不将CryptoPP
从全局命名空间移到std::byte
命名空间。更改发生在Commit 00f9818b5d8e,它是Crypto ++ 6.0版本的一部分。
Crypto ++过去将byte
放在全局命名空间中是为了与Microsoft SDK兼容。如果没有全局字节,那么您将再次遇到 'byte' : ambiguous symbol error
。
您看到的错误是因为您使用了using namespace CryptoPP;
和 ,Microsoft工具包仍将byte
放在了全局命名空间中。该错误并未在Qt下浮出水面,因为Qt不在全局名称空间中放置了一个字节。
在Crypto ++ Wiki的std::byte
上讨论了几种变通方法。
偶然地,由于Microsoft的全局std::byte
,当遇到C ++ 17编译器和byte
时,Microsoft工具包代码将中断。使用Windows套件时,您将遇到相同的错误。具有讽刺意味的是,Microsoft员工编写了C ++ std::byte
。另请参见PR0298R0, A byte type definition。
答案 1 :(得分:0)
第一个问题通过将byte*
更改为CryptoPP::byte*
来解决:
CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);
但是要解决第二个问题(error LNK 2038
):
这与link error
有关,在 Visual Studio 中使用crypto++
的每个正文都可能有此问题。
首先,我是从 visual studio 的波纹管链接下载库,其中包含.sln
(VS解决方案):
我通过 Batch Build 作为cryptlib
项目在两种状态(Debug|Win32
和Release|Win32
)中构建库。
Debug
模式,所以我在依赖项部分的cryptlib.lib
中链接了cryptopp700\Win32\Output\Debug
。但是我忘记了项目属性:
最后,我将“运行时库”选项设置为多线程调试(/ MTd)
此选项位于:
项目属性
配置属性
C / C ++
代码生成
运行时库