AES算法实现、代码

本文详细介绍了AES加密标准,包括其起源、基本结构和工作流程。AES使用128位分组,通过字节代换、行位移、列混合和轮密钥加等步骤进行加密和解密。文章还探讨了密钥扩充过程,以及AES加密和解密函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AES简介

1、高级加密标准(AES,Advanced Encryption Standard)作为传统对称加密标准DES的替代者,美国国家标准与技术研究所(NIST)于1997年提出征集该算法的公告。
2、1999年3月22日,NIST从15个候选算法中选出 5个算法进入下一轮。在2000年10月2日,以
安全性、性能、大小、实现特点等标准而最
终选定由比利时人的开发的Rijndael算法,
并于2001年正式发布AES标准。

流程图

在这里插入图片描述

AES的基本结构(准备阶段)

  • 典型的SPN(代换–置换网络)结构
  • AES又是分组密码,具体过程:将明文分为长度相等的组 (长度固定为128位,即每组16字节),每组逐次加密直到加密完整个明文。
  • 密钥长度位下列三种:
    在这里插入图片描述
  • AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为:

P=P0P1…P15
K=K0K1…K15

  1. 明文分组用以字节为单位的正方形矩阵描述,称为状态矩阵。(规则:矩阵中字节的排列为从上到下、从左到右依次排 列,矩阵的每一列被称为1个32比特字
    在这里插入图片描述

整体流程

在这里插入图片描述

密钥扩充(加密前奏)

将密钥扩充,需要得到四十个新列,分组得到轮密钥。
在这里插入图片描述
CASE1:当W[i]中i为4的整数倍时,需要用T函数进行变换W[i-1],然后用W[i-1]与W[i-4]进行异或,最后得出W[i]
(Ps:T函数由3部分组成:字循环、字节代换和轮常量异或,这三个过程时T函数变换的充分必要条件)
CASE2:当
W[i]中i不是4的整数倍时,只需要将W[i-1]与W[i-4]进行异或,最后得出W[i]
重复相同的流程所处所有的W

核心流程

轮函数示意图

在这里插入图片描述

  • 字节代换(SubBytes 非线性)
    定义了S盒:(S盒是由16*16的字节组成的矩阵,S盒不可逆)
    +-
    我们通过S盒将明文分组中的元素逐个进行替换。
    例如: 明文分组为:
    在这里插入图片描述
    第一个元素19,在S盒中寻找第1行第9列的元素即可,按照上述S盒找出为 2D 。

  • 行移位 (ShiftRows 线性)为密码系统提供了扩展性
    是一个简单的左循环位移操作。
    规则 : 第n行就位移n字节
    例如:
    位移前
    在这里插入图片描述
    位移后
    在这里插入图片描述

  • 列混合 (MixColumns 非线性)为密码系统提供了扩展性
    简单的矩阵相乘操作
    将以下状态矩阵按列与固定矩阵相乘
    在这里插入图片描述
    在这里插入图片描述
    得到相乘的结果换到原来的列位置上
    在这里插入图片描述
    然后逐列依次进行

  • 轮密钥加
    我们将密钥扩展得到的轮密钥与我们的明文分组矩阵进行逐列的异或操作,将得到结果替换
    在这里插入图片描述
    替换之后
    在这里插入图片描述
    之后便进行流程的循环,不同的AES-n位循环的次数都不同,最终得到密文
    在这里插入图片描述

  • 所有轮数的流程图
    在这里插入图片描述

AES算法的实现

密钥扩展

//密钥对应的扩展数组
static int w[44];

/**
 * 扩展密钥,结果是把w[44]中的每个元素初始化
 */
static void extendKey(char *key) {
   
    for(int i = 0; i < 4; i++)
        w[i] = getWordFromStr(key + i * 4); 

    for(int i = 4, j = 0; i < 44; i++) {
   
        if( i % 4 == 0) {
   
            w[i] = w[i - 4] ^ T(w[i - 1], j); 
            j++;//下一轮
        }else {
   
            w[i] = w[i - 4] ^ w[i - 1]; 
        }
    }   

}

/**
 * 常量轮值表
 */
static const int Rcon[10] = {
    0x01000000, 0x02000000,
    0x04000000, 0x08000000,
    0x10000000, 0x20000000,
    0x40000000, 0x80000000,
    0x1b000000, 0x36000000 };
/**
 * 密钥扩展中的T函数
 */
static int T(int num, int round) {
   
    int numArray[4];
    splitIntToArray(num, numArray);
    leftLoop4int(numArray, 1);//字循环

    //字节代换
    for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值