如何用电脑做网站服务器吗,深圳做网站得外包公司有哪些,手机app软件开发推荐,wordpress判断页面Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目#xff0c;提供了大量的密码学算法和功能#xff0c;包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具#xff0c;以满足软件开发中对…Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目提供了大量的密码学算法和功能包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具以满足软件开发中对安全性的需求。
高级加密标准Advanced Encryption StandardAES是一种对称密钥加密标准用于保护电脑上的敏感数据。AES是由美国国家标准与技术研究院NIST于2001年确定的它取代了过时的数据加密标准Data Encryption StandardDES。
以下是AES加密算法的主要特点和概述
对称密钥算法 AES是一种对称密钥算法意味着相同的密钥用于加密和解密数据。这就要求通信双方在通信前共享密钥并确保其保密性。分组密码 AES将明文数据分成固定大小的块128比特然后对每个块进行独立的加密。这个固定大小的块称为分组。AES支持多种分组长度包括128比特、192比特和256比特。轮数 AES加密算法的安全性与其轮数相关。轮数表示对数据块的处理循环次数不同密钥长度的AES使用不同数量的轮数。通常128比特密钥使用10轮192比特密钥使用12轮256比特密钥使用14轮。密钥长度 AES支持多种密钥长度包括128比特、192比特和256比特。密钥长度的选择直接影响加密算法的安全性。SubBytes、ShiftRows、MixColumns和AddRoundKey 这些是AES加密算法中的四个主要操作它们通过多轮迭代来加密数据。SubBytes和ShiftRows引入非线性性MixColumns和AddRoundKey提供了扩散和混淆。强安全性 AES被广泛认为是一种安全、可靠的加密算法。它经过广泛的密码分析和评估并且在许多应用中得到了广泛的应用包括加密通信、文件加密和硬件加密。
总体而言AES是一种高效、安全且广泛应用的加密算法适用于多种应用场景。其在加密强度和性能之间取得了良好的平衡因此成为许多信息安全应用的首选算法。
使用AES算法
AESAdvanced Encryption Standard广泛应用于保护敏感数据的加密和解密过程。以下是AES算法的概述
1. 对称加密算法
AES是一种对称加密算法这意味着加密和解密都使用相同的密钥。密钥是保护数据安全的关键因此对称加密算法需要确保密钥的安全分发和管理。
2. 密钥长度
AES支持不同长度的密钥包括128位、192位和256位。密钥长度越长通常意味着更高的安全性但也可能导致加密和解密的计算成本增加。
3. 块加密算法
AES是块加密算法它按照固定大小的数据块128位进行加密。加密和解密的过程都是对这些数据块的操作。
4. 加解密过程
加密
数据分块将明文分成固定大小的数据块128位。初始轮密钥加将明文和初始密钥进行一次简单的混淆操作。轮加密通过多轮的替代和置换操作SubBytes、ShiftRows、MixColumns、AddRoundKey对数据块进行混淆。最终轮在最后一轮中省略MixColumns操作。得到密文。
解密
初始轮密钥解将密文和初始密钥进行一次简单的混淆操作。轮解密通过多轮的逆操作InvSubBytes、InvShiftRows、InvMixColumns、AddRoundKey对数据块进行逆操作。最终轮在最后一轮中省略InvMixColumns操作。得到明文。
5. 使用场景
AES广泛用于保护敏感数据如文件、数据库、网络通信等。它是许多安全协议和标准的基础包括TLS安全套接层、IPsecInternet协议安全等。
6. 安全性
AES被广泛接受并认为是安全可靠的加密算法。密钥长度的选择对安全性至关重要一般建议使用128位、192位或256位的密钥以满足特定安全需求。
总体而言AES作为一种高效且安全的对称加密算法在现代加密通信中扮演着重要的角色。AES的使用需要引入头文件#include aes.h其他部分与《C 通过CryptoPP计算Hash值》文章中的头文件引入保持一致。
如下AESEncrypt是一个使用AES算法进行加密的函数。下面是对函数的主要步骤的注释
AES加密对象初始化 创建AESEncryption对象用于AES加密。定义AES加密需要的数据块inBlock输入数据块、outBlock输出数据块、xorBlock异或数据块。 计算加密数据块大小 计算需要的加密数据块数量考虑到原始数据大小可能不是AES块大小的整数倍。 分配加密后的数据缓冲区 根据计算得到的加密数据块大小分配内存。 设置AES加密密钥 调用SetKey函数设置AES加密密钥。 AES加密过程 循环处理原始数据块每次处理一个AES块大小的数据。将原始数据块拷贝到输入数据块。使用AES算法进行加密。将加密后的数据块拷贝到输出缓冲区。 返回加密结果 返回加密后的数据缓冲区和大小。
请注意在实际使用中要确保释放了分配的内存以防止内存泄漏。
BOOL AESEncrypt(BYTE *pOriginalData, DWORD dwOriginalDataSize, BYTE *pAESKey, DWORD dwAESKeySize, BYTE **ppEncryptData, DWORD *pdwEncryptData)
{// 定义AES加密需要的数据块AESEncryption aesEncryptor;// 加密原文数据块unsigned char inBlock[AES::BLOCKSIZE];// 加密后密文数据块unsigned char outBlock[AES::BLOCKSIZE];// 必须设定全为0unsigned char xorBlock[AES::BLOCKSIZE];DWORD dwOffset 0;BYTE *pEncryptData NULL;DWORD dwEncryptDataSize 0;// 计算需要的加密数据块大小, 并按 128位 即 16字节 对齐, 不够则 填充0 对齐// 商DWORD dwQuotient dwOriginalDataSize / AES::BLOCKSIZE;// 余数DWORD dwRemaind dwOriginalDataSize % AES::BLOCKSIZE;if (0 ! dwRemaind){dwQuotient;}// 申请动态内存dwEncryptDataSize dwQuotient * AES::BLOCKSIZE;// 分配加密后的数据缓冲区pEncryptData new BYTE[dwEncryptDataSize];if (NULL pEncryptData){return FALSE;}// 设置AES加密密钥aesEncryptor.SetKey(pAESKey, dwAESKeySize);do{// 初始化数据块RtlZeroMemory(inBlock, AES::BLOCKSIZE);RtlZeroMemory(xorBlock, AES::BLOCKSIZE);RtlZeroMemory(outBlock, AES::BLOCKSIZE);// 获取加密块if (dwOffset (dwOriginalDataSize - AES::BLOCKSIZE)){RtlCopyMemory(inBlock, (PVOID)(pOriginalData dwOffset), AES::BLOCKSIZE);}else{RtlCopyMemory(inBlock, (PVOID)(pOriginalData dwOffset), (dwOriginalDataSize - dwOffset));}// 使用AES算法进行加密aesEncryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock);// 将加密后的数据块拷贝到输出缓冲区RtlCopyMemory((PVOID)(pEncryptData dwOffset), outBlock, AES::BLOCKSIZE);// 更新数据dwOffset dwOffset AES::BLOCKSIZE;dwQuotient--;} while (0 dwQuotient);// 返回数据*ppEncryptData pEncryptData;*pdwEncryptData dwEncryptDataSize;return TRUE;
}如下AESDecrypt是一个使用AES算法进行解密的函数。以下是对函数的主要步骤的注释
AES解密对象初始化 创建AESDecryption对象用于AES解密。定义AES解密需要的数据块inBlock输入数据块、outBlock输出数据块、xorBlock异或数据块。 计算解密数据块大小 计算需要的解密数据块数量考虑到加密数据大小可能不是AES块大小的整数倍。 分配解密后的数据缓冲区 根据计算得到的解密数据块大小分配内存。 设置AES解密密钥 调用SetKey函数设置AES解密密钥。 AES解密过程 循环处理加密数据块每次处理一个AES块大小的数据。将加密数据块拷贝到输入数据块。使用AES算法进行解密。将解密后的数据块拷贝到输出缓冲区。 返回解密结果 返回解密后的数据缓冲区和大小。
请注意在实际使用中要确保释放了分配的内存以防止内存泄漏。
BOOL AESDecrypt(BYTE *pEncryptData, DWORD dwEncryptData, BYTE *pAESKey, DWORD dwAESKeySize, BYTE **ppDecryptData, DWORD *pdwDecryptData)
{// 定义AES解密需要的数据块AESDecryption aesDecryptor; // 解密密文数据块unsigned char inBlock[AES::BLOCKSIZE]; // 解密后后明文数据块unsigned char outBlock[AES::BLOCKSIZE]; // 必须设定全为0unsigned char xorBlock[AES::BLOCKSIZE]; DWORD dwOffset 0;BYTE *pDecryptData NULL;DWORD dwDecryptDataSize 0;// 计算密文长度, 并按 128位 即 16字节 对齐, 不够则填充0对齐// 商DWORD dwQuotient dwEncryptData / AES::BLOCKSIZE;// 余数DWORD dwRemaind dwEncryptData % AES::BLOCKSIZE; if (0 ! dwRemaind){dwQuotient;}// 分配解密后的数据缓冲区dwDecryptDataSize dwQuotient * AES::BLOCKSIZE;pDecryptData new BYTE[dwDecryptDataSize];if (NULL pDecryptData){return FALSE;}// 设置AES解密密钥aesDecryptor.SetKey(pAESKey, dwAESKeySize);do{// 初始化数据块RtlZeroMemory(inBlock, AES::BLOCKSIZE);RtlZeroMemory(xorBlock, AES::BLOCKSIZE);RtlZeroMemory(outBlock, AES::BLOCKSIZE);// 将加密数据块拷贝到输入数据块if (dwOffset (dwDecryptDataSize - AES::BLOCKSIZE)){RtlCopyMemory(inBlock, (PVOID)(pEncryptData dwOffset), AES::BLOCKSIZE);}else{RtlCopyMemory(inBlock, (PVOID)(pEncryptData dwOffset), (dwEncryptData - dwOffset));}// 使用AES算法进行解密aesDecryptor.ProcessAndXorBlock(inBlock, xorBlock, outBlock);// 将解密后的数据块拷贝到输出缓冲区RtlCopyMemory((PVOID)(pDecryptData dwOffset), outBlock, AES::BLOCKSIZE);// 更新数据dwOffset dwOffset AES::BLOCKSIZE;dwQuotient--;} while (0 dwQuotient);// 返回数据*ppDecryptData pDecryptData;*pdwDecryptData dwDecryptDataSize;return TRUE;
}AESEncrypt 函数用于对输入的原始数据进行AES加密加密使用指定的AES密钥。函数通过参数返回加密后的数据和数据大小。
函数原型
BOOL AESEncrypt(BYTE *pOriginalData, // [in] 原始数据的指针DWORD dwOriginalDataSize, // [in] 原始数据的大小BYTE *pAESKey, // [in] AES加密密钥的指针DWORD dwAESKeySize, // [in] AES加密密钥的大小BYTE **ppEncryptData, // [out] 指向指针的指针用于存储加密后的数据DWORD *pdwEncryptData // [out] 指向DWORD的指针用于存储加密后的数据大小
);pOriginalData: 指向要加密的原始数据的指针。dwOriginalDataSize: 原始数据的大小。pAESKey: 指向用于AES加密的密钥的指针。dwAESKeySize: AES加密密钥的大小。ppEncryptData: 指向指针的指针用于存储加密后的数据。该指针需要在函数外释放分配的内存。pdwEncryptData: 指向DWORD的指针用于存储加密后的数据大小。
函数返回一个BOOL值表示操作是否成功。如果函数返回TRUE则表示加密成功否则表示加密失败。
AESDecrypt 函数用于对输入的加密后的数据进行AES解密解密使用指定的AES密钥。函数通过参数返回解密后的数据和数据大小。
函数原型
BOOL AESDecrypt(BYTE *pEncryptData, // [in] 加密后的数据的指针DWORD dwEncryptDataSize, // [in] 加密后的数据的大小BYTE *pAESKey, // [in] AES解密密钥的指针DWORD dwAESKeySize, // [in] AES解密密钥的大小BYTE **ppDecryptData, // [out] 指向指针的指针用于存储解密后的数据DWORD *pdwDecryptData // [out] 指向DWORD的指针用于存储解密后的数据大小
);pEncryptData: 指向要解密的加密后数据的指针。dwEncryptDataSize: 加密后数据的大小。pAESKey: 指向用于AES解密的密钥的指针。dwAESKeySize: AES解密密钥的大小。ppDecryptData: 指向指针的指针用于存储解密后的数据。该指针需要在函数外释放分配的内存。pdwDecryptData: 指向DWORD的指针用于存储解密后的数据大小。
函数返回一个BOOL值表示操作是否成功。如果函数返回TRUE则表示解密成功否则表示解密失败。
调用时通过AESEncrypt加密数据AESDecrypt则用于解密数据
void ShowData(BYTE *pData, DWORD dwSize)
{for (int i 0; i dwSize; i){if ((0 ! i) (0 i % 16)){printf(\n);}else if ((0 ! i) (0 i % 8)){printf( );}printf(%02X , pData[i]);}printf(\n);
}int main(int argc, char* argv[])
{BYTE *pEncryptData NULL;DWORD dwEncryptDataSize 0;BYTE *pDecryptData NULL;DWORD dwDecryptDataSize 0;char szOriginalData[] It’s better to be alone than to be with someone you’re not happy to be with.;char szAESKey[] ABCDEFGHIJKIMNOP;BOOL bRet FALSE;// 加密bRet AESEncrypt((BYTE *)szOriginalData, (1 ::lstrlen(szOriginalData)), (BYTE *)szAESKey, ::lstrlen(szAESKey), pEncryptData, dwEncryptDataSize);if (FALSE bRet){return 1;}// 解密bRet AESDecrypt(pEncryptData, dwEncryptDataSize, (BYTE *)szAESKey, ::lstrlen(szAESKey), pDecryptData, dwDecryptDataSize);if (FALSE bRet){return 2;}// 显示printf(原文数据:\n);ShowData((BYTE *)szOriginalData, (1 ::lstrlen(szOriginalData)));printf(密文数据:\n);ShowData(pEncryptData, dwEncryptDataSize);printf(解密后数据:\n);ShowData(pDecryptData, dwDecryptDataSize);// 释放内存delete[]pEncryptData;pEncryptData NULL;delete[]pDecryptData;pDecryptData NULL;system(pause);return 0;
}运行后对szOriginalData中的数据进行加密密钥是szAESKey中的长度如下图所示