个人使用 UE4 C++ 函数库(AES-ECB加密注册机)

加密使用CryptoPP5.6.5

build.cs

PublicDependencyModuleNames.AddRange(new string[] {  "Core", "CoreUObject", "Engine", "InputCore","CryptoPP"});

include

#include <ThirdParty/CryptoPP/5.6.5/include/modes.h>
#include <ThirdParty/CryptoPP/5.6.5/include/hex.h>
#include <ThirdParty/CryptoPP/5.6.5/include/aes.h>
using namespace std;
using namespace CryptoPP;

.h

   // 复制到剪贴板UFUNCTION(BlueprintCallable, Category = "Registry")static void CopyToClipboard(FString text);// 获得机器码UFUNCTION(BlueprintPure, Category = "Registry")static void GetUniqueId(FString& UniqueId);// 获取HashAnsiString后的机器码UFUNCTION(BlueprintPure, Category = "Registry")static void GetHashAnsiId(FString& HashAnsiId);// 作用为使用AES-ECB加密解密UFUNCTION(BlueprintCallable, meta = (DisplayName = "ECB_AESEncryptData", Keywords = "ECB_AESEncryptData", aes_key = "default"), Category = "Registry")static FString ECB_AESEncryptData(FString aes_content, FString aes_key);UFUNCTION(BlueprintCallable, meta = (DisplayName = "ECB_AESDecryptData", Keywords = "ECB_AESDecryptData", aes_key = "default"), Category = "Registry")static FString ECB_AESDecryptData(FString aes_content, FString aes_key, bool& result);

.cpp


