原作者论文请参考《The SKINNY Family of Block Ciphers and Its Low-Latency Variant MANTIS》
地址为:https://link.springer.com/chapter/10.1007/978-3-662-53008-5_5
代码及资源分析等参见:https://sites.google.com/site/skinnycipher/home
SKINNY 和 AES 类似,都是SPN结构的加密算法。
本文中截图多来自上述论文。
一、整体流程

其中包括5个步骤,分别为字节替换、轮加常数、轮加密钥、行移位、列混淆。
SKINNY有一下几种模式:

其中,n为明文长度,有64位和128位两种;对于每种明文,密钥有3种形式n/2n/3n,即64/128位、64/128 * 2位、64/128 * 3位;对应的模式下,分别运行32、36、40...轮。
首先,将明文划分为16份,若明文为64位,则每份半个字节;若为128,每份一个字节。

可变长度的密钥为以下形式,tk = tk0 tk1 ... tk16z-1 ,这里 z = 1, 2, 3。令0≤i≤15,当 z = 1 有TK1i = tki,当 z = 2 有TK1i = tk16+i,当 z = 3 有TK1i = tk32+i。
1. 字节替代(Subbyte)
字长有4bit和8bit两种,分别有对应的SBOX,对于4bit形式,有如下SBOX,

上述4-bit SBOX可以用或非门和异或门实现,如下操作:

对于4-bit和8-bit S盒,有如下结构:

对于8-bit S盒有以下操作,首先,

然后进行位置换,

重复以上步骤4次,但是在最后一次时仅对x1和x2置换。
2. 加常数(AddConstants)
6位的线性反馈移位寄存(LFSR)来产生常数,按以下方式更新:

LFSR的初始值为000000,在进行AddConstants操作前,进行更新。如进行第一轮AddConstants操作前,先进行000000→000001。
然后,


得到矩阵,将此矩阵加到状态矩阵上。

3. 轮密钥加(AddRoundTweakey)
密钥的第一行和第二行和状态矩阵相应的位置异或,对于 i = {0,1} 和 j={0,1,2,3},有以下操作:

然后将密钥按下图更新:

其中,置换函数PT 为:

即(0,...,15)→ (9,15,8,...,5,6,7),其中数字代表密钥矩阵的单元;
4. 行移位(ShiftRows)

矩阵第0行不变,第1行循环右移1个字节,第2行循环右移2个字节,第3行循环右移3个字节,可等效为以下字节置换操作;

5. 列混淆(MixColumns)
M * IS,其中,


若NSi表示更新后的第i行,Si表示更新前的第i行,参考以上形式,有
