本篇文章主要使用AES算法对二进制文件的加密解密,若要加密字符串,网上已有回答,自行查找即可。
使用的版本:UE5.0.3的安装版
需求描述:需要从服务端通过HTTP请求下载文件到本地,然后进行本地文件加密,让玩家不能读取这个图片文件(其他数据类似),然后在游戏中进行读取该加密文件,然后进行读取,解密,显示在游戏里。
具体实现代码:
void UAESEncryptionFunctionLibrary::AESEncrypt(uint8* rawData, uint32 rawSize, FString key)
{
FString privateKey = key;
//must size%16 ==0
uint32 encryptNumSize = rawSize;
uint32 left = encryptNumSize % FAES::AESBlockSize;
encryptNumSize = encryptNumSize - left;
if(privateKey.IsEmpty())
{
privateKey = GetDefaultAESPrivateKey();
}
FAES::EncryptData(rawData,encryptNumSize,TCHAR_TO_ANSI(*privateKey));
}
void UAESEncryptionFunctionLibrary::AESDecrypt(uint8* encryptData, uint32 encryptSize, FString key)
{
FString privateKey = key;
uint32 encryptNumSize = encryptSize;
uint32 left = encryptNumSize % FAES::AESBlockSize;
//uint32 needAdd = FAES::AESBlockSize - left;
encryptNumSize = encryptNumSize - left;
if(privateKey.IsEmpty())
{
privateKey = GetDefaultAESPrivateKey();
}
FAES::DecryptData(encryptData,encryptNumSize,TCHAR_TO_ANSI((*privateKey)));
}
/*
* rawData: data ptr, will change after AESEncrypt
* size: raw data size
*/
static void AESEncrypt(uint8* rawData, uint32 rawSize,FString key="");
static void AESDecrypt(uint8* encryptData, uint32 encryptSize,FString key="");
这里主要想表达加密函数的其中的一个参数,buffer的size问题,这个问题让我纠结了好几个小时。
下面详细解读一下,
void FAES::EncryptData(uint8 *Contents, uint32 NumBytes, const ANSICHAR* Key)
{
checkf(Key, TEXT("No encryption key specified"));
EncryptData(Contents, NumBytes, (const uint8*)Key, TCString<ANSICHAR>::Strlen(Key));
}
这是UE5提供的源码实现,传入的三个必要参数,
Content:内存中的二进制数据,
NumBytes:需要加密的字节数。这里传入的长度可以小于等于buffer的大小,但是尽量不要大于,否则会出问题。
Key:就是加密的密钥。
重要的事情。。。。。。
AES算法加密的字节数必须是16的整数倍,所以这个size必须符合要求,但是往往实际项目中,二进制数据都不符合,这时候我们需要进行截断加密。
比如一个二进制文件的size是200字节,那我们就要向下取整,只加密192个字节,解密的时候同样操作,如果向上取整,那么可能会导致原二进制文件读取失败。具体计算看如上代码。