密云区免费网站建设,wordpress 评论时间,丹东网站制作,百度熊掌号 wordpressAES算法是一种对称加密算法#xff0c;全称为高级加密标准#xff08;Advanced Encryption Standard#xff09;。它是一种分组密码#xff0c;以128比特为一个分组进行加密#xff0c;其密钥长度可以是128比特、192比特或256比特#xff0c;因此可以提供不同等级的安全性…AES算法是一种对称加密算法全称为高级加密标准Advanced Encryption Standard。它是一种分组密码以128比特为一个分组进行加密其密钥长度可以是128比特、192比特或256比特因此可以提供不同等级的安全性。该算法采用了替代、置换和混淆等技术以及多轮加密和密钥扩展等机制使得其加密效果优秀安全性高被广泛应用于各种领域中如数据加密、文件加密、网络安全等。
AES算法加密和解密使用的密钥是相同的该算法加密和解密速度较快适用于对大量数据进行加密解密的场景。在实际应用中通常采用混合加密方式即使用RSA算法加密对称加密算法中的密钥再使用对称加密算法加密数据以保证数据的机密性和加密解密的效率。
AES算法常用两种加密模式即CBC和ECB模式它们分别具有不同的优缺点。 ECBElectronic Codebook电子密码本模式是最简单的分组密码工作模式将每个明文块独立加密同样的密钥加密同样的明文块得到的密文也是一样的因此容易被攻击者利用重复的密文进行分析破解。ECB模式加密效率高适用于短报文加密但不适用于长报文加密。 CBCCipher Block Chaining密码块链模式是一种分组密码工作模式先将明文分组然后对每个分组进行加密加密时使用上一块密文作为输入因此相同的明文块在不同位置上得到的密文是不同的可以防止被攻击者利用重复的密文进行分析破解。CBC模式加密效率较低但适用于长报文加密因为不同的明文块之间互相影响增加了安全性。
在实际应用中通常采用CBC模式进行加密因为它比ECB模式更安全但加密效率较低。此外还有其他的加密模式如CFB、OFB、CTR等不同的加密模式适用于不同的场景需要根据实际需求进行选择。
OpenSSL库提供了对AES加密的支持但在使用时读者还是需要自行封装一些通用加解密函数如下代码片段是笔者常用的一些函数总结其中aes_cbc_encrypt函数用于使用CBC模式对特定字符串加密aes_cbc_decrypt则使用CBC模式对字符串进行解密第二个函数AES函数则是使用OpenSSL库默认的加解密函数二次封装实现的。
#include iostream
#include openssl/err.h
#include openssl/aes.h
#include openssl/evp.h
#include openssl/crypto.h
#include openssl/pem.hextern C
{
#include openssl/applink.c
}#pragma comment(lib,libssl_static.lib)
#pragma comment(lib,libcrypto.lib)// CBC模式加密
int aes_cbc_encrypt(char* in, char* key, char* out)
{if (!in || !key || !out)return 0;unsigned char iv[AES_BLOCK_SIZE];for (int i 0; i AES_BLOCK_SIZE; i)iv[i] 0;AES_KEY aes;if (AES_set_encrypt_key((unsigned char*)key, 128, aes) 0){return 0;}int len strlen(in);AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, aes, iv, AES_ENCRYPT);return 1;
}// CBC模式解密
int aes_cbc_decrypt(char* in, char* key, char* out)
{if (!in || !key || !out)return 0;// 加密的初始化向量unsigned char iv[AES_BLOCK_SIZE];// iv一般设置为全0for (int i 0; i AES_BLOCK_SIZE; i)iv[i] 0;AES_KEY aes;if (AES_set_decrypt_key((unsigned char*)key, 128, aes) 0){return 0;}int len strlen(in);AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, aes, iv, AES_DECRYPT);return 1;
}// 将加密与解密整合在一起
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{if (strcmp(Type, encode) 0){AES_KEY AESEncryptKey;AES_set_encrypt_key(key, 256, AESEncryptKey);AES_encrypt(InBuff, OutBuff, AESEncryptKey);}else if (strcmp(Type, decode) 0){AES_KEY AESDecryptKey;AES_set_decrypt_key(key, 256, AESDecryptKey);AES_decrypt(InBuff, OutBuff, AESDecryptKey);}
}有了上述算法封装接下来笔者将依次演示这几种不同的加密函数是如何被应用的首先简单介绍一下aes_cbc_encrypt与aes_cbc_decrypt这两个函数都是自己封装的AES加解密算法这两个算法参数传递保持一致第一个参数都是指定需要加密的缓冲区第二个参数则是指定加密所使用的key第三个参数是处理后的结果。
int main(int argc, char* argv[])
{char szBuffer[1024] hello lyshark;char szDst[1024] { 0 };char szSrc[1024] { 0 };// 计算一串密钥char key[AES_BLOCK_SIZE] { 0 };for (int x 0; x AES_BLOCK_SIZE; x){key[x] 32 x;}// AES加密if (aes_cbc_encrypt(szBuffer, key, szDst) ! 0){std::cout 加密后长度: strlen(szDst) std::endl;}// AES解密if (aes_cbc_decrypt(szDst, key, szSrc) ! 0){std::cout 解密内容: szSrc std::endl;}system(pause);return 0;
}上述代码片段则是通过AES实现对数据加解密处理的功能如下是这段代码的输出效果 第二种调用方式是采用API实现其中的AES函数通过AES_set_encrypt_key设置加密密钥并直接调用AES_encrypt实现数据加密反之通过AES_set_decrypt_key设置解密密钥并调用AES_decrypt解密这段代码调用方式如下所示
int main(int argc, char* argv[])
{unsigned char Buffer[1024] hello lyshark;unsigned char EncodeBuf[1024] { 0 };unsigned char DecodeBuf[1024] { 0 };unsigned char aes_key[32] { 0 };// 随机生成密钥for (int x 0; x 32; x){int ch rand() % 5;aes_key[x] (char)ch;}AES(Buffer, EncodeBuf, (unsigned char *)aes_key, (char*)encode);std::cout 加密数据长度: strlen((char *)EncodeBuf) std::endl;AES(EncodeBuf, DecodeBuf, (unsigned char*)aes_key, (char*)decode);std::cout 解密数据: DecodeBuf std::endl;system(pause);return 0;
}如上代码通过调用AES函数时传入encode实现数据加密传入decode实现数据解密如下图所示