`

UE4 CryptoPP 5.6.5 加解密

阅读更多

 

Crypto++ 5.6.5
 

密码与偏移量:

 

 

static SecByteBlock GetKey(std::string KeyStr)
    {
        SecByteBlock key(AES::MAX_KEYLENGTH);
        memset(key, 0x30, key.size());
        KeyStr.size() <= AES::MAX_KEYLENGTH ? memcpy(key, KeyStr.c_str(), KeyStr.size()) : memcpy(key, KeyStr.c_str(), AES::MAX_KEYLENGTH);
        return key;
    }
    //convert string to byte
    static SecByteBlock GetIV(std::string KeyStr, const std::string IVStr)
    {
        SecByteBlock IV(AES::BLOCKSIZE);
        memset(IV, 0x30, IV.size());
        KeyStr.size() <= AES::BLOCKSIZE ? memcpy(IV, IVStr.c_str(), IVStr.size()) : memcpy(IV, IVStr.c_str(), AES::BLOCKSIZE);
        return IV;
    }

 

 

加解密过程(包含输出 string 及 file):

 

UFUNCTION(BlueprintCallable, Category = "AES")
    static void CBC_StringEncrypto(const FString aes_content, FString& aes_encrypt_content, const FString aes_key = TEXT("1234567890123456"), const FString aes_IV = TEXT("ahbdgteyusnjkldu"))
    {
        const std::string plaintext = TCHAR_TO_UTF8(*aes_content);
        // Initialise the key and IV
        SecByteBlock key = GetKey(TCHAR_TO_UTF8(*aes_key));
        SecByteBlock iv = GetIV(TCHAR_TO_UTF8(*aes_key), TCHAR_TO_UTF8(*aes_IV));

        // Encrypt
        AES::Encryption cipher(key, AES::MAX_KEYLENGTH);
        CBC_Mode_ExternalCipher::Encryption encryption(cipher, iv);
        std::string cipher_text;
        StreamTransformationFilter filter(encryption, new StringSink(cipher_text));
        //使用填充并通过 HexEncoder 编码将 cipher_text 密文转成可以正常打印阅读的密文,但是无法正常解码??????????
        //StreamTransformationFilter filter(encryption, new HexEncoder(new StringSink(cipher_text)), BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING);
        filter.Put(reinterpret_cast<const byte*>(plaintext.c_str()), plaintext.size());
        filter.MessageEnd();

        //存输出的 string 密文
        std::string cipherOut;
        StringSource(cipher_text, true, new HexEncoder(new StringSink(cipherOut)));
        //to lower
        //std::string str = _strlwr(TCHAR_TO_ANSI((UTF8_TO_TCHAR(cipher_text.c_str()))));
        aes_encrypt_content = cipherOut.c_str();
    }

    UFUNCTION(BlueprintCallable, Category = "AES")
    static void CBC_StringDecrypto(const FString aes_encrypt_content, FString& aes_content, const FString aes_key = TEXT("1234567890123456"), const FString aes_IV = TEXT("ahbdgteyusnjkldu"))
    {
        //存明文
        std::string cipher_text;
        //对密文先进行 Decoder 为明文
        StringSource(TCHAR_TO_UTF8(*aes_encrypt_content), true, new HexDecoder(new StringSink(cipher_text)));

        //存输出的 string 明文
        std::string decrypted_text;
        
        //Initialise the key and IV
        SecByteBlock key = GetKey(TCHAR_TO_UTF8(*aes_key));
        SecByteBlock iv = GetIV(TCHAR_TO_UTF8(*aes_key), TCHAR_TO_UTF8(*aes_IV));

        // Decrypt
        AES::Decryption cipher(key, AES::MAX_KEYLENGTH);
        CBC_Mode_ExternalCipher::Decryption decryption(cipher, iv);
        
        StreamTransformationFilter filter(decryption, new StringSink(decrypted_text));
        //使用填充并通过 HexEncoder 编码将 cipher_text 密文转成可以正常阅读的明文,无法正常解码使用??????????
        //StreamTransformationFilter filter(decryption, new HexEncoder(new StringSink(decrypted_text)), BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING);
        filter.Put(reinterpret_cast<const byte*>(cipher_text.c_str()), cipher_text.size());
        filter.MessageEnd();

        aes_content = UTF8_TO_TCHAR(decrypted_text.c_str());
    }

UFUNCTION(BlueprintCallable, Category = "AES")
    static void CBC_AESFileEncrypto(const FString aes_key = TEXT("1234567890123456"), const FString aes_IV = TEXT("ahbdgteyusnjkldu"))
    {
        FString OriginalPath = FPaths::ProjectContentDir() + "\\" + TEXT("original.txt");
        const std::string original_file = TCHAR_TO_UTF8(*OriginalPath);
        FString EncryptPath = FPaths::ProjectContentDir() + "\\" + TEXT("encrypted.txt");
        const std::string encrypto_file = TCHAR_TO_UTF8(*EncryptPath);


        // Initialise the key and IV
        SecByteBlock key = GetKey(TCHAR_TO_UTF8(*aes_key));
        SecByteBlock iv = GetIV(TCHAR_TO_UTF8(*aes_key), TCHAR_TO_UTF8(*aes_IV));
        

        // Read the file contents to a string and output to cout.  Safest to read
        // contents as binary data, although non-printable characters shouldn't be
        // output to cout.
        std::ifstream infile(original_file.c_str(), std::ios::binary);
        const std::string plaintext((std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>());
        infile.close();
        std::cout << "Plain Text (" << plaintext.size() << " bytes)\n" << plaintext << "\n\n";

        // Encrypt
        AES::Encryption cipher(key, AES::MAX_KEYLENGTH);
        CBC_Mode_ExternalCipher::Encryption encryption(cipher, iv);
        std::string cipher_text;
        StreamTransformationFilter filter(encryption, new StringSink(cipher_text));
        //使用填充并通过 HexEncoder 编码将 cipher_text 密文转成可以正常打印阅读的密文,但是无法正常解码??????????
        //StreamTransformationFilter filter(encryption, new HexEncoder(new StringSink(cipher_text)), BlockPaddingSchemeDef::BlockPaddingScheme::PKCS_PADDING, true);
        filter.Put(reinterpret_cast<const byte*>(plaintext.c_str()), plaintext.size());
        filter.MessageEnd();

        //to lower
        //std::string str = _strlwr(TCHAR_TO_ANSI((UTF8_TO_TCHAR(cipher_text.c_str()))));

        // Dump cipher text
        std::ofstream outfile(encrypto_file.c_str(), std::ios::binary);
        outfile.write(cipher_text.c_str(), cipher_text.size());
        outfile.close();
    }

    UFUNCTION(BlueprintCallable, Category = "AES")
    static void CBC_AESFileDecrypto(const FString aes_key = TEXT("1234567890123456"), const FString aes_IV = TEXT("ahbdgteyusnjkldu"))
    {
        FString EncryptPath = FPaths::ProjectContentDir() + "\\" + TEXT("encrypted.txt");
        const std::string encrypto_file = TCHAR_TO_UTF8(*EncryptPath);
        FString DecryptoPath = FPaths::ProjectContentDir() + "\\" + TEXT("decrypted.txt");
        const std::string decrypto_file = TCHAR_TO_UTF8(*DecryptoPath);


        //Initialise the key and IV
        SecByteBlock key = GetKey(TCHAR_TO_UTF8(*aes_key));
        SecByteBlock iv = GetIV(TCHAR_TO_UTF8(*aes_key), TCHAR_TO_UTF8(*aes_IV));

        // Read the encrypted file contents to a string as binary data.
        std::ifstream infile(encrypto_file.c_str(), std::ios::binary);
        const std::string cipher_text((std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>());
        infile.close();

        // Decrypt
        CryptoPP::AES::Decryption cipher(key, AES::MAX_KEYLENGTH);
        CryptoPP::CBC_Mode_ExternalCipher::Decryption decryption(cipher, iv);
        std::string decrypted_test;
        StreamTransformationFilter filter(decryption, new CryptoPP::StringSink(decrypted_test));
        //使用填充并通过 HexEncoder 编码将 cipher_text 密文转成可以正常阅读的明文,无法正常解码使用??????????
        //StreamTransformationFilter filter(decryption, new HexEncoder(new StringSink(decrypted_test)), BlockPaddingSchemeDef::BlockPaddingScheme::PKCS_PADDING, true);
        filter.Put(reinterpret_cast<const byte*>(cipher_text.c_str()), cipher_text.size());
        filter.MessageEnd();

        // Dump decrypted text
        std::ofstream outfile(decrypto_file.c_str(), std::ios::binary);
        outfile.write(decrypted_test.c_str(), decrypted_test.size());
        outfile.close();
    }

 
Encrypto 及 Decrypto 都支持 DEFAULT_PADDING、NO_PADDING、ONE_AND_ZEROS_PADDING、PKCS_PADDING、ZEROS_PADDING,不设置 PADDING 参数(源码默认是 DEFAULT_PADDING)。

 

WEB AES 验证工具:

https://www.ssleye.com/ssltool/aes_cipher.html

https://www.javainuse.com/aesgenerator

https://the-x.cn/en-us/cryptography/Aes.aspx

 

 

相关话题:

http://elmagnifico.tech/2021/01/08/Crypto++-padding/

https://gameinstitute.qq.com/community/detail/121437

https://en.wikipedia.org/wiki/Advanced_Encryption_Standard

https://www.codenong.com/43967330/

https://coderedirect.com/questions/212416/encrypt-decrypt-with-aes-using-c-c

https://stackoverflow.com/questions/43967330/crypto-aes-256-ecb-result-is-different-with-openssl

https://blog.csdn.net/qq_35649764/article/details/83036230?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.highlightwordscore&spm=1001.2101.3001.4242.1

https://blog.csdn.net/suhiymof/article/details/92796811

 

 

0
0
分享到:
评论

相关推荐

    CryptoPPForUE4.17.2_5.6.5.zip

    综上所述,"CryptoPPForUE4.17.2_5.6.5.zip" 提供了一个针对Unreal Engine 4.17.2优化的、适用于64位系统的Crypto++静态库,使得开发者能够在UE4项目中方便地集成和使用各种密码学算法,提升游戏的安全性和数据保护...

    cryptopp的des加密解密

    4. **创建加密和解密对象**:使用`DES_EDE3`或`DES_EDE2`(三重DES或双密钥DES)来增强安全性,创建加密和解密对象,如`DES_EDE3::Encryption encryptor(key, sizeof(key))`和`DES_EDE3::Decryption decryptor(key, ...

    cryptopp562 加密解密库

    **加密解密库Cryptopp562详解** Cryptopp562是一款强大的开源加密库,专为C++编程语言设计,提供了丰富的加密和解密算法,适用于各种安全应用。这个库由Jeffrey Wiegand创建并维护,其版本562包含了最新的功能和...

    Crptopp加密解密加签验签

    2,加密解密使用的是文件名,可直接使用字符串加解密 3,验证签名目前使用的UTF8格式,加签和验签必须保持统一,私钥加密,公钥解密。 4,静态库分release版本和debug版本 5,注意VC6.0中编译的使用的环境 MDd 还是MD ...

    cryptopp crypto++ 5.6.5在 MinGW_64 编译的静态库

    cryptopp crypto++ 5.6.5在 MinGW_64 编译的静态库。源文件在visual studio下编译没有问题,但没有提供MinGW_64 的编译环境,需要修改部分源代码才能编译通过

    cryptopp820(加解密算法库).zip

    `cryptopp820(加解密算法库).zip` 是一个包含加密和解密算法的库,主要用于软件开发中的安全通信和数据保护。这个压缩包中的文件主要涉及不同的汇编语言源代码和实现特定算法的C++源文件。以下是对这些文件及其...

    RSA加密解密CryptoPP

    RSA加密解密CryptoPP5.6.2的源代码

    cryptopp.dll 已编译的多个版本(5.6.1.0, 5.5.2.0, 5.3.0.0, 5.2.3.0, 5.2.0.0, 5.0.4.0)

    4. **加密与解密**: 使用Crypto++库,开发者可以实现数据的加密和解密,确保信息安全传输,防止数据被未经授权的人员访问。 5. **数字签名与认证**: 库支持数字签名功能,可以验证数据的完整性和来源,防止数据被...

    CryptoppTestC vs2010 加密解密代码

    《CryptoppTestC vs2010:加密解密代码详解》 在信息技术领域,数据安全至关重要,而加密与解密技术则是保障信息安全的核心手段。本文将深入探讨一个基于Visual Studio 2010开发的项目——CryptoppTestC,它涉及到...

    CryptoPP32.DLL

    《CryptoPP32.DLL:深入理解加密解密库的基石》 在信息化时代,数据安全成为了至关重要的话题,加密解密技术则是保护信息安全的核心手段。本文将深入探讨一个名为"CryptoPP32.DLL"的动态链接库,它是基于Cryptopp库...

    使用VC++进行DES(Data Encryption Standard)加密解密

    在使用VC++进行DES(Data Encryption Standard)加密解密时,你可以选择使用Windows提供的CryptoAPI或者第三方库如OpenSSL来实现。下面我将分别给出两种方法的基本步骤和示例代码。 方法一:使用CryptoAPI 初始化:...

    VS2010编译CryptoPP代码使用

    在本文中,我们将深入探讨如何使用Visual Studio 2010(VS2010)编译CryptoPP库,并在完成后创建一个测试工程以验证其功能。CryptoPP是一个开源的C++类库,提供了大量的密码学算法,如AES(高级加密标准)和其他加密...

    cryptopp565.zip_加密解密_Visual_C++_

    《深入理解cryptopp565:加密解密与Visual C++实战》 Cryptopp565是一个强大的加密库,尤其适用于Visual C++环境下的开发。它提供了多种加密算法,包括但不限于MD5和DES,为软件安全性和数据保护提供了坚实的基础。...

    使用VC++实现AES加解密程序

    在本文中,我们将深入探讨如何使用Visual C++(VC++)来实现AES(Advanced Encryption Standard)加解密算法。AES是一种广泛使用的对称加密标准,它提供了强大的数据保护能力,适用于各种应用程序,如文件存储、网络...

    用C++开源库cryptopp 封装的Aes对称加密

    Cryptopp是一个强大的、免费的C++类库,提供了多种加密、解密、哈希和伪随机数生成算法,包括AES。AES是一种分组密码,采用固定块大小128位和可变密钥长度128、192或256位,提供高效且安全的数据加密。 首先,我们...

    加密解密字符串

    4. 填充与边界处理:确保数据能够正确对齐,以便于加密和解密。 总之,C++中的字符串加密解密涉及到多方面的知识,包括加密算法、安全库的使用、密钥管理以及安全协议等。理解并熟练掌握这些知识点,能够帮助开发者...

    AES 128位加解密C++源码(加盐)

    在C++中实现AES 128位加解密,通常会用到如Crypto++、OpenSSL等库,这些库提供了对AES算法的接口。 1. **AES算法原理**: AES是由一系列称为轮的复杂操作组成,每轮包括字节替换(SubBytes)、行移位(ShiftRows)...

    libcryptopp.a cryptopp crypto++ 5.6.5在 MinGW_32 编译的静态库

    cryptopp crypto++ 5.6.5在 MinGW_32 编译的静态库。源文件在visual studio下编译没有问题,但没有提供MinGW_32 的编译环境,需要修改部分源代码才能编译通过

    VC++ 字符串 CString 加密 解密 源码

    在这个主题中,我们将深入探讨如何使用CString进行加密和解密操作。 首先,了解字符串加密的基本概念。加密是将明文信息转化为不可读的密文,以保护数据的安全性。常见的加密算法有DES(Data Encryption Standard)...

    cryptopp_VS2008.rar

    标题"Cryptopp_VS2008.rar"指的是一个压缩包,其中包含了使用Cryptopp库在Visual Studio 2008环境下进行AES(Advanced Encryption Standard)加解密所需的资源。Cryptopp是一个开源的C++密码学库,它提供了多种加密...

Global site tag (gtag.js) - Google Analytics