C++使用openssl对AES-256-ECB PKCS7 加解密

这篇具有很好参考价值的文章主要介绍了C++使用openssl对AES-256-ECB PKCS7 加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


/*
 * AES-256-ECB PKCS7 加密 函数
 * input:经过PKCS7填充后的明文数据
 * outhex:加密后的命名数据16进制数,可以使用base64_encode转换为base64格式字符串密文
 * key:密钥
 * len:经过PKCS7填充后的明文数据长度
 */
void AesEcb256Pkcs7Encrypt(u8 *input, u8 *outhex, u8 *key, int len)
{
	/* key:171ce897ad494cb289b023cd3c0ceab4 
	 * input:{terminalNumber}
	 * aesHexStr:6241579fb24b00f9d1d238ed191e700877b27ba4e7f6184253eb40c20f67390f
	 * base64str:YkFXn7JLAPnR0jjtGR5wCHeye6Tn9hhCU+tAwg9nOQ8=
	 *
	 * input:{"terminalNumber":"28b7f2eb-b549-3200-9950-2c6a83cd8af2"}
	 * aesHexStr:3B2EFE3D4BF2E586F06D9AC26B2F35CE67B2B228C5DE89980DE8CE3570EBBEE62EB54526A24542885D8902E860D54D056C6545D183B0A0134A48449C3D9F7B19
	 * base64str:Oy7+PUvy5YbwbZrCay81zmeysijF3omYDejONXDrvuYutUUmokVCiF2JAuhg1U0FbGVF0YOwoBNKSEScPZ97GQ==
	 */

	TRACE("input:%s, key:%s, %d\n", (char*)input, (char*)key, len);

    AES_KEY aesKey;
    AES_set_encrypt_key(key, 256, &aesKey);


	for (size_t i = 0; i < len; i += AES_BLOCK_SIZE)
	{
	    AES_encrypt(input + i, outhex + i, &aesKey);
		TRACE("i:%d\n\n", i);
	}

	/* 将加密后的数据转换成十六进制字符串 */
	std::string aesHexStr;
	for (size_t i = 0; i < len; ++i)
	{
	    char hex[3];
	    sprintf(hex, "%02X", outhex[i]);
	    aesHexStr += hex;
	}

	/* 将hex转为base64 */
	char base64str[2*len] = {0};
	base64_encode(outhex, base64str, len);

	TRACE("buf[%s], len:%d, hexAes[%s], len:%d\n", base64str, strlen(base64str), aesHexStr.data(), aesHexStr.length());
}

/*
 * AES-256-ECB PKCS7 解密 函数
 */
void AesEcb256Pkcs7Decrypt(unsigned char* input, unsigned char* output, unsigned char* key, int len)
{
    AES_KEY aesKey;
    AES_set_decrypt_key(key, 256, &aesKey);

    for (size_t i = 0; i < len; i += AES_BLOCK_SIZE)
	{
	    AES_decrypt(input + i, output + i, &aesKey);
		TRACE("i:%d\n\n", i);
	}

	/* 将加密后的数据转换成十六进制字符串 */
	std::string aesHexStr;
	for (size_t i = 0; i < len; ++i)
	{
	    char hex[3];
	    sprintf(hex, "%02X", output[i]);
	    aesHexStr += hex;
		TRACE("output[%d]:%s [%d]\n", i, hex, output[i]);
	}
}

// PKCS7填充函数
int Pkcs7Padding(char *data, int len)
{
    int padding_len = AES_BLOCK_SIZE - (len % AES_BLOCK_SIZE);
	TRACE("data:%s, len:%d, padding_len:%d \n\n", data, len, padding_len);
    for (int i = 0; i < padding_len; i++)
    {
        data[len + i] = (char)padding_len;
    }
	return len + padding_len;
}

