个人使用 UE4 C++ 函数库(AES-ECB加密注册机)
个人使用 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加密注册机)相关推荐
- java aes ecb_java-AES / CBC和AES / ECB加密后的数据大小
java-AES / CBC和AES / ECB加密后的数据大小 我想知道AES加密后的数据大小,这样我就可以避免主要出于了解大小而缓存我的后AES数据(在磁盘或内存上). 我使用128位AES和ja ...
- C语言利用openSSL库AES模块加密
概述 在密码学里面一共有3中分类: 1.对称加密/解密 对称加密比较常见的有DES/AES.加密方和解密方都持有相同的密钥.对称的意思就是加密和解密都是用相同的密钥. 2.非对称加密/解密 常见的加密 ...
- php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言
AES加密 ECB模式 PKCS5填充 128位密码/密码块 ECB模式是将明文按照固定大小的块进行加密的,块大小不足则进行填充,ECB模式没有用到向量. 具体加密算法,请参见米扑博客总结的系列文章: ...
- golang实现AES ECB模式的加密和解密
最近有一个需求需要在golang中实现AES ECB模式的加密和解密, 看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式, ...
- AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
DSL 领域专用语言 TVM深度学习编译器 AI System 人工智能系统 参考项目 TaiChi 三维动画渲染物理仿真引擎DSL TVM 深度学习DSL 密集计算DSL LLVM 模块化编译器 编 ...
- python的aes的ecb加密_AES ECB PKCS5/PKCS7 加密 python实现 支持中文
ecb模式介绍 电码本模式(electronic codebook book (ecb) 这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密. pkcs5padding和pkcs7pad ...
- UE4引用第三方库Lib以及dll
####前段时间在研究UE4引入外部的函数库,但是由于网上的相关文章并不多,大都东拼西凑,或者故意写的很花哨,不利于新手学习,或者直接无脑的转载,比如各种感谢A先生--,很多文章我都照着做了但都未成功 ...
- 值得学习与推荐的c/c++框架和函数库
这几天不上班,翻翻Evernote中记录的一些笔记,刚好有时间把记录的一些好玩链接转载一下. 这篇文章里提到的很多库都用过,尤其是图像处理相关库,尤其是opencv及cxi ...
- php中操作mysql的函数库
发现php中的mysql库是一个函数库 而不是一个类库 使用面向过程的形式组织. mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 mysql_change ...
最新文章
- junit5_使用junit做其他事情
- linux命令修改管理员时间,Linux管理员必须知道的sudo命令
- idea2020搜索不到插件的问题
- The table(CF226D)
- php手势解锁,Appium-实现手势密码登陆
- Eclipse创建一个JAVA WEB项目
- execute与executeUpdate的区别
- Unity 安装失败原因
- Java serialVersionUID
- 香奈儿机器人t恤_最hot超模:开场Chanel的机器人 真面目居然是小精灵?
- This Week in Spring - December 24th, 2019
- phpStrom2016.3激活教程
- 学习GestureDetectorCompat,实现卡片左右滑动消失效果
- 华为瘦胖ap互转_华为V2R3 胖瘦AP 转换
- 解码者:数学探秘之旅——读书笔记(一)
- #边学边记 必修4 高项:对事的管理 第5章 项目成本管理 之 项目成本预算
- SLAM领域牛人、牛实验室、牛研究成果梳理
- 微盛企微管家:企业微信年度大会后,你不得不知道的私域打法新趋势
- Git中tag的作用
- 预约挂号系统技术点详解(一)
热门文章
- PageAdmin,织梦DedeCms和Wordpress—CMS建站系统怎么选
- linux games账号,在Linux上能玩Epic Games Store,附安装和使用方法
- Java获取IP地址的多种方法
- pythonqt5安装路径配置_PyQt5 安装与环境配置方法图解详细教程
- vue 父子组件 组件挂载 组件通信 slot插槽
- H323测试---安装GNUG服务器
- matlab模拟土壤水分入渗,基于HYDRUS-2D的负压灌溉土壤水分入渗数值模拟
- 【至简设计案例系列】基于FPGA的密码锁(XILINX ISE版)
- 大厂程序员年薪_2020互联网大厂薪资曝光:程序员薪资将会变成白菜价?
- 单幅图像去雾算法研究综述