📄 上01空间--c,c++,vb,delphi,java,asp,jsp,php,多媒体,数据库,信息安全,底层开发等技术资料.htm
字号:
Standard)的建议,作为一种取代DES的二十世纪加密标准技术。其目标是:(1)执行速度快;(2)易于设计;(3)从大型计算机到智能IC卡(CPU卡)都可实现。1998年8月第一次AES会议(AES1)上,宣布了来自12个国家的15种候选AES算法。于1999年8月第二次AES会议(ARD2)上,从中筛选出5个候选算法:<BR><BR>Algorithm
Author(s)<BR>(1) MARS IBM (US)<BR>(2) RC6 RSA
Laboratories(US)<BR>(3) Rijndael John Danemen,Vincent
Rijmen(Belgium)<BR>(4) Serpent Ross Anderson(UK),Eli
Bihan(Israel),Lars Knudsen(Nornay)<BR>(5) Twofish Bruce
Schneier,John Kelsey,Doug Whiting,David Wagner,Chris Hall,Nids
Ferguson<BR><BR>经过大量的分析及评估后,NIST队伍最终选择了Rijndael。这是在考虑安全,性能,效率,易用和灵活等诸多方面做的一种权衡选择,正如NIST在其报告中称:"所有这五种算法对AES都很安全".本文将介绍一下由IBM公司提出的MARS算法的原理和部分笔者编写的算法实现代码.<BR><BR><B>二、算法原理</B><BR><BR>密钥增加作为预白化处理,经8轮无密钥的向前混合,8轮有密钥的向前变换,8轮有密钥的向后变换,8轮无密钥的向后混合,以及作为后白化处理的密钥减法。16轮有密钥的转换称为密码核(cryptographic
core),无密钥的迭代使用两个8x32 bit
S-boxes、加、异或操作。此外,有密钥的迭代使用32-bit密钥乘法、数据相倚旋转和密钥加法。混合与核心迭代都被修改为Feistel结构的迭代,其中,1/4的数据块用于标识其它3/4的数据块。
<BR>约定:<BR>D[]
:存放4个32位明文的容器,在加密操作完成后用于存放密文<BR>K[]:存放40个32位密钥的容器<BR>S[]:s-box,512个32位的不同数组成,其中前256个由S0指出,后256个由S1指出<BR>所有的数组下标从0开始计数.<BR>本文中提及的加法是模232加,减法是模232减,乘法是模232乘<BR><<<表示循环左移<BR>^
表示按位异或<BR>%取模
<BR><B><BR>2.1密钥的生成</B><BR>MARS算法支持128~448位变长密钥,定义一个临时容器ULONG32
T[15]用于存放用户输入的密钥,<BR>T[0,1…n] = K[0,1…n]<BR>T[n] = n
;<BR>T[n+1,…14] = 0
;<BR>其中n是用户输入密钥的长度(4字节为单位).<BR>然后按照下面的算法进行操作:<BR></P><PRE>for ( j = 0 ; j < 4 ; j++)
{
for ( i = 0; i < 15 ;i++)
{
/*T[i] ^= ((T[(i-7)%15]^T[(i-2)%15])<<<3)^(4*i+j);*/
}
for ( r = 0 ; r < 4 ; r++)
{
for ( i = 0; i < 15 ;i++)
{
/*T[i] = T[i]+ S[low 9 bits of T[(i-1)%15]])<<<9;*/
}
}
for ( i = 0 ; i < 10 ; i++)
{
/*T[10*j+i] = T[4*i%15];*/
}
</PRE>最后我们需要修正那些在E-Fun操作中用作乘数的密钥也就是子密钥数组中的K[5],K[7],K[9],…K[35],要求他们的二进制表示形式中没有连续10个以上(含10个)的0或1.<BR>需要修正的密钥为K[i]
= K<FONT size=2>0</FONT>K<FONT size=2>1</FONT>K<FONT
size=2>2</FONT>…K<FONT size=2>30</FONT>K<FONT
size=2>31</FONT><BR>保留K[i]的最低两位的值 n =
K[i]&0x3,<BR>把K[i]的最低两位置1 w = K[i] | 0x3
,<BR>产生掩码M:<BR>最低两位置1后的K的二进制表示中如果含有10以上连续的0或1,那么将这些连续位置1,其他的位置0,然后把最低的两位和最高位置0,最后把连续位(1或0单独算)的起始位和中止位置0.<BR>例如:<BR><IMG
height=38
src="01空间--C,C++,VB,Delphi,Java,ASP,JSP,PHP,多媒体,数据库,信息安全,底层开发等技术资料.files/mars1.gif"
width=248>
<BR>产生掩码后,我们利用n值作为s-box的索引取得一个替代值,这个s-box含有4个32位的元素,每个元素的二进制表示不含7个(含7个)连续的1或0,MARA算法推荐的s-box为<BR>ULONG32
B[4] = { 0xa4a8d57b , 0x5b5d193b , 0xc8a8309b , 0x73f9a978
}<BR>然后利用如下算式得出K[i]:
<P>K[i] = w ^ (( B[n] <<< ( low 5 bits of K[i-1])
& M)<BR></P><B>2.2明文加密 </B>
<P><B>2.2.1
第一步前向混合</B><BR>输入的128位明文分成四块D[0],D[1],D[2],D[3],选取生成的40个密钥的前四个分别与上述四块数据进行加操作<BR>D[0]
+= K[0];<BR>D[1] += K[1];<BR>D[2] += K[2];<BR>D[3] +=
K[3];<BR>结果作为第一轮操作的输入数据.<BR>第一轮:<BR></P>
<TABLE cellSpacing=1 cellPadding=0 width=548 bgColor=#000000
border=0>
<TBODY>
<TR align=middle bgColor=#ffffff>
<TD colSpan=4>D[0]</TD>
<TD width=132>D[1]</TD>
<TD width=140>D[2]</TD>
<TD width=141>D[3]</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD width=34>b0</TD>
<TD width=29>b1</TD>
<TD width=36>b2</TD>
<TD width=36>b3</TD>
<TD width=132>FirstTarget</TD>
<TD width=140>SecondTarget</TD>
<TD
width=141>ThirdTarget</TD></TR></TBODY></TABLE><BR>输入的四块数据D[0],D[1],D[2],D[3],其中D[0]作为源数据(Source),剩下的3个作为目标数据,把32位的源数据D[0]分成8位的四块b0,b1,b2,b3<BR>b0和b2作为数组下标从S0中寻找s-box替换数:S0[b0],S0[b2]<BR>b1和b3作为数组下标从S1中寻找s-box替换数:S1[b1],S1[b3]<BR>对FirstTarget的操作:<BR>FirstTarget按位异或S0[b0]后的加上S1[b1]的结果返回给FirstTarget<BR>对SecondTarget的操作:<BR>SecondTarget加上S0[b2]的结果返回给SecondTarget<BR>对ThirdTarget的操作:<BR>ThirdTarget按位异或S1[b3]的结果返回给ThirdTarget.<BR>对Source的操作:<BR>Source循环右移24位后的结果返回给Source.<BR>把D[0],D[1],D[2],D[3]合并成128位的数据,循环左移32位后作为下一轮的输入.<BR>下图显示了移位前后的对比.<BR>
<TABLE cellSpacing=1 cellPadding=0 width=554 bgColor=#000000
border=0>
<TBODY>
<TR align=middle bgColor=#ffffff>
<TD width=51> </TD>
<TD width=27>b0</TD>
<TD width=29>b1</TD>
<TD width=31>b2</TD>
<TD width=34>b3</TD>
<TD width=132>FirstTarget</TD>
<TD width=112>SecondTarget</TD>
<TD width=129>ThirdTarget</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD width=51>移动前</TD>
<TD colSpan=4>D[0]</TD>
<TD width=132>D[1]</TD>
<TD width=112>D[2]</TD>
<TD width=129>D[3]</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD width=51>移动后</TD>
<TD colSpan=4>D[1]</TD>
<TD width=132>D[2]</TD>
<TD width=112>D[3]</TD>
<TD width=129>D[0]</TD></TR></TBODY></TABLE>
<P>这样本轮的Source变成了下一轮的ThirdTarget<BR>本轮的FirstTarget成了下一轮的Source<BR>本轮的SecondTarget成了下一轮的FirstTarget<BR>本轮的ThirdTarget成了下一轮的SecondTarget<BR>本步骤共进行8轮,在第一轮和第五轮中对Source作循环右移24位操作前先作Source加上ThirdTarget的结果然后返回给Source的操作.在第二轮和第六轮中对Source作循环右移24位操作前先作Source加上FirstTarget的结果然后返回给Source的操作.<BR><BR><B>2.2.2第二步密码核</B><BR>把输入的128位数据分成四块D[0],D[1],D[2],D[3]
,其中D[0]作为源数据(Source),剩下的3个作为目标数据<BR></P>
<TABLE cellSpacing=1 cellPadding=0 width=400 bgColor=#000000
border=0>
<TBODY>
<TR align=middle bgColor=#ffffff>
<TD>D[0]</TD>
<TD>D[1]</TD>
<TD>D[2]</TD>
<TD>D[3]</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD>Source</TD>
<TD>FirstTarget</TD>
<TD>SecondTarget</TD>
<TD>ThirdTarget</TD></TR></TBODY></TABLE><BR>该步骤中有一个称为E-Fun(见下一节)的操作,把Source和对应两个子密钥(从第5个子密钥开始递增,本轮的输入子密钥K[4],K[5]下一轮的子密钥就是K[6],K[7])作为参数输入,返回三个操作输出L,M,R,然后把这三个输出结果和三个目标数进行加法或异或操作,然后把Source循环左移13位,合并D[0],D[1],D[2],D[3]形成128位数据,循环左移32位后作为下一轮的输入.<BR>本步骤共进行16轮,假定E-Fun的第一个输出数为L,第二个输出数为M,第三个输出数为R<BR>前8轮中,<BR>FirstTarget
和
L相加的结果返回给FirstTarget<BR>SecondTarge和M相加的结果返回给SecondTarget<BR>ThirdTarget和R按位异或的结果返回给ThirdTarget<BR>后8轮中:<BR>FirstTarget
和
R按位异或的结果返回给FirstTarget<BR>SecondTarge和M相加的结果返回给SecondTarget<BR>ThirdTarget和L相加的结果返回给ThirdTarget<BR>
<P><B>2.2.3
E-Fun操作</B><BR>该操作利用输入的"种子"数据-D,和两个加密子密钥K1和K2生成3个输出数据.<BR>定义三个临时变量L,M,R<BR>◆
把D(输入的种子数据)循环右移13位后的结果赋给R <BR>◆ 把D和K1加操作的结果赋给M<BR>◆
取M的低9位作为s-box的索引找到替代数赋给L<BR>◆ 把R和K2乘操作的结果作循环左移5位后的值返回给R<BR>◆
把L和R按位异或的结果返回给L<BR>◆ 取R的低五位的值,把M循环左移这个值后的结果返回给M<BR>◆
把R循环左移5位后的结果返回给R<BR>◆ 把L和R按位异或的结果返回给L<BR>◆
取R的低五位的值,把L循环左移这个值后的结果返回给L<BR>把L,M,R作为E-Fun操作的第一,第二,第三输出数返回.<BR><BR><B>2.2.4
第三步后向混合</B><BR>把输入的128位数据分成四块D[0],D[1],D[2],D[3]第一轮:<BR></P>
<TABLE cellSpacing=1 cellPadding=0 width=400 bgColor=#000000
border=0>
<TBODY>
<TR align=middle bgColor=#ffffff>
<TD colSpan=4>D[0]</TD>
<TD>D[1]</TD>
<TD>D[2]</TD>
<TD>D[3]</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD>b0</TD>
<TD>b1</TD>
<TD>b2</TD>
<TD>b3</TD>
<TD>FirstTarget</TD>
<TD>SecondTarget</TD>
<TD>ThirdTarget</TD></TR></TBODY></TABLE>
<P>输入的四块数据D[0],D[1],D[2],D[3],其中D[0]作为源数据(Source),剩下的3个作为目标数据,把32位的源数据D[0]分成8位的四块b0,b1,b2,b3<BR>b0和b2作为数组下标从S1中寻找s-box替换数:S1[b0],S1[b2]<BR>b1和b3作为数组下标从S0中寻找s-box替换数:S0[b1],S0[b3]<BR>对FirstTarget的操作:<BR>FirstTarget按位异或S1[b0]后的结果返回给FirstTarget<BR>对SecondTarget的操作:<BR>SecondTarget减去S0[b3]的结果返回给SecondTarget<BR>对ThirdTarget的操作:<BR>ThirdTarget减去S1[b2]后与S0[b1]按位异或的结果返回给ThirdTarget.<BR>对Source的操作:<BR>Source循环左移24位后的结果返回给Source.<BR>把D[0],D[1],D[2],D[3]合并成128位的数据,循环左移32位后作为下一轮的输入.<BR>下图显示了移位前后的对比.<BR></P>
<TABLE cellSpacing=1 cellPadding=0 width=554 bgColor=#000000
border=0>
<TBODY>
<TR align=middle bgColor=#ffffff>
<TD width=51> </TD>
<TD width=27>b0</TD>
<TD width=29>b1</TD>
<TD width=31>b2</TD>
<TD width=34>b3</TD>
<TD width=132>FirstTarget</TD>
<TD width=112>SecondTarget</TD>
<TD width=129>ThirdTarget</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD width=51>移动前</TD>
<TD colSpan=4>D[0]</TD>
<TD width=132>D[1]</TD>
<TD width=112>D[2]</TD>
<TD width=129>D[3]</TD></TR>
<TR align=middle bgColor=#ffffff>
<TD width=51>移动后</TD>
<TD colSpan=4>D[1]</TD>
<TD width=132>D[2]</TD>
<TD width=112>D[3]</TD>
<TD
width=129>D[0]</TD></TR></TBODY></TABLE><BR>这样本轮的Source变成了下一轮的ThirdTarget<BR>本轮的FirstTarget成了下一轮的Source<BR>本轮的SecondTarget成了下一轮的FirstTarget<BR>本轮的ThirdTarget成了下一轮的SecondTarget<BR>本步骤共进行8轮,在第3轮和第7轮进行任何操作前先作Source减去ThirdTarget的结果然后返回给Source的操作.
在第4轮和第8轮进行任何操作前先作Source减去FirstTarget的结果然后返回给Source的操作.<BR><BR><B>2.2.5
密文的输出</B><BR>进行完上述的操作后,对生成的密文D[0],D[1],D[2],D[3]与对应的最后4个子密钥进行减法操作形成最终的密文.<BR>D[0]
-= K[36]; D[1] -= K[37];<BR>D[2] -= K[38]; D[3] -=
K[39];<BR><BR></TD></TR>
<TR>
<TD>
<DIV align=right><A
href="http://www.01study.coms/">01空间</A>收集</DIV></TD></TR>
<TR>
<TD>·没有评论 </TD></TR>
<TR>
<TD>
<FORM name=RemarkForm action=saveremark.asp method=post><INPUT
type=hidden value=1020 name=fileid>
<TABLE width="100%">
<TBODY>
<TR>
<TD><B>用户名:</B><INPUT class=stedit maxLength=20 size=15
name=username> <B>密码:</B><INPUT class=stedit
type=password maxLength=20 size=15 name=password> </TD></TR>
<TR>
<TD><TEXTAREA style="WIDTH: 100%" name=Content rows=7 cols=50></TEXTAREA>
</TD></TR>
<TR>
<TD align=middle><INPUT class=stedit type=submit value=发表评论 name=Submit target="_blank">
</TD></TR></TBODY></TABLE></FORM>版权说明:<BR>1.本站资料文章均来源于Internet,<FONT
color=#ff0000>所有资料任何人不得作为商业用途</FONT>,仅供学习之用.<BR>2.Inter网资料多次转载,可能丢失或搞错出处,<A
href="mailto:webmaster@01study.com">如有问题请联系我们!<BR></A>3.本文版权归原作者或源出处,<FONT
color=#ff0000>如本贴侵犯您的版权,<A
href="mailto:webmaster@01study.com">请联系我们</A>,我们会在第一时间拿下</FONT>。</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<HR width=800 color=#cccccc noShade SIZE=1>
</TD></TR>
<TR>
<TD>
<DIV align=center>零一空间 版权所有 欢迎署名转载<BR>Copyright © 01study.com All rights
reserved </DIV></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -