В Visual Studio 2012, Я пытаюсь зашифровать файл с помощью библиотеки Crypto ++ AES
шифрование и CBC
режим следующим образом:
#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
Кстати, я связал .lib
файл Crypto ++, поэтому я думаю, что эта ошибка вряд ли для этого.
Последний error
относится к CryptoPP::byte*
? Есть ли решение?
‘byte’: неоднозначная ошибка символа при использовании Crypto ++
Мы должны были двигаться byte
из глобального пространства имен в CryptoPP
пространство имен из-за C ++ 17 и std::byte
, Изменение произошло в Совершить 00f9818b5d8e, который был частью выпуска Crypto ++ 6.0.
Crypto ++ раньше ставил byte
в глобальном пространстве имен для совместимости с Microsoft SDK. Без глобального байта тогда вы встретите 'byte' : ambiguous symbol error
снова.
Вы видите ошибку, потому что вы использовали using namespace CryptoPP;
а также наборы Microsoft по-прежнему положить byte
в глобальном пространстве имен. Ошибка не появилась в Qt, потому что Qt не помещает байт в глобальное пространство имен.
Есть несколько обходных путей, обсуждаемых на std::byte
на Crypto ++ вики.
Между прочим, код набора Microsoft сломается, когда он встретит компилятор C ++ 17 и std::byte
из-за глобального Microsoft byte
, Вы столкнетесь с той же ошибкой при использовании комплектов Windows. По иронии судьбы, сотрудники Microsoft создали C ++ std::byte
, Также см PR0298R0, Определение типа байта.
Первая проблема решена с изменением byte*
в CryptoPP::byte*
:
CBC_Mode<AES>::Encryption encryptor((CryptoPP::byte*)szKey, AES::DEFAULT_KEYLENGTH, (CryptoPP::byte*)szInitVector);
Но для решения второй проблемы (error LNK 2038
):
Это связано с link error
Каждое тело, которое использует crypto++
в Visual Studio может иметь эту проблему.
Сначала я скачал библиотеку по ссылке ниже визуальная студия в котором содержится .sln
(Решение VS):
Я строю библиотеку через Пакетная сборка как cryptlib
проект в обоих штатах (Debug|Win32
а также Release|Win32
)
Debug
режим я связал cryptlib.lib
в cryptopp700\Win32\Output\Debug
в разделе зависимостей.Но я что-то забыл в свойствах проекта:
Наконец, я установил для параметра Runtime Library значение Многопоточная отладка (/ MTd)
Эта опция в:
Свойства проекта
Свойства конфигурации
C / C ++
Генерация кода
Библиотека времени исполнения