在日常工作中,一般会有加密和解密的需求,其中AES是我们一个最常见的选择,本文利用openssl的api来实现在程序中如何进行AES加密和解密。
AES概念
AES是高级加密标准(Advanced Encryption Standard)的缩写,它是一种对称的双向加密技术。收发两端使用同一个密钥,发送端通过密钥进行加密,传输的加密后的密文,接收端通过密钥进行解密。AES根据密钥长度不同分为AES-128, AES-192和AES-256,分别对应密钥长度为16bytes,24bytes和32bytes。密钥越长,安全性越高。
openssl加密
首先需要定义一个key,例如使用AES-128,则定义key的长度位16byte的一个unsigned char的数组,另外也可以定义一个初始向量iv。这个需要在加密和解密保证一直即可。
unsigned char key[AES_BLOCK_SIZE] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160};
unsigned char iv[AES_BLOCK_SIZE] = {70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220};
接下来只需要使用AES_set_encrypt_key来设置key,然后可以使用AES_cbc_encrypt来加密数据
AES_KEY aes;
AES_set_encrypt_key((unsigned char*)key, 128, &aes);
AES_cbc_encrypt(plainText, cipherText, length, &aes, iv, AES_ENCRYPT);
需要注意的是plainText和cipherText都是长度为length的字符数组,并且是AES_BLOCK_SIZE的整数倍。
openssl解密
解密的过程和加密过程是非常类似的,调用的API不同。
AES_KEY aes;
AES_set_decrypt_key((unsigned char*)key, 128, &aes);
AES_cbc_encrypt(cipherText, plainText, length, &aes, iv, AES_DECRYPT);