twofish密码算法

1 基本信息

输入:算法输入128bit明文[QX1] 或者密文,密钥长度支持128、192、256,两个表格[QX2] ;应用输入长度不限。

结构:Feistel结构[QX3] 

填充:算法无规定明文填充方式,可由用户自行协商[QX4] ;密钥长度采用0填充

核心计算过程:初始白话、轮函数、输出白话、密钥生成

特点:加解密过程除了子密钥使用顺序相反,其他完全一样[QX5] 

输出:算法输出128bit密文[QX6] ;应用长度输出为64bit的倍数

操作模式:CBC、ECB、CTR、OFB等

轮数:16轮

2 加密过程:

 

2.1数据分组和补位

输入:不限制用于应用程序的输出长度,但每个分组明文为128bit。密钥长度可以是128、192、256中的一种。

当明文分组长度不符合分组要求时,可采用用户约定的填充算法,具体填充规则可参照DES那个文档。当密钥长度不符合要求时,填充0,直到最先满足要求时就不再填充,比如未填充时密钥长度为150bit,则填充0至密钥长度为192而不是256.

2.2数据处理

2.2.1 h函数介绍

       为了理解密码算法的整个操作流程,这里先介绍密码算法中用到的h函数。

h函数输入为X与Li,均为32bit,输出Z也为32bit。从上图中也可以看到,h函数的操作与k相关(k=密钥长度/64)。q1和q0是置换操作。将输入的32位字分为4个Byte,每个Byte单独做置换之后,与输入Li进行异或,经过多轮这样的计算,得到一个4*1的列向量,这个向量与定义在GF(2^8)上的4*4MDS矩阵相乘,得到4*1的列向量。最后将这个列向量中的四个元素组成32-bit数据Z,用到的本原多项式为:

       MDS矩阵为:

       H函数的操作可以描述为:

 

 

由于q0和q1都是固定的,所以只要输入X和L就可以得到输出值Z,即Z=h(X,L)。在twofish算法中Li是根据密钥得到的,在整个计算过程中不再发生变化,所以可以根据h函数建立一个表格,根据输入X,查表就可以得到输出Z的变化,这也是进行代码实现的思路。

2.2.2 置换

       在上面h函数的介绍过程中,提到了两个置换q0和q1,可以将这两个操作理解为两个S盒,用8bit输入得到8bit输出。下面介绍S盒的设计原理,q0和q1都是采用如下方法构造:

 

x 为输入,y为输出。a0和b0其实是将输入分为高4位与低4位,经过中间结果变换再重新组合成8位数据。这里边用到了t0和t1两个置换。构造q0所用的置换为:

 

构造q1所用的置换为:

 

由于操作固定,可以为构造过程建立一个映射表,这就是s盒,一共有两个s盒。

q0的S盒为:

 

q1用到的S盒为:

比如对于q0置换,当输入x=0时,输出y=0xa9。

 

2.2.3密钥扩展操作

密钥扩展框图如下(以密钥长度为128bit举例):

 

上面说明白了h函数就可以理解密钥生成操作了.一共需要40个轮子密钥K,都是利用原始密钥生成的。生成过程如下;

里边有Me(even)和Mo(odd)两个变量还未说明,它的产生过程是:

    令N=128(192、256)是密钥长度,k=N/64,原始密钥由8k个字节m0、m1、m2、…m8k-1组成。Mi=(m4i,m4i+1,m4i+2,m4i+3)(i=0,1,2…2k-1),Me=(M0,M2,…M2k-2),Mo=(M1,M3…M2k-1)。其实就是将原始密钥分为奇偶字

对于2iρ这个操作(0<=i<20),2i是一个Byte,乘以ρ是将Byte扩展为字,字中的每个Byte都是相等的,均为2i。经过上面的操作就得到了两个密钥,重复20次就得到所有密钥。

2.2.4输入白化(input whitening)

这个操作比较简单,将明文分为4个字,然后分别与K0、K1、K2、K3进行异或操作。进行白化操作,用于增加增针对密码剩余部分的密钥搜索攻击的难度。

2.2.5轮函数

轮函数整体框图如下:

 

轮函数的内部细节如下:

 

一共需要进行16轮计算。从上图可以看到,轮函数的操作主要由F函数和异或构成构成,整体计算过程用数学形式表示为

 

第一个式子表示,将第r轮输入的第0个字和第一个字进行F运算,得到Fr,0和Fr,1。再进行一些简单的异或、移位操作就得到下一轮的输入。

    F函数是核心运算,它由g和PHT两个操作构成,数学表示为:

前两个式子是g函数,后两个式子是PHT操作。PHT操作比较简单就是做两个模2^32加法,下面介绍g函数,其实g=h(Ri,S),Ri是输入的数据,S是由原始密钥mi生成得到的,生成过程如下:

 

 

其中RS矩阵是:

 

这也是GF(2^8)上的矩阵相乘,用到的本原多项式是:

轮密钥加也是模2^32加法,用到的密钥是生成的密钥。

2.2.6 输出白化

输出白化与输入白化类似,都是进行异或操作。用到的密钥是K4、K5、K6、K7。

这个图里的undo last swap是取消第16轮输出的交换操作,因为算法规定第16轮输出不交换次序,所以这里通过附加一个交换来抵消第16轮交换的影响。 

这个图里的undo last swap是取消第16轮输出的交换操作,因为算法规定第16轮输出不交换次序,所以这里通过附加一个交换来抵消第16轮交换的影响。

3 解密过程:

加解密过程除了子密钥使用顺序相反,其他完全一样。[QX1] 

由上面的解密程序即可印证这一点

4对整个文件加密:

    当文件包含多个分组时,需要选择运行模式,常见的包括ECB、CBC、CFB、OFB、CTR等。这只是对明文或密文分组进行处理,整个过程仍然只用一个密钥。

5 并行性分析

分组间:

分组间的并行性取决于所选择的加密模式。例如,如果选择的是ECB模式,那么分组间不存在数据依赖关系;如果选择的是CBC模式,那么后一分组需要使用前一分组的计算结果,具有直接的数据依赖关系,无法实现分组间并行。

分组内:

分组内不同轮之间具有较强的数据相关性,无法并行;但是轮操作与密钥生成可以实现并行处理,只要满足轮子密钥不影响轮函数的使用即可。

    每一轮前两个输入字在进行g函数操作时可以并行。

 

 

 

 

 

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值