环境
- win10
- Crypto++ 5.6.5 (Crypto++下载地址)
- unreal 4.17.2
- vs2017
简介
AES (高级加密标准,英文全称:Advanced Encryption Standard)在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。先要了解更多的可以上wiki(链接)了解
程序员就是想偷懒,本来想直接用引擎现有的api—— FAES::EncryptData/DecryptData 来实现加密解密,奈何用上最主要问题就是原文本和解密后的文本不一致。网上搜了相关资料,遇到这个问题的人也有几个,但是并没有找到可靠的解决方案。想要了解引擎内置的这方面,可以查看下面几个链接:
顺便发现别人写了自己的插件 SodiumUE4(链接),并且上传到了github上,有兴趣的同学可以看一看,还没试用过。
本文主要使用Crypto++ 5.6.5编译的lib库,在unreal中调用使用。
步骤
下载并编译 Crypto++ 5.6.5
- 右键crylib属性,C/C++ ——> 代码生成 ——> 运行库 设置为 DLL(/MD)
- 选择 release x64编译
- 可以在“cryptopp565\x64\Output\Release”路径下找到cryptlib.lib
为引擎拷贝必要文件
将 cryptlib.lib拷贝到“UE_4.17\Engine\Source\ThirdParty\CryptoPP\5.6.5\lib\Win64\VS2015”,如果没有文件夹,请自行建立。
将cryptopp565源代码的.h头文件全部拷贝到“UE_4.17\Engine\Source\ThirdParty\CryptoPP\5.6.5\include”,如果没有文件夹,请自行建立。
如果想省事,可用题主编译好的压缩文件,直接解压到“UE_4.17\Engine\Source\ThirdParty\CryptoPP\5.6.5\”文件夹下。(下载链接)
创建自己的AES插件
- 创建好插件后,在.build.cs添加CryptoPP(可能不用这一步)
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"CryptoPP",
// ... add private dependencies that you statically link with here ...
}
);
bEnableExceptions = true;
Definitions.Add("BOOST_SYSTEM_NOEXCEPT");
- AESBPLibrary.h
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Engine.h"
#include "AESBPLibrary.generated.h"
UCLASS()
class UAESBPLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
///ECB mode
UFUNCTION(BlueprintCallable, meta = (DisplayName = "ECB_AESEncryptData", Keywords = "ECB_AESEncryptData", aes_key = "0123456789ABCDEF0123456789ABCDEF"), Category = "AES")
static FString ECB_AESEncryptData(FString aes_content, FString aes_key);
UFUNCTION(BlueprintCallable, meta = (DisplayName = "ECB_AESDecryptData", Keywords = "ECB_AESDecryptData", aes_key = "0123456789ABCDEF0123456789ABCDEF"), Category = "AES")
static FString ECB_AESDecryptData(FString aes_content, FString aes_key, bool & result);
///CBC mode
UFUNCTION(BlueprintCallable, meta = (DisplayName = "CBC_AESEncryptData", Keywords = "CBC_AESEncryptData", aes_key = "0123456789ABCDEF0123456789ABCDEF", aes_IV = "ABCDEF0123456789"), Category = "AES")
static FString CBC_AESEncryptData(FString aes_content, FString aes_key, FString aes_IV);
UFUNCTION(BlueprintCallable, meta = (DisplayName = "CBC_AESDecryptData", Keywords = "CBC_AESDecryptData", aes_key = "0123456789ABCDEF0123456789ABCDEF", aes_IV = "ABCDEF0123456789"), Category = "AES")
static FString CBC_AESDecryptData(FString aes_content, FString aes_key, FString aes_IV, bool & result);
///CBC_CTS mode
UFUNCTION(BlueprintCallable, meta = (DisplayName = "CBC_CTS_AESEncryptData", Keywords = "CBC_CTS_AESEncryptData", aes_key = "0123456789ABCDEF0123456789ABCDEF", aes_IV = "ABCDEF0123456789"), Category = "AES")
static FString CBC_CTS_AESEncryptData(FString aes_content, FString aes_key, FString aes_IV);
UFUNCTION(BlueprintCallable, meta = (DisplayName = "CBC_CTS_AESDecryptData", Keywords = <