Qt 和 VS 使用 crypto++

5 篇文章 0 订阅
2 篇文章 0 订阅

官网:https://www.cryptopp.com
GitHub:https://github.com/weidai11/cryptopp
修改后的820版本 https://github.com/dragonfly1208/cryptopp/tree/cryptopp820
在线文档:https://www.cryptopp.com/docs/ref/index.html

1 生成动态库静态库文件

1.1 VS编译生成 dll和lib 库,版本:cryptopp820

打开 .sln项目,
在这里插入图片描述
编译生成:
动态库
在这里插入图片描述
静态库:
在这里插入图片描述
VS编译生成的库,只能在 Qt+MSVC环境使用。
注:cryptdll 项目的 属性需按如下 设置
在这里插入图片描述
参考:Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt

1.2. Qt+MinGW 生成 dll和 .a 库。版本:cryptopp820

参考 Windows下使用MinGW编译Crypto++ 5.6.2
编译和使用Crypto ++(mingw版本的Qt)

SSE优化指令集编译 + Intel官方指令集向导

.pro 文件添加

win32-g++ {
    LIBS += -lws2_32
    QMAKE_CXXFLAGS += -msse2 -mssse3 -msse4.1
    QMAKE_CXXFLAGS += -mavx2 -m32 -mpclmul -msha -maes
}

在Qt中编译
在这里插入图片描述
编译生成:
在这里插入图片描述

1.3 Qt+MSVC 生成 dll 库。版本:cryptopp610,Qt调用失败

参考 同上
在这里插入图片描述

1.4. crypto++在windows平台上进行android编译 版本:cryptopp820

windows 需先安装cygwin:
安装binutils 、gcc 、make 、gdb

参考 ubuntu移植crypto++到Android平台

注意setenv-android-gcc.sh 文件中 变量 AOSP_API_VERSION
对应的安卓版本一定要低于或等于和测试的安卓机的版本

# AOSP_API_VERSION="19"    # Android 4.4 and above
# AOSP_API_VERSION="21"    # Android 5.0 and above
# AOSP_API_VERSION="23"    # Android 6.0 and above

在这里插入图片描述
#修改 GNUmakefile-cross 文件 注释掉 default,生成 .so

# Default builds program with static library only
#.PHONY: default
#default: cryptest.exe

.PHONY: all static dynamic
all: static dynamic cryptest.exe

在这里插入图片描述
#Cygwin64 执行的命令

export PATH=/cygdrive/d/ProgramFiles/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin:$PATH
source ./setenv-android-gcc.sh armeabi-v7a
make -f GNUmakefile-cross

2. 使用库 文件

2.1 crypto++ 的VS +MSVC静态库版本(1.1)

2.1.1 crypto++ 生成的VS+MSVC 静态库可以在 VS上使用。

例子:Crypto++库 md5算法的使用
Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

2.2 Qt+MinGW 动态库 (1.2),和 Android(armeabi-v7a)+ android-ndk-r17c动态库(1.4)

动态库:
在这里插入图片描述
头文件:尽可能多
在这里插入图片描述
.pro 文件添加

INCLUDEPATH += $$PWD/cryptopp/
win32-g++{ #MinGW
    LIBS += -L$$PWD/lib/ -lcryptopp820
}
android-g++{ #Android_ARMv7 android-g++
    LIBS += -L$$PWD/lib/ -lcryptopp
}

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
DISTFILES += \
    android/AndroidManifest.xml #文件中可设置Android 版本等信息
    ANDROID_PACKAGE_SOURCE_DIR = \
        $$PWD/android

    ANDROID_EXTRA_LIBS = #Android dynamic lib
        $$PWD/lib/libcryptopp.so
}
win32-msvc{ # VS+MSVC
    win32: LIBS += -L$$PWD/lib/ -lcryptopp
	#LIBS += $$PWD/rdrand-x86.obj
	SOURCES += \
	    cryptopp/md5.cpp
	HEADERS += \
	    cryptopp/md5.h
}

直接测试 2.1.1的MD5代码即可MinGW+Qt 需要将.dll 放在 exe 相同目录下

2.3 crypto++ 的VS +MSVC动态库版本(1.1):dll+lib

由于生成动态库只包含crypto++核心代码和部分加密工具比如:sha,如果要使用其他加密工具比如:MD5,需要在工程项目中添加对应加密工具的 头文件和cpp文件。
在这里插入图片描述
如果报错:“LNK2019: 无法解析的外部符号”,需要添加 #include “dll.h” 定义 #define CRYPTOPP_IMPORTS

2.3.1 Qt+MSVC使用

在这里插入图片描述

2.3.3 VS+MSVC使用

在这里插入图片描述

2.3.4 将MD5添加进动态库文件中

如果想将MD5加密工具添加入动态库中,需将MD5相关的源码添加到cryptdll 动态库项目中,并修改头文件:
添加CRYPTOPP_DLL
在这里插入图片描述在这里插入图片描述

2.4 测试代码

//#include "dll.h" //MSVC动态库 需要放开
//#include "cryptlib.h"
//#include "filters.h"
//#include "pkcspad.h"

#include "md5.h"
#include "sha.h"
#include <iostream>
using namespace CryptoPP;
using namespace std;
//#pragma comment (lib,"cryptlib.lib")
int Sha1();
int main()
{
    byte message[] = {49,49,49,49};
    byte m[16];
    MD5 md5;
    md5.Update(message,4);
    md5.Final(m);
    std::cout<<"算法名称:"<<md5.AlgorithmName()<<endl;
    for(int i=0;i<16;i++)
    {
        printf("%02x",m[i]);
    }
    printf("\n");
    Sha1();
    return 0;
}
int Sha1()
{
    byte message[] = {49,49,49,49};
    byte m[16];
    CryptoPP::SHA1 hash;
    const int size = CryptoPP::SHA1::DIGESTSIZE;
  byte digest[size];
  hash.CalculateDigest(digest, message, 4);
    std::cout<<"算法名称:"<<hash.AlgorithmName()<<endl;
    for(int i=0;i<size;i++)
    {
        printf("%02x",digest[i]);
    }
        printf("\n");
    return 0;
}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值