任意字符使用UE自带AES加密解密

  • 说明
  • 实现

说明

参考文章:
1.大佬的实现,老早膜拜 Crypto++_AES加密解密
2.AES加密解密(解决中文乱码问题)
基于两位大佬的实现,自己组装了一个可以对任意字符的加密解密的功能

1.在对字符串进行加密时,要先将源加密字符串添加前后缀,然后转换成TArray ,然后再转换成 base64 .
做这一步主要是因为中文有可能在base64转换过程中产生乱码,但乱码产生是有规律的,会在完整的字符解析前后生成。不会在中间生成。所以先加入前后缀,在base64解码时对其分割,取中间。
2.在对base64格式字符串拼接一个特殊识别字符串。因为ue自带aes加密后解密时,会在末尾产生一部分多余乱码,所以添加了这个末尾后缀,在解密后分割取左边就是原有的base64源数据了
3.再对base64反向解析成string,就是原始数据了

实现

一图胜千言,画的不专业,见谅

.h

 UFUNCTION(BlueprintCallable, Category = "AES")static FString Encrypt(FString InputString, FString decryptKey = "Key");UFUNCTION(BlueprintCallable, Category = "AES")static FString Decrypt(FString InputString, FString decryptKey = "Key");

.cpp

#include "Engine.h"
#include "Runtime/Core/Public/Misc/AES.h"
#include "Runtime/Core/Public/Misc/SecureHash.h"
#include "Runtime/Core/Public/Misc/Base64.h"
#include "EncryptSaveGame.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
#include "String"FString UEncrypt_DecryptBPLibrary::Encrypt(FString InputString, FString decryptKey)
{if (GEngine)GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, "source : " + InputString);// Check inputsif (InputString.IsEmpty()) return "";  //empty string? do nothingif (decryptKey.IsEmpty()) return "";//add source code split signalFString signStartStr = "=-startCheck-=";FString signEndStr = "=-endCheck-=";InputString = signStartStr + InputString;InputString.Append(signEndStr);//******chuange source string to Base64 format : string -> tarray<uint8> -> base64TArray<uint8> content;std::string _s(TCHAR_TO_UTF8(*InputString));content.Append((unsigned char*)_s.data(), _s.size());InputString = FBase64::Encode(content);// To split correctly final result of decryption from trash symbolsFString SplitSymbol = "somethingSpecialSignal";InputString.Append(SplitSymbol);// We need at least 32 symbols keydecryptKey = FMD5::HashAnsiString(*decryptKey);TCHAR *KeyTChar = decryptKey.GetCharArray().GetData();ANSICHAR *KeyAnsi = (ANSICHAR*)TCHAR_TO_ANSI(KeyTChar);if (GEngine)GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, "1 ");// Calculate blob size and create blobuint8* Blob;uint32 Size;Size = InputString.Len();Size = Size + (FAES::AESBlockSize - (Size % FAES::AESBlockSize));Blob = new uint8[Size];if (GEngine)GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, "2 ");// Convert string to bytes and encryptif (StringToBytes(InputString, Blob, Size)) {FAES::EncryptData(Blob, Size, KeyAnsi);InputString = FString::FromHexBlob(Blob, Size);if (GEngine)GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, "3 ");delete Blob;return InputString;}if (GEngine)GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, "4 ");delete Blob;return "";
}FString UEncrypt_DecryptBPLibrary::Decrypt(FString InputString, FString Key)
{// Check inputsif (InputString.IsEmpty()) return "";if (Key.IsEmpty()) return "";// To split correctly final result of decryption from trash symbolsFString SplitSymbol = "somethingSpecialSignal";// We need at least 32 symbols keyKey = FMD5::HashAnsiString(*Key);TCHAR *KeyTChar = Key.GetCharArray().GetData();ANSICHAR *KeyAnsi = (ANSICHAR*)TCHAR_TO_ANSI(KeyTChar);// Calculate blob size and create blobuint8* Blob;uint32 Size;Size = InputString.Len();Size = Size + (FAES::AESBlockSize - (Size % FAES::AESBlockSize));Blob = new uint8[Size];// Convert string to bytes and decryptif (FString::ToHexBlob(InputString, Blob, Size)) {FAES::DecryptData(Blob, Size, KeyAnsi);InputString = BytesToString(Blob, Size);// Split required data from trashFString LeftData;FString RightData;InputString.Split(SplitSymbol, &LeftData, &RightData, ESearchCase::CaseSensitive, ESearchDir::FromStart);InputString = LeftData;//back the base64 code to string , see the encrypt functionTArray<uint8> content;FBase64::Decode(InputString, content);InputString=FString(UTF8_TO_TCHAR(content.GetData()));//split by source code split signalFString signStartStr = "=-startCheck-=";FString signEndStr = "=-endCheck-=";InputString.Split(signStartStr, &LeftData, &RightData, ESearchCase::CaseSensitive, ESearchDir::FromStart);InputString = RightData;InputString.Split(signEndStr, &LeftData, &RightData, ESearchCase::CaseSensitive, ESearchDir::FromStart);delete Blob;return LeftData;}delete Blob;return "";
}

