vlambda博客
学习文章列表

加密算法-对称加密-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.编写自己的测试函数。


#include <iostream>#include <string.h>#include <stddef.h>#include "aes.hpp"using namespace std;#define ECB 1int main(int argc, char *argv[]){#if 0 test_encrypt_ecb(); test_decrypt_ecb(); fflush(stdout);#endif 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