发明名称 一种分组密码加解密方法
摘要 本发明提供了一种分组密码加解密方法,属于数据加密解密领域。本发明算法设计了一种对称的加密结构,尤其是本发明的S盒设计能配置加密需要的S变换和解密需要的S逆变换而无需增加额外的电路资源,利于加解密一体的硬件电路实现,比AES加解密一体的电路需要更少的面积资源。本发明算法复杂的S盒构造可以抵抗现有已知的攻击方法。在较少轮数(3轮)加密情况下可以提供很高的加密速度,并且利用相同的加解密硬件可以用同样的速度进行解密。该算法特别适合专用ASIC实现,可以实现加解密专用算法的专用集成电路芯片。也可用于FPGA上的IP核设计。在FPGA上本发明资源消耗少于AES算法,且速度更快。
申请公布号 CN102025484B 申请公布日期 2012.07.04
申请号 CN201010593392.9 申请日期 2010.12.17
申请人 北京航空航天大学 发明人 郑志明;李洪革;丁锦鹏
分类号 H04L9/06(2006.01)I 主分类号 H04L9/06(2006.01)I
代理机构 北京万象新悦知识产权代理事务所(普通合伙) 11360 代理人 贾晓玲
主权项 一种分组密码加密方法,其特征在于,其加密过程如下:步骤1:将128比特的密钥按执行密钥扩展,产生608比特的扩展密钥,将密钥扩展中产生的最后96比特扩展密钥作为加密过程中用的4个S盒的密钥,配置出所述四个S盒,用于下面步骤中的四个S变换,按顺序分别记做S1变换,S2变换,S3变换和S4变换;步骤2:将128位的明文输入分成16组,记为[Z1||Z2||...||Z16],每组8比特;步骤3:将明文与扩展密钥进行异或运算: <mrow> <mo>[</mo> <msup> <mrow> <mi>Z</mi> <mn>1</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>2</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>16</mn> </mrow> <mo>&prime;</mo> </msup> <mo>]</mo> <mo>=</mo> <mo>[</mo> <mi>Z</mi> <mn>1</mn> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>2</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>16</mn> <mo>]</mo> <mo>&CirclePlus;</mo> <mo>[</mo> <mi>K</mi> <mn>1</mn> <mo>|</mo> <mo>|</mo> <mi>K</mi> <mn>2</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>K</mi> <mn>128</mn> <mo>]</mo> </mrow>其中[K1||K2||...||K128]表示128比特初始密钥;步骤4:将加密数据进行S变换:前64比特经过S1变换,后64比特经过S2变换;步骤5:将加密数据的后64位进行线性变换,乘以变换矩阵异或常数,再与前半部分做异或运算生成前64比特数据,后64比特不变; <mrow> <mi>F</mi> <mrow> <mo>(</mo> <mi>Zn</mi> <mo>)</mo> </mrow> <mo>=</mo> <mi>Zn</mi> <mo>*</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>0</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> <mo>&CirclePlus;</mo> <mfenced open='[' close=']'> <mtable> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> <mtr> <mtd> <mn>0</mn> </mtd> </mtr> <mtr> <mtd> <mn>1</mn> </mtd> </mtr> </mtable> </mfenced> </mrow>首先,定义Z1=Z1’,Z2=Z2’,...,Z16=Z16’,然后执行 <mrow> <mo>[</mo> <msup> <mrow> <mi>Z</mi> <mn>1</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>2</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <msup> <mrow> <mi>Z</mi> <mn>8</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>9</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>10</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>16</mn> </mrow> <mo>&prime;</mo> </msup> <mo>]</mo> </mrow> <mrow> <mo>=</mo> <mo>[</mo> <mi>Z</mi> <mn>1</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>9</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>2</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>10</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>8</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>16</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>9</mn> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>10</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>16</mn> <mo>]</mo> </mrow>其中,F为线性变换函数,Zn’为输出位,1≤n≤16;步骤6:进行行列变换,对16组数据进行重新排序:首先,定义Z1=Z1’,Z2=Z2’,...,Z16=Z16’,然后执行[Z1′||Z2′||...||Z16′]=Z15||Z16||Z13||Z14||Z11||Z12||Z9||Z10||Z6||Z5||Z8||Z7||Z2||Z1||Z4||Z3]步骤7:将加密数据的后64位进行线性变换,乘以变换矩阵异或常数,再与前半部分做异或运算生成前64比特数据,后64比特不变:首先,定义Z1=Z1’,Z2=Z2’,...,Z16=Z16’,然后执行 <mrow> <mo>[</mo> <msup> <mrow> <mi>Z</mi> <mn>1</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>2</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <msup> <mrow> <mi>Z</mi> <mn>8</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>9</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>10</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>16</mn> </mrow> <mo>&prime;</mo> </msup> <mo>]</mo> </mrow> <mrow> <mo>=</mo> <mo>[</mo> <mi>Z</mi> <mn>1</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>9</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>2</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>10</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>8</mn> <mo>&CirclePlus;</mo> <mi>F</mi> <mrow> <mo>(</mo> <mi>Z</mi> <mn>16</mn> <mo>)</mo> </mrow> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>9</mn> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>10</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>16</mn> <mo>]</mo> </mrow>步骤8:将加密数据进行S变换,前64比特经过S3变换,后64比特经过S4变换:首先,定义Z1=Z1’,Z2=Z2’,...,Z16=Z16’,然后执行[Z1′||Z2′||...||Z16′]=[S3Z1||S3Z2||...||S3Z8||S4Z9||S4Z10||...||S4Z16]步骤9:将加密数据与扩展密钥进行异或运算,扩展密钥为第N轮密钥,长为128比特:首先,定义Z1=Z1’,Z2=Z2’,...,Z16=Z16’,然后执行 <mrow> <mo>[</mo> <msup> <mrow> <mi>Z</mi> <mn>1</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>2</mn> </mrow> <mo>&prime;</mo> </msup> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <msup> <mrow> <mi>Z</mi> <mn>16</mn> </mrow> <mo>&prime;</mo> </msup> <mo>]</mo> </mrow> <mrow> <mo>=</mo> <mo>[</mo> <mi>Z</mi> <mn>1</mn> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>2</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>Z</mi> <mn>16</mn> <mo>]</mo> <mo>&CirclePlus;</mo> <mo>[</mo> <mi>K</mi> <mn>128</mn> <mo>*</mo> <mi>N</mi> <mo>+</mo> <mn>1</mn> <mo>|</mo> <mo>|</mo> <mi>K</mi> <mn>128</mn> <mo>*</mo> <mi>N</mi> <mo>+</mo> <mn>2</mn> <mo>|</mo> <mo>|</mo> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mo>|</mo> <mo>|</mo> <mi>K</mi> <mn>128</mn> <mo>*</mo> <mi>N</mi> <mo>+</mo> <mn>128</mn> <mo>]</mo> </mrow>步骤10:重复步骤4至步骤9一共3轮,最终产生密文输出。
地址 100191 北京市海淀区学院路37号