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

注意程序的第一句,此处不能对表达式作0xFF的与操作,否则运行结果不对,这里是于很难理解。笔者认为,从input[0] ^ n_LocKeyExpandBox[16 * m_nChipherLen]本身来讲,其结果经强制类型转换成byte后就已经保证了结果的高位为零,从而满足模256运算的需要。

最后将input置入输出数组output中,同样,与明文m_sInClearText置入byte型的字节数组input中相似,output数组的偶数位下标,即output[0]output[2]……output[30]中均为密文数据,而奇数位下标,即output[1]output[3]……output[31]均为0,从而保证byte型数组能转换成string型密文m_sCryptedText

4.解密算法

该算法其实就是简单地将加密操作逆向进行,首先进行初始变换,即加密算法输出变换的逆向操作,因为对于模256-”运算,其结果有可能小于0,因而此处要采用三目运算符 ?:来进行表达式结果判断,例如对input[2]而言,若input[2] - n_LocKeyExpandBox[16 * m_nChipherLen + 1]大于等于零,则结果为其自身,否则应将二者之差加上256,然后将整个结果与0xFF做与(&)操作,从而保证模256-”运算的正确性,代码如下:

input[0] = (byte)((input[0] ^ n_LocKeyExpandBox[16 * m_nChipherLen]) & 0xFF);

 

                input[2] = (byte)(((input[2] - n_LocKeyExpandBox[16 * m_nChipherLen + 1]) >= 0 ? (input[2] - n_LocKeyExpandBox[16 * m_nChipherLen + 1]) : (input[2] - n_LocKeyExpandBox[16 * m_nChipherLen + 1] + 256)) & 0xFF);

                input[4] = (byte)(((input[4] - n_LocKeyExpandBox[16 * m_nChipherLen + 2]) >= 0 ? (input[4] - n_LocKeyExpandBox[16 * m_nChipherLen + 2]) : (input[4] - n_LocKeyExpandBox[16 * m_nChipherLen + 2] + 256)) & 0xFF);

               input[6] = (byte)((input[6] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 3]) & 0xFF);

input[8] = (byte)((input[8] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 4]) & 0xFF);

 input[10] = (byte)(((input[10] - n_LocKeyExpandBox[16 * m_nChipherLen + 5]) >= 0 ? (input[10] - n_LocKeyExpandBox[16 * m_nChipherLen + 5]) : (input[10] - n_LocKeyExpandBox[16 * m_nChipherLen + 5] + 256)) & 0xFF);

                input[12] = (byte)(((input[12] - n_LocKeyExpandBox[16 * m_nChipherLen + 6]) >= 0 ? (input[12] - n_LocKeyExpandBox[16 * m_nChipherLen + 6]) : (input[12] - n_LocKeyExpandBox[16 * m_nChipherLen + 6] + 256)) & 0xFF);

                input[14] = (byte)((input[14] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 7]) & 0xFF);

input[16] = (byte)((input[16] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 8]) & 0xFF);

input[18] = (byte)(((input[18] - n_LocKeyExpandBox[16 * m_nChipherLen + 9]) >= 0 ? (input[18] - n_LocKeyExpandBox[16 * m_nChipherLen + 9]) : (input[18] - n_LocKeyExpandBox[16 * m_nChipherLen + 9] + 256)) & 0xFF);

                input[20] = (byte)(((input[20] - n_LocKeyExpandBox[16 * m_nChipherLen + 10]) >= 0 ? (input[20] - n_LocKeyExpandBox[16 * m_nChipherLen + 10]) : (input[20] - n_LocKeyExpandBox[16 * m_nChipherLen + 10] + 256)) & 0xFF);

                input[22] = (byte)((input[22] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 11]) & 0xFF);

input[24] = (byte)((input[24] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 12]) & 0xFF);

input[26] = (byte)(((input[26] - n_LocKeyExpandBox[16 * m_nChipherLen + 13]) >= 0 ? (input[26] - n_LocKeyExpandBox[16 * m_nChipherLen + 13]) : (input[26] - n_LocKeyExpandBox[16 * m_nChipherLen + 13] + 256)) & 0xFF);

                input[28] = (byte)(((input[28] - n_LocKeyExpandBox[16 * m_nChipherLen + 14]) >= 0 ? (input[28] - n_LocKeyExpandBox[16 * m_nChipherLen + 14]) : (input[28] - n_LocKeyExpandBox[16 * m_nChipherLen + 14] + 256)) & 0xFF);

                input[30] = (byte)((input[30] ^ n_LocKeyExpandBox[16 * m_nChipherLen + 15]) & 0xFF);

  推荐精品文章

·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