//去除PKCS7填充
int Pkcs7Unpadding(unsigned char *data, int length) 
{
	/* 取出最后一个字节数据 */
	int padding_size = data[length - 1];

	TRACE("padding_size:%d ,%d ,%d\n\n", padding_size, data[length - 1], length);

	if (padding_size > AES_BLOCK_SIZE || padding_size == 0) 
	{
		TRACE("padding err\n\n");
		return -1; // 非法填充
	}

	int padding_index = length - padding_size;
	for (int i = 0; i < padding_size; i++)
	{
		if (data[padding_index+i] != (unsigned char)padding_size)
		{
			TRACE("padding err :%d ,%d\n\n", data[padding_index+i], padding_size);
			return -1; // 非法填充
		}
	}
	return padding_index;
}
int maintest()
{
	/* 256位密钥 */
    u8 *key = "171ce897ad494cb289b023cd3c0ceab4";
    char plaintext[256] = {0};
	/* 加密密文hex */
    unsigned char ciphertext[1024];
	
    unsigned char output[1024]; // 解密输出

	//sprintf(plaintext, "terminalNumber");
	//sprintf(plaintext, "{terminalNumber}");
	sprintf(plaintext, "{\"terminalNumber\":\"28b7f2eb-b549-3200-9950-2c6a83cd8af2\"}");

    /* PKCS7填充明文 */
    int allLen = Pkcs7Padding((char *)plaintext, strlen(plaintext));

	/* 加密 */
    AesEcb256Pkcs7Encrypt(plaintext, ciphertext, key, allLen);
	TRACE("plaintext:%s, len:%d key:%s \n\n", plaintext, allLen, key);

    /* 解密 */
    AesEcb256Pkcs7Decrypt(ciphertext, output, key, allLen);
	/* PKCS7解填充 */
    int plaintext_len = Pkcs7Unpadding(output, allLen); 

    if (plaintext_len == -1)
    {
        TRACE("AES Decrypt err\n");
    }
    else
    {
		TRACE("output:%s [%d]\n\n", output, plaintext_len);
    }

    return 0;
}

pkcs7 c++,c++,服务器,linuxpkcs7 c++,c++,服务器,linuxpkcs7 c++,c++,服务器,linux文章来源地址https://www.toymoban.com/news/detail-772023.html

到了这里,关于C++使用openssl对AES-256-ECB PKCS7 加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端通过AES进行加解密(ECB、CBC模式)

    在项目开发中,由于需要对接口传参的敏感信息进行加密传输,后端接口返回的参数也是进行加密过的,此时就需要进行加解密操作。 本篇文章使用AES进行加解密,AES加密算法提供了五种不同的工作模式:CBC,ECB,CTR,CFB,OFB 这里只对CBC和ECB加解密进行说明,这两种加密模

    2024年02月16日
    浏览(50)
  • OpenSSL 使用AES对文件加解密

    AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先的DES(Data Encryption Standard)算法,成为新的标准。AES是一种对称加密算法,意味着加密和解密使用相同的密钥。

    2024年02月05日
    浏览(37)
  • iOS-AES加解密各模式(ECB、CBC、CFB、OFB)的实现

    最近和服务器同学对接口进行数据加解密时用到了AES加密。原本以为AES就一种加密形式,对接过程中才学习到AES不同模式、不同填充方式下,结果都不相同。因此去学习了一下AES加密的基本概念、实现原理,以及各种模式下的区别与实现。 AES加密是对称加密的一种,全称是

    2024年02月02日
    浏览(46)
  • c# Aes加解密和SHA256加解密方法

    Aes SHA256 测试密钥

    2024年02月03日
    浏览(73)
  • openssl3.2 - 官方demo学习 - mac - cmac-aes256.c

    指定加密算法(e.g. AES-256-CBC), 对明文生成MAC数据

    2024年01月19日
    浏览(54)
  • AES算法基于FPGA的硬件实现(2)AES算法的c++实现(ecb/cbc)

    对于cpp来说内部有一些加密函数库来简单实现一些加密算法可以,但是为了更好理解内部实现流程,实现过程不调用cpp的库。 工程中出现的byte_t为bitset8类型,word为bitset32类型。base64转换文件为在网上找到的开源代码,在GitHub链接中有。 整体工程代码在末尾GitHub链接。 实现了

    2024年02月04日
    浏览(60)
  • 20.3 OpenSSL 对称AES加解密算法

    AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以 128 比特为一个分组进行加密,其密钥长度可以是 128 比特、 192 比特或 256 比特,因此可以提供不同等级的安全性。该算法采用了替代、置换和混淆等技术,以及多轮加密和密

    2024年02月08日
    浏览(42)
  • C++-openssl-aes-加密解密

    hmac   Hash-based Message Authentication Code MAC 定义: Message Authentication Code 一种确认完整性并进行认证的技术。       2.1C中的字符拼接 2.2 C++中的字符拼接   sprintf sprintf_s的区别 localtime_s Windows localtime_r linux linux       1.如果已经分配过内存,可能是越界导致的指令错误。 2.可能是

    2024年02月04日
    浏览(41)
  • C++ CryptoPP使用AES加解密

    Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库。它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto++ 的目标是提供高性能和可靠的密码学工具,以满足软件开发中对安全性的需求。 高级加密

    2024年02月05日
    浏览(41)
  • 20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片

    20230721在WIN10下安装openssl并解密AES-128加密的ts视频切片 2023/7/21 22:58 1、前言: AES-128加密的ts视频切片【第一个】,打开有时间限制的! https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?type=2app_id=app1cE7gLFM1187pro_id=term_645c69388953e_Nhew9Aavailable=trueshare_user_id=u_5e591188

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包