邵葳
摘要 本文提供了一个快速实现GOST密码算法的程序,与传统GOST算法相比有以下特点:1)所有变量都定义为16进制,高效实现算法中的各种运算;2)S盒的查找与子密钥的使用都采用查表法;3)提取出单轮的算法,使程序结构更加清晰。
关键词 GOST算法,密码,DES算法
GOST算法是前苏联设计的分组密码算法,是Gosudarstvennyi Standard 或Government Standard的缩写,它除了泛指任何标准外,其实类似于FIPS。该标准的编号为28147-89,USSR的政府标准会议授予了该标准。它的设计者打算在有效性和安全性之间达到平衡,与DES算法相比有以下优点:在DES中从密钥产生子密钥的过程比较复杂,而GOST的过程非常简单; DES有56位密钥,而GOST有256位密钥; DES的S盒是6位输入和4位输出,而GOST的是4位输入和4位输出,大小仅为DES的S盒的1/4; DES有16轮,而GOST有32轮。
一、算法框架
GOST是一个64位分组及256位密钥的分组密码算法,它使用32轮的简单迭代。加密时的输入部分被分成左半部分L和右半部分R,第i轮的子密钥为Ki,GOST的第i轮为(如图1所示):
Li=Ri-1
Ri=Li-1⊕f(Ri-1,Ki)
图1 GOST算法单轮框架
函数f的过程是:将右半部分R与第i轮的子密钥进行模232加,该结果分成8个4位分组,第一个4位分组当成第一个S-盒,第二个分组当成第二个盒,依次类推。S-盒是保密的。8个S-盒的输出重组成32位字,然后整个字循环左移11位。最后,该结果与左半部分异或变为新的右半部分,原右半部分变为新的左半部分,将此次操作重复进行32次。
子密钥的产生很简单,256位密钥被划分为8 个32位分组:K1、K2、…K8。32轮加密中子密钥使用顺序是前24轮按1到8升序,最后8轮按8到1的顺序。
2本算法的核心程序
1. 定义GOST类GOSTCLASS
class GOSTCLASS
{public:
//定义一个数据结构用于对明密文的存取
struct WordByte
{ unsigned int zero:4; unsigned int one:4; unsigned int two:4; unsigned int three:4;
unsigned int four:4; unsigned int five:4; unsigned int six:4; unsigned int seven:4;
};
union Word
{ unsigned int word; WordByte byte; };
struct DWord
{ Word word0; Word word1; };
void Encode(unsigned int *,unsigned int *);//加密函数
void Decode(unsigned int *,unsigned int *);//解密函数
DWord data;//定义用于加解密的数据
unsigned int SubKey[8];//定义子密钥接口,用于外部初始化
private:
void OneTurn(DWord *,unsigned int);//定义GOST的轮函数
};
|