加密算法-对称加密-AES加密
1.加密算法知识学习
工作中经常遇到数据需要加密的情况,于是通过网络学习了一下数据加密的基本知识。
八大加密算法解析 - 馥欣科技的文章 - 知乎 https://zhuanlan.zhihu.com/p/215280725
因为我遇到的应用场景需要把算法封装到SDK中,所以选定了对称加密中的AES算法。
高级加密标准(英语:Advanced Encryption
Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
2.加密算法库选定
为了移植方便选定C语言实现的库,并且考虑了库的start数量。
于是选定了tiny-AES-c .
选用简单的ECB模式
ECB模式(电子密码本模式:Electronic codebook)
ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。
找到库中test.c文件,并且测试
static int test_encrypt_ecb(void);
static int test_decrypt_ecb(void);
两个函数。
3.编写自己的测试函数。
using namespace std;
int main(int argc, char *argv[])
{
test_encrypt_ecb();
test_decrypt_ecb();
fflush(stdout);
uint8_t key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c };
string sData = "wenqunadeqingruxuweiyouyuantouhuoshuilai";
cout<<"sData size:"<<sData.size()<<endl;
uchar in[169] = {0};
memcpy(in,(uchar*)sData.data(),sData.size());
struct AES_ctx ctx;
AES_init_ctx(&ctx, key);
AES_ECB_encrypt(&ctx, in);
for(int i = 0; i < 10; ++i){
cout<<hex<<(int)in[i]<<" ";
}
cout<<endl;
//
AES_ECB_decrypt(&ctx,in);
cout<<"size:"<<dec<<strlen((char*)in)<<endl;
string sDe;
sDe.resize(strlen((char*)in));
memcpy((void*)sDe.data(),(void*)in,strlen((char*)in));
cout<<"de:"<<sDe<<endl;
return 0;
}
https://gitee.com/yingge2017/cpp_demo.git
aes_demo
https://github.com/kokke/tiny-AES-c.git