分组密码SAFER+的C#实现
2009-02-27 08:18:34 来源:WEB开发网2. 密钥扩展算法
SAFER+在密钥扩展中,使用密钥匙扩展数组m_nKeyExpandBox[(m_nChipherLen+1)*m_nWord/2]和密钥数组m_nKeyBox[m_nChipherLen+1],算法首先将string型密钥m_sEncryptionKey由Unicode字符集转换成ASCII的密钥数组m_nKeyBox(过程不在详述),然后进行密钥扩展数组的构造,在将256位密钥,即32字节赋值到Byte型的数组m_nKeyBox,即赋值范围是m_nKeyBox[0]-m_nKeyBox[31],而m_nKeyBox[]共计33元素,最后一位m_nKeyBox[32]有什么用呢?其实这一位是前面32个元素作异或的结果。接着算法作32轮迭代,在第i轮迭代中,首先需要将密钥数组m_nKeyBox中的元素循环左移三位,即首三位移至末三位,为此只有采取分别左移三位与右移五位后,再作异或运算来达次目的,这里,C#程序与传统的SAFER+ C源代码略有不同,C源代码的处理方式是:
By = lk[j];
Lk[j] = (by << 3) | (by >> 5);
我们知道,C#编译器在作(by << 3) | (by >> 5)运算时,会自动将运算级别由byte上升至int型,C#的int是32位的,如果不作强制类型转换,是不可能把该表达式的值赋给byte型的lk[j]的,为此需要将左移三位和右移五位的运算先与0xFF做与(&)操作,只取结果的低8位,最后二者的或(|)操作也取低8位,最终作类型强制转换为byte型,这样才能保证编译器的正常运转,代码如下:
temp = m_nKeyBox[j];
m_nKeyBox[j] = (byte)((((temp << 3) & 0xFF) | ((temp >> 5) & 0xFF)) & 0xFF);
在这第i轮的迭代中,若i<16,则m_nKeyExpandBox取值为m_nKeyExpandBox[l + j] = (byte)((m_nKeyBox[m] + m_nExpBox[m_nExpBox[(k + j) & 0xFF]]) & 0xFF);注意到该加法运算是模256的方式,所以通过将结果与0xFF作与(&)运算,从而保证模256的正确性,保证高位为0,而强制类型转换的理由同上述循环移位的解释。若i>=0,则赋值为另一方式,代码如下:
更多精彩
赞助商链接