您的位置 首页 golang

OpenSSL解析二 AES_ECB_128使用

OpenSSL 中经常使用加密数据的算法是AES_ECB_128,其相对于其他AES算法速度最快,安全性相对较差,但也满足普通加解密数据需求。如果是用于保护用户密码推荐更为安全的加密算法 SHA-256 SHA-512 等,也可使用加slat再多次加密方式。例如:

sha512 (sha512(password)+HX Test )

言归正传,继续学习AES_ECB_128,首先来看示例:

 
# include  <iostream>
#include <openssl/md5.h>
#include <openssl/aes.h>
#include <stdio.h>
#pragma comment(lib, "libcrypto.lib")

int main()
{
	const char* pKey = "HX_Test_2022-4-26_22:10:24";
	// 设置加密密钥
	AES_KEY keyECB;
	if (-1 == AES_set_encrypt_key((const unsigned char*)pKey, 128, &keyECB))
	{
		std:: cout  << "Create Key Failed!";
		return -1;
	}

	// 加密
	const int nSize = 55;
	char szData[nSize] = "This is AES ecb Encrypt Demo!";

	// 填充为AES算法的区块的整数倍,AES_BLOCK_SIZE为openssl/aes.h中定义的一个宏,代表区块长度
	int nDataLength = nSize / AES_BLOCK_SIZE + (nSize % AES_BLOCK_SIZE != 0 ? 1 : 0);
	int nDataSize = nDataLength * AES_BLOCK_SIZE;

	// 填充区块目前有几种方式:NoPadding, PKCS#7, ISO 10126, ANSI X9.23和ZerosPadding
	// 1.NoPadding。不填充。缺点就是只能加密长为128bits倍数的信息,一般不会使用
	// 2.PKCS#7缺几个字节就填几个缺的字节数。
	// 3.ZerosPadding全部填充0x00,无论缺多少全部填充0x00,已经是128bits倍数仍要填充
	// 4.ISO 10126最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数
	// 5.ANSI X9.23最后一个字节是填充的字节数(包括最后一字节),其他全部填0
  
	char* pData = new char[nDataSize];
	char* pEncryptData = new char[nDataSize];
	char* pDecryptData = new char[nDataSize];
  // 当前为ZerosPadding
	 memset (pData, 0, nDataSize);
	memset(pEncryptData, 0, nDataSize);
	memset(pDecryptData, 0, nDataSize);
	 memcpy _s(pData, nDataSize, szData, nSize);


	for (size_t i = 0; i < nDataLength; i++)
	{
		AES_ecb_encrypt((unsigned char*)pData + i * AES_BLOCK_SIZE, (unsigned char*)pEncryptData + i * AES_BLOCK_SIZE, &keyECB, AES_ENCRYPT);
	}


	// 设置解密密钥
	AES_KEY keyECB2;
	if (-1 == AES_set_decrypt_key((const unsigned char*)pKey, 128, &keyECB2))
	{
		std::cout << "Create Key Failed!";
		return -2;
	}

	// 解密
	for (size_t i = 0; i < nDataLength; i++)
	{
		AES_ecb_encrypt((unsigned char*)pEncryptData + i * 16, (unsigned char*)pDecryptData + i * 16, &keyECB2, AES_DECRYPT);
	}
	std::cout << pDecryptData;
	get char ();
}  
  • AES_set_encrypt_key

AES_set_encrypt_key是设置加密密钥函数

  • AES_ecb_encrypt

AES_ecb_encrypt进行加解密,每次只能加密16个字符,所以长数据得循环加解密。

最后一个参数是控制加密还是解密:

  1. AES_ENCRYPT代表加密;
  2. AES_DECRYPT代表解密;

如果加密的数据长度非16字节整数倍会出错,因此在此引入数据填充。

  • 数据填充

当前数据填充有几种方式:NoPadding, PKCS#7, ISO 10126, ANSI X9.23和ZerosPadding。

  1. NoPadding:不填充。缺点就是只能加密长为128bits倍数的信息,一般不会使用;
  2. PKCS#7:缺几个字节就填几个缺的字节数。例如:“1234567890qw”,则后面填充4个0x04;
  3. ZerosPadding全部填充0x00,无论缺多少全部填充0x00,已经是128bits倍数仍要填充;
  4. ISO 10126最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数
  5. ANSI X9.23最后一个字节是填充的字节数(包括最后一字节),其他全部填0
  • AES_set_decrypt_key

AES_set_decrypt_key设置解密密钥

文章来源:智云一二三科技

文章标题:OpenSSL解析二 AES_ECB_128使用

文章地址:https://www.zhihuclub.com/86329.shtml

关于作者: 智云科技

热门文章

网站地图