如何在WinForm GUI中使用Crypto ++?

时间:2019-01-04 23:12:00

标签: c++ cryptography crypto++

我正在使用XTR和DH算法Crypto ++创建项目,但它仅在命令行中运行。

我曾尝试在VS2015中使用winform gui,但在将运行时库更改为MDd并激活CLR时始终会出错。我用CLR项目创建了新项目,它仍然出错

我的问题是:

  1. Crypto ++是静态库,我可以使用它制作项目的GUI吗?
  2. 如何使Crypto ++可以用作动态库?

1 个答案:

答案 0 :(得分:1)

  

...将运行时库更改为/MDd

时出错

将构建设置从 静态 运行时链接更改为 Dynamic 的运行时链接的说明位于{{ 3}}。

简而言之,将MultiThreaded更改为MultiThreadedDLL进行调试和发布。

  1. 在记事本中打开cryptlib.vcxproj
  2. <RuntimeLibrary>MultiThreaded</RuntimeLibrary>更改为<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
  3. <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>更改为<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>

  4. 在记事本中打开cryptest.vcxproj

  5. <RuntimeLibrary>MultiThreaded</RuntimeLibrary>更改为<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
  6. <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>更改为<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
  7. 清洁 重建 Cryptlib和Cryptest项目。

在运行时,删除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
    }
}