void cryptoTest::CopyToClipboard(FString text)
{FPlatformMisc::ClipboardCopy(*text);
}void cryptoTest::GetUniqueId(FString& UniqueId)
{FString tempid;TArray<uint8> MacAddr = FPlatformMisc::GetMacAddress();for(TArray<uint8>::TConstIterator it(MacAddr); it; ++it){tempid += FString::Printf(TEXT("%02x"), *it);}UniqueId = tempid;
}void cryptoTest::GetHashAnsiId(FString& HashAnsiId)
{FString tempid;TArray<uint8> MacAddr = FPlatformMisc::GetMacAddress();for(TArray<uint8>::TConstIterator it(MacAddr); it; ++it){tempid += FString::Printf(TEXT("%02x"), *it);}HashAnsiId = FMD5::HashAnsiString(*tempid);
}//会报错,先不用
FString cryptoTest::ECB_AESEncryptData(FString aes_content, FString aes_key)
{std::string sKey = TCHAR_TO_UTF8(*aes_key);const char* plainText = TCHAR_TO_ANSI(*aes_content);std::string outstr;if(aes_key == "default" || aes_key.IsEmpty()){//设定默认秘钥,只要是32位的16进制数随便写sKey = "01010101010101010101010101010101";}//填key    SecByteBlock key(AES::MAX_KEYLENGTH);memset(key, 0x30, key.size());sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH);AES::Encryption aesEncryption((byte*)key, AES::MAX_KEYLENGTH);ECB_Mode_ExternalCipher::Encryption ecbEncryption(aesEncryption);//StreamTransformationFilter ecbEncryptor(ecbEncryption, new HexEncoder(new StringSink(outstr)));StreamTransformationFilter ecbEncryptor(ecbEncryption,new HexEncoder(new StringSink(outstr)),BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING,true);ecbEncryptor.Put((byte*)plainText, strlen(plainText));ecbEncryptor.MessageEnd();FString returnValue = UTF8_TO_TCHAR(outstr.c_str());return returnValue;
}FString cryptoTest::ECB_AESDecryptData(FString aes_content, FString aes_key, bool& result)
{std::string sKey = TCHAR_TO_UTF8(*aes_key);std::string outstr;std::string cipherText = TCHAR_TO_UTF8(*aes_content);result = false;if(aes_key == "default" || aes_key.IsEmpty()){//设定默认秘钥,只要是32位的16进制数随便写sKey = "01010101010101010101010101010101";}//判断是否为空指针if(aes_content.IsEmpty()){result = false;return "0";}//判断是否为16为长度倍数if(cipherText.size() % 16 != 0){// CipherText is not a multiple of 2, which means it is not a valid hexadecimal stringresult = false;return "0";}//验证是否为16进制字符// Check if all characters in the cipherText are valid hexadecimal charactersfor(char c : cipherText){if(!isxdigit(c)){result = false;return "0";}}try{//填key    SecByteBlock key(AES::MAX_KEYLENGTH);memset(key, 0x30, key.size());sKey.size() <= AES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) : memcpy(key, sKey.c_str(), AES::MAX_KEYLENGTH);ECB_Mode<AES >::Decryption ecbDecryption((byte*)key, AES::MAX_KEYLENGTH);//加上 "true" 后可以验证,但是如果验证失败可能会闪退//HexDecoder decryptor(new StreamTransformationFilter(ecbDecryption, new StringSink(outstr)));HexDecoder decryptor(new StreamTransformationFilter(ecbDecryption, new StringSink(outstr),BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING,true));decryptor.Put((byte*)cipherText.c_str(), cipherText.size());decryptor.MessageEnd();result = true;}catch(const Exception& e){// An exception occurred, set the result to false and log the erroroutstr = "0";UE_LOG(LogTemp, Error, TEXT("ECB_AESDecryptData failed: %s"), ANSI_TO_TCHAR(e.what()));result = false;}FString returnValue = UTF8_TO_TCHAR(outstr.c_str());return returnValue;
}

警告: 这是一个解密函数,但当输入值(cipherText)非法时,该函数可能会导致UE4闪退,因此请提前对输入的值进行判断

      HexDecoder decryptor(new StreamTransformationFilter(ecbDecryption, new StringSink(outstr),BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING,true));

当编译失败时,有可能是因为导入出现问题,可以在.cpp文件中使用以下代码包裹CryptoPP并重试

THIRD_PARTY_INCLUDES_START
#if PLATFORM_WINDOWS#include <ThirdParty/CryptoPP/5.6.5/include/modes.h>
#include <ThirdParty/CryptoPP/5.6.5/include/hex.h>
#include <ThirdParty/CryptoPP/5.6.5/include/aes.h>
#elif PLATFORM_MAC
#elif PLATFORM_LINUX
#endif
THIRD_PARTY_INCLUDES_END

示例:

个人使用 UE4 C++ 函数库(AES-ECB加密注册机)相关推荐

  1. java aes ecb_java-AES / CBC和AES / ECB加密后的数据大小

    java-AES / CBC和AES / ECB加密后的数据大小 我想知道AES加密后的数据大小,这样我就可以避免主要出于了解大小而缓存我的后AES数据(在磁盘或内存上). 我使用128位AES和ja ...

  2. C语言利用openSSL库AES模块加密

    概述 在密码学里面一共有3中分类: 1.对称加密/解密 对称加密比较常见的有DES/AES.加密方和解密方都持有相同的密钥.对称的意思就是加密和解密都是用相同的密钥. 2.非对称加密/解密 常见的加密 ...

  3. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言

    AES加密 ECB模式 PKCS5填充 128位密码/密码块 ECB模式是将明文按照固定大小的块进行加密的,块大小不足则进行填充,ECB模式没有用到向量. 具体加密算法,请参见米扑博客总结的系列文章: ...

  4. golang实现AES ECB模式的加密和解密

    最近有一个需求需要在golang中实现AES ECB模式的加密和解密,  看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...

  5. AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry

    DSL 领域专用语言 TVM深度学习编译器 AI System 人工智能系统 参考项目 TaiChi 三维动画渲染物理仿真引擎DSL TVM 深度学习DSL 密集计算DSL LLVM 模块化编译器 编 ...

  6. python的aes的ecb加密_AES ECB PKCS5/PKCS7 加密 python实现 支持中文

    ecb模式介绍 电码本模式(electronic codebook book (ecb) 这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密. pkcs5padding和pkcs7pad ...

  7. UE4引用第三方库Lib以及dll

    ####前段时间在研究UE4引入外部的函数库,但是由于网上的相关文章并不多,大都东拼西凑,或者故意写的很花哨,不利于新手学习,或者直接无脑的转载,比如各种感谢A先生--,很多文章我都照着做了但都未成功 ...

  8. 值得学习与推荐的c/c++框架和函数库

           这几天不上班,翻翻Evernote中记录的一些笔记,刚好有时间把记录的一些好玩链接转载一下.        这篇文章里提到的很多库都用过,尤其是图像处理相关库,尤其是opencv及cxi ...

  9. php中操作mysql的函数库

    发现php中的mysql库是一个函数库 而不是一个类库  使用面向过程的形式组织. mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 mysql_change ...

最新文章

  1. junit5_使用junit做其他事情
  2. linux命令修改管理员时间,Linux管理员必须知道的sudo命令
  3. idea2020搜索不到插件的问题
  4. The table(CF226D)
  5. php手势解锁,Appium-实现手势密码登陆
  6. Eclipse创建一个JAVA WEB项目
  7. execute与executeUpdate的区别
  8. Unity 安装失败原因
  9. Java serialVersionUID
  10. 香奈儿机器人t恤_最hot超模:开场Chanel的机器人 真面目居然是小精灵?
  11. This Week in Spring - December 24th, 2019
  12. phpStrom2016.3激活教程
  13. 学习GestureDetectorCompat,实现卡片左右滑动消失效果
  14. 华为瘦胖ap互转_华为V2R3 胖瘦AP 转换
  15. 解码者:数学探秘之旅——读书笔记(一)
  16. #边学边记 必修4 高项:对事的管理 第5章 项目成本管理 之 项目成本预算
  17. SLAM领域牛人、牛实验室、牛研究成果梳理
  18. 微盛企微管家:企业微信年度大会后,你不得不知道的私域打法新趋势
  19. Git中tag的作用
  20. 预约挂号系统技术点详解(一)

热门文章

  1. PageAdmin,织梦DedeCms和Wordpress—CMS建站系统怎么选
  2. linux games账号,在Linux上能玩Epic Games Store,附安装和使用方法
  3. Java获取IP地址的多种方法
  4. pythonqt5安装路径配置_PyQt5 安装与环境配置方法图解详细教程
  5. vue 父子组件 组件挂载 组件通信 slot插槽
  6. H323测试---安装GNUG服务器
  7. matlab模拟土壤水分入渗,基于HYDRUS-2D的负压灌溉土壤水分入渗数值模拟
  8. 【至简设计案例系列】基于FPGA的密码锁(XILINX ISE版)
  9. 大厂程序员年薪_2020互联网大厂薪资曝光:程序员薪资将会变成白菜价?
  10. 单幅图像去雾算法研究综述