参数定义
加密架构图
-
整个过程是在处理320bits的数据,所以在最开始需要对原始的数据进行一个初始化,获得320bits的数据块,
图里看到的pa和pb都是在做置换(对320bits的数据进行一个置换) -
置换(Permutation)在加密和解密算法中是一种常用的操作,它指的是对序列中的元素重新排列,使得原来的元素顺序发生变化。在加解密中,置换操作通常用于将明文或密文中的字符或比特重新排列,使得原始信息变得难以阅读或理解。
置换操作在加密和解密中通常具有以下特点:- 置换操作是不可逆的,即对序列进行置换后,无法通过置换操作还原原始序列。
- 置换操作可能会影响信息的长度和复杂性,使得原始信息变得难以阅读或理解。
- 置换操作可能会增加加密和解密算法的复杂性,使得攻击者更难以破解加密算法。
-
在加解密中,置换操作通常由一个置换矩阵表示。例如,在密码学中,有一个著名的置换加密算法叫做培根密码(Bacon’s Cipher),它使用一个特殊的置换矩阵来加密和解密信息。在这个算法中,置换矩阵如下所示:
A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] B = [0, 5, 6, 7, 8, 9, 1, 2, 3, 4]
-
对于一些运算符号如下约定
-
加解密伪代码实现
前置知识
- Ascon算法,整个加密解密过程实际上是在处理320bits的数据,通过a轮置换和b轮置换进行320bits的内容(简称S),S被分为两个部分,一个是外在部分Sr (r bits),内在部分Sc(c bits),其中r+c =320bits,在文档中r 代表rate,c代表capacity,应该是和算法的速度性能相关。
- 320bits长度的S被分为5个64bits
流程详解
-
初始化
320bits的数据是如何生成的?- 第一步:构建IV初始向量
IV=k||r||a||b||补0,此处的k是密钥的长度,r是rate段的长度,初始轮和最终轮数a和b的大小,以及中间轮数b大小(都是8bit 的int型数据),最后补0,个数为160-k
- 第二步:得到S,这个时候S就是320bits长
S = IV ||密钥K||随机数N
- 第三步:处理S
经过a轮的p置换后,和密钥K进行异或(此时密钥k不足320bits,需要补0凑320bits)
- 初始化结束,注明:初始化阶段,没有处理AD和plaintext,是把Key,Nonce,以及一些长度、轮数的数值用来生成初始的S块(320bits)
- 第一步:构建IV初始向量
-
处理相关数据
- 如果存在关联数据AD(前面说过,AD的数据长度是没有要求的,如果AD数据长度很大,就需要进行切割处理)
- Ascon处理关联数据,是把它分为r bits一块(block),一共有s块
如果AD的位数不足r bits或者不是r bits的倍数,需要填充1||0…0
之后,执行s次:从A1到As
将每一块Ai,都和S里的前r位数据进行异或,异或之后和Sc拼接成320bits数据,进行b轮permutation - 此处的permutation执行了b*s次
如果不存在 s=0 ,暂不处理 - 最后统一处理:
S和 0…01进行异或(319个0)
-
处理明文过程—两个过程,填充分块和加密
- 因为plaintext的长度是任意的,所以可能位数不满足r bits,或者不是r bits的倍数,所以需要填充1||0…0
- 然后将plaintext分为t个block,每个block占r bits(注意:这个地方如果为了满足r bits的倍数进行填充,之后的密文位数就和明文不一致了,所以关于最后一个明文块会进行一个特殊的处理)
- 从第一个block开始处理一直到第t个(这个地方和处理关联数据的方式很相似)
比如:第i个Block的处理: - 首先获取Blocki 对应的密文,将Blocki与此时的Sr(也就是此时320bits大数据块的前r位)进行异或,获得密文块Ci
- 再进行置换运算P(Ci||Sc),进行b轮,得到一个新的S
进行下一个Block的处理…
- 最后一个Block不进行置换处理,直接获取密文Ct后,将最后一个密文块 Ct 截断为未填充的最后一个明文块片段的长度,使其长度在 0 和 r - 1 位之间,密文 C 的总长度与原始明文 P 的总长度完全相同。
-
解码对应过程
- 在除最后一次迭代之外的每次迭代中,明文块Pi都是通过用内部状态的第一个r位Sr来表示密文块Ci来计算的。然后,将内部状态的第一个位位Sr替换为Ci。最后,对于除最后一个密文块外的每个密文块,内部状态由b轮排列pb进行置换
- 对于最后一个具有0≤`<r位的截断密文块˜Ct,过程不同
- 在除最后一次迭代之外的每次迭代中,明文块Pi都是通过用内部状态的第一个r位Sr来表示密文块Ci来计算的。然后,将内部状态的第一个位位Sr替换为Ci。最后,对于除最后一个密文块外的每个密文块,内部状态由b轮排列pb进行置换
-
结尾处理
- 最后的收尾工作,会生成一个128bits的tag,用于解密时做验证
- 解密模式下,如果计算的tag错误,则不会返回明文,仅返回错误标记⊥
- 在最终确定的过程中,密钥K被转换到内部状态,并通过使用一轮的排列pa进行状态转换。标记T由状态的最后一个(最不重要的)128位和键K的最后128位组成
- 加密算法返回标签T和密文C1k…k˜Ct。解密算法只有当计算出的标记值与接收到的标记值匹配时,才返回明文P1 k … k˜Pt。
-
置换处理
- Ascon的重要组成部分就是这个320bits的置换,该置换迭代的应用了基于SPN结构的轮变换(round transformation),置换可以分为3步,Pc->Ps->PL,其实这个过程把混淆和扩散都做了。(不是像AES里简单的p盒置换)
- 之前算法结构图里提到的Pa和Pb,其实只是轮数的不同,一个是a轮,一个是b轮,实际permutation结构上是一样的,并且a,b是一个可以调整的参数。
置换步骤
1)先把320bits划分为5个
2)X2异或一个常数Cr—Cr取值如下
3)按5bit位单位做替换
4)分别对x0/x1/x2/x3/x4进行移位、异或
-
扩散和混淆
Diffusion 扩散
P盒的作用是扩散(Diffusion),目的是让明文和密钥的影响迅速扩散到整个密文中。即1位的明文或密钥的改变会影响到密文的多个比特。
Confusion 混淆
我们常说的S盒的作用是混淆(Confusion),主要增加密钥和密文之间的复杂度(包括非线性度等)。
混淆能够很好的隐藏密文和密钥的关系,一比特密钥的改变,密文会受到很大程度变动
博客参考了这篇大佬的作品