基于openssl的aes_ecb加解密

1 篇文章 0 订阅

aes

AES五种加密模式(CBC、ECB、CTR、OCF、CFBecb是aes加密的多种模式中的一种, 这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。

基于openssl的aes_ecb加密

int32_t Encrypt(const string& content, string& strOut)
{
	int len = content.length() / 16 + 1;
	byte userkey[16] = { 1, 2, 3, 4, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2};
	
	char* data = (char*)malloc(AES_BLOCK_SIZE * len);
	unsigned char* cipher = (unsigned char*)malloc(AES_BLOCK_SIZE * len + 33);
	unsigned char* plain = (unsigned char*)malloc(AES_BLOCK_SIZE * len);
	AES_KEY key;
	memset((void*)data, 0, AES_BLOCK_SIZE * len);
	memset((void*)cipher, 0, AES_BLOCK_SIZE * len + 33);
	memset((void*)plain, 0, AES_BLOCK_SIZE * len);
	strcpy_s(data, AES_BLOCK_SIZE * len, content.c_str());

	/*aes (key,content)*/
	AES_set_encrypt_key(userkey, 256, &key);
	for (int i = 0; i < len; i++) //每次加密16个字节
		AES_ecb_encrypt((byte*)(data + i * AES_BLOCK_SIZE), cipher + i * AES_BLOCK_SIZE, &key, AES_ENCRYPT);
	strOut = cipher ;
	free(data);
	free(cipher);
	free(plain);
	return 0;
}

基于openssl的aes_ecb解密

int32_t Decode(const string& strSrc, string& res)
{
	byte userkey[16] = { 1, 2, 3, 4, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2}; //解密密钥与加密密钥相同
	auto pres = new char[strSrc.length()];
	memset(pres, '\0', strSrc.length());
	AES_KEY key;
	AES_set_decrypt_key(userkey, 256, &key);
	for (int32_t i = 0; i < (strSrc.length()/16); i++)
		AES_ecb_encrypt((byte*)(strSrc.c_str() + i * AES_BLOCK_SIZE), (byte*)(pres + i * AES_BLOCK_SIZE), &key, AES_DECRYPT);
	res = string(pres);
	delete[] pres;
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`AES_ecb_encrypt()` 函数封装了AES算法中的ECB模式加密操作,它可以对输入的数据进行加密处理并输出加密后的数据。而解密则需要使用 `AES_ecb_decrypt()` 函数,它封装了AES算法中的ECB模式解密操作,可以对加密后的数据进行解密处理并输出解密后的数据。 使用该函数需要先引入OpenSSL库的头文件 `openssl/aes.h`,并初始化一个 `AES_KEY` 结构体,然后使用 `AES_set_encrypt_key()` 函数设置加密密钥。接下来,可以使用 `AES_ecb_encrypt()` 函数对数据进行加密处理,该函数的参数包括输入的数据、输出的数据、数据长度和加密密钥。最后,需要释放密钥,使用 `AES_cleanup()` 函数即可。 解密的过程与加密类似,不同的是需要使用 `AES_set_decrypt_key()` 函数设置解密密钥,然后使用 `AES_ecb_decrypt()` 函数对加密后的数据进行解密处理,即可输出解密后的数据。 示例代码如下: ```c #include <openssl/aes.h> #include <string.h> int main() { unsigned char plaintext[] = "Hello, world!"; unsigned char ciphertext[16], decryptedtext[16]; AES_KEY key; AES_set_encrypt_key("0123456789abcdef", 128, &key); // 设置加密密钥 AES_ecb_encrypt(plaintext, ciphertext, &key, AES_ENCRYPT); // 进行加密 AES_set_decrypt_key("0123456789abcdef", 128, &key); // 设置解密密钥 AES_ecb_decrypt(ciphertext, decryptedtext, &key, AES_DECRYPT); // 进行解密 AES_cleanup(&key); // 释放密钥 if (strcmp(plaintext, decryptedtext) == 0) { printf("Decryption successful!\n"); } else { printf("Decryption failed!\n"); } return 0; } ``` 注意:该函数只支持对固定长度的数据进行加密和解密,如果需要对变长数据进行加密和解密,需要使用其他模式,如CBC、CTR等。同时,ECB模式存在一些安全问题,不建议使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值