Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用加密++;使用WinFormGUI?_C++_Cryptography_Crypto++ - Fatal编程技术网

C++ 如何使用加密++;使用WinFormGUI?

C++ 如何使用加密++;使用WinFormGUI?,c++,cryptography,crypto++,C++,Cryptography,Crypto++,我正在使用XTR和DH算法Crypto++创建项目,但它只是在命令行中运行 我曾尝试在VS2015中使用winform gui,但在将运行时库更改为MDd并激活CLR时总是出错。我用CLR项目创建了一个新项目,它仍然是错误的 我的问题是: Crypto++是静态库,我可以使用它为项目制作GUI吗 如何使Crypto++可以用作动态库 。。。将运行时库更改为/MDd Crypto++wiki上有将生成设置从静态运行时链接更改为动态运行时链接的说明 简而言之,将调试和发布版本的multi-threa

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

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

我的问题是:

  • Crypto++是静态库,我可以使用它为项目制作GUI吗
  • 如何使Crypto++可以用作动态库
  • 。。。将运行时库更改为
    /MDd

    Crypto++wiki上有将生成设置从静态运行时链接更改为动态运行时链接的说明

    简而言之,将调试和发布版本的
    multi-threaded
    更改为
    multi-threadeddl

  • 在记事本中打开
    cryptlib.vcxproj
  • multi-threaded
    更改为
    multi-threadeddl
  • multi-threadeddebug
    更改为
    multi-threadeddebugdll

  • 在记事本中打开
    cryptest.vcxproj

  • multi-threaded
    更改为
    multi-threadeddl
  • multi-threadeddebug
    更改为
    multi-threadeddebugdll
  • 清理重建Cryptlib和Cryptest项目
  • 在执行此操作时,请删除Cryptdll和Dlltest项目。它们用于FIPS DLL,您不想使用它们


    并激活CLR

    我似乎记得我过去在CLR和托管代码方面遇到过问题。但你现在可能运气更好

    此外,我还有一个允许您使用Nmake文件构建库的。它已设置为动态链接。您可以从开发人员提示符运行它。我使用它从命令行测试x86、x64、ARM和

    您可能还对命令行中的MSBuild感兴趣。您还需要在开发人员提示符下使用MSBuild。有关MSBuild,请参阅


    。。。在WinForm GUI项目中使用[作为DLL]

    像WinForms、Qt或MFC这样的项目中没有可使用的通用DLL。Crypto++动态链接库是一个。这是一个可怕的创造,它引起了很多混乱。它造成了很多混乱,因为它只有FIPS批准的算法,如AES和SHA。它没有其他东西,比如编码器、解码器、过滤器等等

    您可以使用Crypto++作为DLL,只需要为静态库提供包装器。建议使用API对静态库进行包装,将库用作DLL。如何创建包装器DLL在Crypto++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
        }
    }
    
    #包括“cryptlib.h”
    #包括“sha.h”
    #包括
    #如果已定义WIN32 | |已定义ucygwin__
    #ifdef构建动态链接库
    #ifdef__GNUC__
    #定义DLL_公共___属性__((dllexport))
    #否则
    #定义DLL\u PUBLIC\u declspec(dllexport)
    #恩迪夫
    #否则
    #ifdef__GNUC__
    #定义DLL_公共___属性__((dllimport))
    #否则
    #定义DLL_PUBLIC__declspec(dllimport)
    #恩迪夫
    #恩迪夫
    #定义DLL_本地
    #否则
    #如果=4
    #定义DLL\u公共属性(可见性(“默认”))
    #定义DLL\u本地属性(可见性(“隐藏”))
    #否则
    #定义DLL_公共
    #定义DLL_本地
    #恩迪夫
    #恩迪夫
    外部“C”DLL_公共
    int sha256哈希消息(uint8*摘要,大小大小,
    const uint8_t*消息,大小(msize)
    {
    使用CryptoPP::Exception;
    使用CryptoPP::SHA256;
    尝试
    {
    SHA256().CalculateRuncatedGist(摘要、dsize、消息、msize);
    返回0;//成功
    }
    捕获(常量异常&)
    {
    返回1;//失败
    }
    }
    外部“C”DLL_公共
    int sha256验证摘要(常量8摘要、大小大小、,
    const uint8_t*消息,大小(msize)
    {
    使用CryptoPP::Exception;
    使用CryptoPP::SHA256;
    尝试
    {
    bool verified=SHA256().VerifyTruncatedDigest(摘要、dsize、消息、msize);
    返回已验证?0:1;
    }
    捕获(常量异常&)
    {
    返回1;//失败
    }
    }
    
    错误是什么?您可以尝试一下。从理论上讲,你可以用“艾哈迈德-我”来阻止落选。问题有些宽泛,如果Q保持开放,你可能会积累更多的DV。您仍然需要构建项目的GUI部分并调用包装器DLL。也许这应该是你的下一个问题。如果需要,请确保清楚地说明包装器DLL中的函数。