蓝图调用

结果

任意字符使用UE自带AES加密解密相关推荐

  1. MySQL自带的AES加密解密比较常用的使用方法

    接手的老项目中,有些SQL使用了MySQL自带的AES加密解密,为了方便操作数据,研究了一下使用方法,在这里记录一下. 加密 update user_password set password = H ...

  2. android、ios、php之间AES加密解密

    使用原因: 因为在项目中,需要在与客户端(IOS,Android)交互的时候,保存一些私有信息,不被别人看到,所以,使用了比较流行的可以反向加解密的AES. PHP 源码 <?php$aes = ...

  3. python 加密解密_python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...

  4. 理解AES加密解密的使用方法

    很多人对于AES加密并不是很了解,导致互相之间进行加密解密困难. 本文用简单的方式来介绍AES在使用上需要的知识,而不涉及内部算法.最后给出例子来帮助理解AES加密解密的使用方法. AES的麻烦 相比 ...

  5. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  6. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  7. AES加密解密(java、web、app)

    AES加密解密(java.web.app) AES加密解密(java.web.app) java端 Web端 ios端 AES加密解密(java.web.app) java端 package com. ...

  8. AES加密解密(ECB模式)

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  9. AES加密解密(CBC模式)

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

最新文章

  1. ubuntu-14.04 系统安装mysql-5.6.21
  2. 注意力机制~Attention Mechanism
  3. java ssh 和mvc_JAVA三大框架SSH和MVC
  4. 技术实践第四期|解读移动开发者日常-性能监控平台应用
  5. linux命令输入错误怎么弄,Bash-Insulter:一个在输入错误命令时嘲讽用户的脚本 | Linux 中国...
  6. 纯粹经济学 —— 基本概念
  7. hutool获取5天前的日期_连载|日 产 物 流 管 理 方 式(5)
  8. 10. Regular Expression Matching[H]正则表达式匹配
  9. java中代码pu_一、线程Java代码实现1.继承Thread声明Thread的子类public class MyThread extends Thread { pu...
  10. oracle mysql odbc驱动程序_用于 Oracle 的 ODBC 驱动程序
  11. 格兰因果模型可以分析哪些东西_论文实证经验分享|VAR模型实操步骤(上)
  12. QQ空间自动删除说说的js脚本(亲测有效)
  13. Nvivo简介、学习经验分享及教程
  14. 华为h12m03装系统_华为H22H-03服务器怎么设置从U盘装系统
  15. 全国大学生智能汽车竞赛-室外光电组无人驾驶挑战赛-2019
  16. Java 8 时间日期库的20个使用示例
  17. 十位数和个位数交换python_Python3实现个位数字和十位数字对调, 其乘积不变
  18. 抠脚大叔如何改变性别,Python实现变声器功能
  19. m2ts视频格式在windows及mac下的解决方案
  20. Python | 怎么在基金定投上实现收益最大化

热门文章

  1. Java商城面试题(三)
  2. R12供应商银行账户SQL
  3. c++ 45行代码实现 生命游戏-细胞自动机!!!
  4. WiFi基础学习到实战(一:802.11介绍)
  5. php cms 自动分词,帝国cms高级Tags插件 自动分词提取 同步内容关键字
  6. 根据两点间经纬度坐标(double值)计算两点间距离,LBS操作相关工具类
  7. 产品经理有必要考个 PMP吗?(含PMP资料)
  8. android 通过手机号码查询联系人,android获取手机通讯录联系人
  9. 【IHS+稀疏表示】基于IHS小波变换和稀疏表示相结合的遥感图像融合算法matlab仿真
  10. 【 安信可模组TG-12F/TG-01M②】搭建Linux开发环境,二次开发直连阿里飞燕/天猫精灵平台,实现天猫精灵语音控制