一个超级简单又实用的AES加密解密字符串示例

Advanced Encryption Standard 高级加密标准
在密码学中AES又称Rijndael加密法 是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES

这次例程中可以修改master_aes_object.h中的MasterAesIv[] 和 MasterAesKey[] 的值使用不同的密钥
加密是一比一生成密文 如果用于传入 加密后不会增加传输的带宽压力

如果是传输使用 请使用相同的程序进行解密

测试例程

#include <stdio.h>
#include "aeckey.h"
#include "AES.h"
#include "random.h"
#include <stdlib.h>
#include <string.h>
#include "master_aes_object.h"

int main(){
    char sendBuf[32] = {0};
    unsigned char result[32] = {0};
    strcpy(sendBuf, (char*)"12345678901234567890aabbcc");
    int length = strlen(sendBuf);
    CreateAES();
    printf("%10s : %s\n", "source", sendBuf);
    EncData((unsigned char *)sendBuf, result, strlen(sendBuf));
    printf("%10s : ", "encode");
    for(int i=0; i<length; i++){
        printf("%02x ", (unsigned char)result[i]);
        if((i+1)%10==0)
            printf("\n%10s : ", "");
    }
    printf("\n");
    memcpy(sendBuf, result, length);

    memset(result, 0, sizeof(result));

    //CreateAES();
    EncData((unsigned char *)sendBuf, result, strlen(sendBuf));
    printf("%10s : %s\n", "decode", (char*)result);

    return 0;
}

运行程序:

$ ./a.out 
    source : 12345678901234567890aabbcc
    encode : 35 52 ca 67 1b 18 c9 a6 7a 08 
           : 43 5e 65 13 cf 9d 7b 27 20 94 
           : 04 ac 8e 07 b0 ec 
    decode : 12345678901234567890aabbcc

关于AES中使用接口的一些注意事项以及说明:

// 创建AES对象
//   注意   创建后密钥为空,必需设置密钥
//   返回   AES对象指针,如果为NULL表明创建失败
//   参数
AES *AES_New(void);


// 释放AES对象
//   返回
//   参数   aes -- AES对象指针
void AES_Free(AES *aes);


// 设置工作模式
//   注意   创建后默认工作模式为CTR模式
//          如果使用ECB或CBC模式,加密和解密时所有数据长度必须是AES_BLOCK_SIZE的整数倍 !!!
//   返回   <0 失败; =0 成功
//   参数   aes  -- AES对象指针
//          mode -- AES工作模式
int  AES_SetMode(AES *aes, const int mode);


// 设置密钥
//   返回   <0 失败; =0 成功
//   参数   aes     -- AES对象指针
//          userKey -- AES密钥指针
//          bits    -- AES密钥位数,必须是128、192、或256位
int  AES_SetKey(AES *aes, const unsigned char *userKey, const int bits);


// 设置加密初始向量
//   返回   
//   参数   aes     -- AES对象指针
//          initvec -- AES初始向量
void AES_SetEncInitVec(AES *aes, const unsigned char *initvec);


// 设置解密初始向量
//   返回   
//   参数   aes     -- AES对象指针
//          initvec -- AES初始向量
void AES_SetDecInitVec(AES *aes, const unsigned char *initvec);


// 数据加密
//   注意   加密后的数据与原始数据长度相同,因此输出的加密数据缓冲区长度必须保证 >= length
//   返回   <0 失败; =0 成功
//   参数   aes    -- AES对象指针
//          inbuf  -- 输入的原始数据缓冲区指针
//          outbuf -- 输出的加密数据缓冲区指针,可以与inbuf相同
//          length -- 输入的原始数据长度(字节)
int  AES_DataEncrypt(AES *aes, const unsigned char *inbuf, unsigned char *outbuf, int length);


// 数据解密
//   注意   解密后的数据与加密数据长度相同,因此输出的解密数据缓冲区长度必须保证 >= length
//   返回   <0 失败; =0 成功
//   参数   aes    -- AES对象指针
//          inbuf  -- 输入的加密数据缓冲区指针
//          outbuf -- 输出的解密数据缓冲区指针,可以与inbuf相同
//          length -- 输入的加密数据长度(字节)
int  AES_DataDecrypt(AES *aes, const unsigned char *inbuf, unsigned char *outbuf, int length);

那么这种加密属于什么样的加密方式
是的 对称加密 也称为单密钥加密

所谓对称,就是采用这种加密方法的双方使用同样的密钥进行加密和解密

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。
如果一方的秘钥被泄露,那么加密信息也就不安全了

点击查看工程源码以及实例程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值