你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 计算机安全与维护
分组密码SAFER+的C#实现(五)
 

然后进行32轮迭代,首论迭代从高位m_nRoundsLen-1开始以后依次递减1,直到为0。在第i论迭代中,先将input数组右乘矩阵m_nAntiLinearTransMatrixBox(该矩阵的说明详见参考文献[1]),代码如下:

temp = input[6];

                    input[6] = input[30];

                input[30] = temp;

              ...

                     input[2] = (byte)((input[2] - input[0]) >= 0 ? (input[2] - input[0]) : (input[2] - input[0] + 256));

其实质仍然是一维数组input[]与一个二维数组m_nAntiLinearTransMatrixBox的乘积,那么为什么不用以下更精炼的代码呢?

Byte[] temp = new byte[input.length];

For (j=0;j<16;j++)

  For (k=0;k<16;k++)

    {

      Temp[2*j] +=(byte)(input[2*k] * m_nAntiLinearTransMatrixBox[k,j]);

}

For (j=0;j<16;j++)

{

   Input[2*j] = (byte)temp[2*j];

}

其中:

Static public byte[,] m_nAntiLinearTransMatrixBox = newbyte[16,16]

{

  {2,-2,1,-2,1,-1,4,-8,2,-4,1,-1,1,-2,1,-1},

  {-4,4,-2,4,-2,2,-8,16,-2,4,-1,1,-1,2,-1,1},

  {1,-2,1,-1,2,-4,1,-1,1,-1,1,-2,2,-2,4,-8},

  {-2,4,-2,2,-2,4,-1,1,-1,1,-1,2,-4,4,-8,16},

  {1,-1,2,-4,1,-1,1,-2,1,-2,1,-1,4,-8,2,-2},

  {-1,1,-2,4,-1,1,-1,2,-2,4,-2,2,-8,16,-4,4},

  {2,-4,1,-1,1,-2,1,-1,2,-2,4,-8,1,-1,1,-2},

  {-2,4,-1,1,-1,2,-1,1,-4,4,-8,16,-2,2,-2,4},

  {1,-1,1,-2,1,-1,2,-4,4,-8,2,-2,1,-2,1,-1},

  {-1,1,-1,2,-1,1,-2,4,-8,16,-4,4,-2,4,-2,2},

  {1,-2,1,-1,4,-8,2,-2,1,-1,1,-2,1,-1,2,-4},

  {-1,2,-1,1,-8,16,-4,4,-2,2,-2,4,-1,1,-2,4},

  {4,-8,2,-2,1,-2,1,-1,1,-2,1,-1,2,-4,1,-1},

  {-8,16,-4,4,-2,4,-2,2,-1,2,-1,1,-2,4,-1,1},

  {1,-1,4,-8,2,-2,1,-2,1,-1,2,-4,1,-1,1,-2},

  {-2,2,-8,16,-4,4,-2,4,-1,1,-2,4,-1,1,-1,2}

 }

道理同加密算法,因为这是模256的减法运算,所以只能采取在运算的每一步对表达式结果使用三目运算符 ?:进行判断,保证结果为正值后与0xFF作与(&)操作,从而保证其值介于0-255之间,因而不能采用通常意义上的二维数组乘法来进行处理。

同加密算法类似的,在第i轮迭代中,采用32*i+j的运算来定位n_LocExpandBox的下标,用表达式的运算结果与0xFF作与(&)操作。代码如下:

input[0] = (byte)((m_nLogBox[input[0] - n_LocKeyExpandBox[32 * i + 16] + 256] ^ n_LocKeyExpandBox[32 * i]) & 0xFF);

  ...

input[30] = (byte)((m_nLogBox[input[30] - n_LocKeyExpandBox[32 * i + 31] + 256] ^ n_LocKeyExpandBox[32 * i + 15]) & 0xFF);

三、几点说明

1.本程序在Windows server 2003 Standard Edition Service Pack 2Visual Studio

2008 version 9.0.21022.8 RTM.NET 3.5Intel P4 3.06Ghz下 调试通过。

2.对程序中出现的所有模256“+”运算,考虑到只取低16位,所以均采用与(&)0xFF来达到此运算要求,而对于模256“+”运算的逆运算,即模256“-”运算,采用三目运算符?来进行判断,若“-”运算结果大于等于零,则结果为其自身,否则将差加上256来满足要求。

3.加密算法中,input[0] = (byte)((input[0] ^ n_LocKeyExpandBox[16 * m_nChipherLen]));不能对结果采用与(&)0xFF操作。

 

参考文献

 

[1] 胡予濮,张玉清,肖国镇编著 《对称密码学》 [M](北京)机械工业出版社2002 8.

[2] http://www.princeton.edu/~rblee/safer+/.

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089