通用的AES加密算法都属于Block Cipher类,采用分块加密方式,每个数据块固定为16字节(128位)
以AES-128算法为例, 该算法秘钥长度16字节(128位)
AESctx.mKeySize = 16;
甲乙双方约定一种双方都支持的加密算法(AES),约定数据块之间的串联模式(CBC/CFB/OFB/ECB等)
开始发送密文数据之前,甲乙预先生成16字节会话秘钥 uint8_t key[16]
甲方将若干字节原始数据分为n个块, 每个块为固定长度16字节, 若最后一个块不满16字节需要按约定补齐16字节
再选择16字节随机数uint8_t ivec[16](选择随机数的目的是抵抗统计分析攻击)
n*16字节明文加密后输出n*16字节密文
将全部密文一次性发送给乙方,将16字节随机数也发送给乙方
乙方收到n*16字节密文,以及固定16字节明文随机数
乙方检查当前日期和时钟,秘钥是否仍在有效期内,有没有超过最大允许收发字节数(会话秘钥有效期可以是若干小时,也可以是若干个数据帧或最大收发字节数。加密算法强度越低,有效期相应缩短。)
解密得到n个数据块
删除最后一个数据块为补齐16字节而添加的1~16个字符
乙方将原始数据拼接成完整的
乙方需要应答报文时,执行步骤3,选择新的随机数,生成新的密文,反向发送给甲方。甲方执行步骤4解析乙方发来的密文。
甲方加密函数调用步骤
AES_ECB_Encrypt_Init(初始化上下文结构体, 秘钥值, 甲方选择随机数或NULL);
AES_ECB_Encrypt_Append(输入数据块1, 输出数据块1);
AES_ECB_Encrypt_Append(输入数据块2, 输出数据块2);
AES_ECB_Encrypt_Append(输入数据块n, 输出数据块n);
AES_ECB_Encrypt_Finish(输出末尾padding以补全16字节);
UartSend(16字节的ivec随机数组)
UartSend(输出数据块1, 输出数据块2, ..., 输出数据块n, padding)
乙方解密函数调用步骤
UartReceive(16字节随机数)
AES_ECB_Decrypt_Init(初始化上下文结构体, 秘钥值, 16字节随机数或NULL);
UartReceive(密文数据块1)
AES_ECB_Decrypt_Append(密文数据块1, 输出数据块1);
UartReceive(密文数据块2)
AES_ECB_Decrypt_Append(密文数据块2, 输出数据块2);
UartReceive(密文数据块n)
AES_ECB_Decrypt_Append(密文数据块n, 输出数据块n);
AES_ECB_Decrypt_Finish(输出去掉padding);
乙方得到明文: 数据块1+数据块2, ..., +数据块n