我正在使用XTR和DH算法Crypto ++创建项目,但它仅在命令行中运行。
我曾尝试在VS2015中使用winform gui,但在将运行时库更改为MDd并激活CLR时始终会出错。我用CLR项目创建了新项目,它仍然出错
我的问题是:
答案 0 :(得分:1)
...将运行时库更改为
时出错/MDd
将构建设置从 静态 运行时链接更改为 Dynamic 的运行时链接的说明位于{{ 3}}。
简而言之,将MultiThreaded
更改为MultiThreadedDLL
进行调试和发布。
cryptlib.vcxproj
。<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
更改为<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
。将<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
更改为<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
。
在记事本中打开cryptest.vcxproj
。
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
更改为<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
。<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
更改为<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
。在运行时,删除Cryptdll和Dlltest项目。它们用于FIPS DLL,您 不要 要使用它们。
并激活CLR ...
我似乎回想起过去在CLR和托管代码方面遇到的问题。但是,如今您可能会有更好的运气。
此外,我还有一个Visual Studio | Runtime Linking,可让您使用Nmake文件来构建库。已经为动态链接设置了它。您从开发人员提示运行它。我用它从命令行测试x86,x64,ARM和cryptest.nmake
。
您可能还从命令行对MSBuild感兴趣。您还需要使用开发人员提示中的MSBuild。对于MSBuild,请参阅now ARM64。
...在WinForm GUI项目中使用[作为DLL]
在WinForms,Qt或MFC等项目中没有通用的DLL。 Crypto ++动态链接库是MSBuild (Command Line)。这是一个糟糕的创造,并且引起很多混乱。由于它仅具有FIPS批准的算法(例如AES和SHA),因此造成了很多混乱。它没有其他内容,例如编码器,解码器,过滤器等。
您可以将Crypto ++用作DLL,只需要提供静态库的包装即可。建议使用API对静态库进行包装,以将其用作DLL。 Crypto ++ Wiki上的FIPS 140 DLL详细介绍了如何创建包装DLL。
以下是Wiki文章中的一些示例代码。它计算并验证SHA-256哈希。但是,请访问Wiki文章,因为它为您提供了更多详细信息,并为您提供了应在Linux,Windows,OS X和Solaris上使用的选项和开关。
#include "cryptlib.h"
#include "sha.h"
#include <stdint.h>
#if defined _WIN32 || defined __CYGWIN__
#ifdef BUILDING_DLL
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllexport))
#else
#define DLL_PUBLIC __declspec(dllexport)
#endif
#else
#ifdef __GNUC__
#define DLL_PUBLIC __attribute__ ((dllimport))
#else
#define DLL_PUBLIC __declspec(dllimport)
#endif
#endif
#define DLL_LOCAL
#else
#if __GNUC__ >= 4
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#define DLL_LOCAL __attribute__ ((visibility ("hidden")))
#else
#define DLL_PUBLIC
#define DLL_LOCAL
#endif
#endif
extern "C" DLL_PUBLIC
int sha256_hash_message(uint8_t* digest, size_t dsize,
const uint8_t* message, size_t msize)
{
using CryptoPP::Exception;
using CryptoPP::SHA256;
try
{
SHA256().CalculateTruncatedDigest(digest, dsize, message, msize);
return 0; // success
}
catch(const Exception&)
{
return 1; // failure
}
}
extern "C" DLL_PUBLIC
int sha256_verify_digest(const uint8_t* digest, size_t dsize,
const uint8_t* message, size_t msize)
{
using CryptoPP::Exception;
using CryptoPP::SHA256;
try
{
bool verified = SHA256().VerifyTruncatedDigest(digest, dsize, message, msize);
return verified ? 0 : 1;
}
catch(const Exception&)
{
return 1; // failure
}
}