常见密码算法分析及C语言实现

2014-12-31 00:37郭萌萌
电脑知识与技术 2014年35期
关键词:C语言

郭萌萌

摘要:计算机的高速发展使信息安全面临着巨大的挑战。在计算机应用中要想确保信息安全,就必须要对密码算法进行合理应用。基于此,该文对密码算法进行了分析,并将密码算法的C语言实现进行了简单介绍和说明。

关键词:密码算法;C语言;随机数

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)35-8371-02

密码学具有悠久的历史,但同时也是一门崭新的课程,人们从来没有停止对密码学的研究。现代密码学理论十分复杂,现代密码学的发展需要现代数学和计计算机科学的支持。进入二十一世纪后,人们已经计入到了计算机时代,如何确保计算机中的信息在存储、传输、交换中的安全性是一个值得探讨的话题。

1 计算机密码学发展历史

密码学在人类发展历史中有着不可代替的作用,从2000多年前古埃及发生战争,密码就出现在了人类中,起初的密码就是简单的记录符号。随着时代的推移,在两次世界大战中人们开始意识到密码的重要性。

密码学真正成为一门学科是在二十世纪七十年代。美国国家标准局在1977年对DES(数据加密标准)进行了公布,并批准在非商业和非机密单位中对其进行应用,从此解开了密码的神秘面纱。早在1975年“密码学的新方向”一文中就提出了适用于网络的公钥密码理念,这也是人们对公钥密码进行研究的开始。受“密码学的新方向”影响,各种公钥密码体制被提了出来,在众多体制中,RSA成为了密码学研究的一个里程碑。不夸张的说,“没有公钥密码的研究也不会有近代密码学”。现代社会是一个信息高速发展的社会,随着科技的发展,密码学也取得了巨大进步,而且也成为了许多学科发展的基础。

2 常见的密码算法

2.1 密码系统保密机理

计算机及互联网在人们的日常生活中越来越普及,随之而来的,人们对信息安全方面的要求也越来越高。在网络环境中确保信息完整性、准确性和机密性都需要密码技术来实现。图1为密码系统保密机理。

在图1中key1表示的是加密密钥,key2表示的是解密密钥,密钥系统依据key1与key2是否相同,将密码算法分为对称密码算法和非对称密码算法。非对称密码算法在应用过程中既要使用公钥也要使用私钥。图1中的EK1(M)和DK2(C)就是在加密和解密过程中使用的密码算法。

密码技术是密码算法的核心,算法主要通过软件实现,少数算法可以通过硬件完成,软件实现算法的主要优势在于可优化和可维护,因此在编写上通常使用C语言。

2.2 对称密码算法

KP与KS在实质上是相同的,也就是说可以由KP导出KS。从加密模式上对对称加密模式进行分类,可以将其分为分组密码和序列密码两大类。在对称加密系统中,加密和解密过程中使用的密钥都是相同的,因为加密和解密需要使用相同的密钥,因此加密方和解密方都需要对他们使用的密钥进行保存,同时加密和解密方都需要严格的保存密钥,避免泄露,也只有这样才能实现密码的完整性和机密性[1]。

2.3 非对称密码算法

非对称密码算法也叫做双钥密码算法,在此算法中KP同KS之间有着很大差别,KP是公开密钥,也叫公钥,KS则是必须需要保密的密钥,也叫私钥。在公钥密码算法中可以较容易的由KS推导出KP,但很难实现反向推导,这种单向性的实现,主要是具有单向函数,其中单向函数满足以下条件:1) 指定x值,很容易完成y=kk(x)的计算;2) 指定y,对x进行计算,使x=f-1k(y)无法实现。3) 存在数值k,如果k为已知,给出任意一个y,如果存在相应的x,则很容易完成x=f-1k(y)的计算[2]。

2.4 两种算法的对比

对称密码与非对称密码算在实际应用中各有各的特点,将两者进行对比,优缺点如表1所示。从目前的应用情况来看,对称密码经常被应用在大量数据的加密。非对称密码经常应用在关键性数据加密。例如会话密钥。

3 常见密码算法分析

3.1常见的对称密码算法

IBM公司首先开发了DES算法,并在1977年被美国采纳,作为“非密级”使用标准,并且被广泛应用到生产中, DES曾经是世界上应用最为广泛的密钥算法。在对DES算法进行应用时,将明文分成块,运用8个S盒与8个P盒进行置换,在16轮迭代后,生成比特密文(64bit),在每一轮的迭代中运用的密钥都是由最初的56比特生成的[3]。在加密和解密过程中采用DES加密和解密,那么加密和解密流程以及密钥都完全相同,其中仅有的区别就是解密与加密中应用的子密钥序列是相反的。DES算法主要存在以下问题:1) DES密钥空间无法满足实际需求(256bit)。2) DES里刨除S盒其余计算都是线性的,然而在实际应用中,S盒的密码算法对安全性影响巨大,而NIST(美国国家标准局)并没有将S盒设计原则公布于众,因此,并不排除S盒中藏有“陷门”,同时因为空间问题DES密钥的组合形式有限,在被攻击时,如果攻击人员采用穷举法很可能在短时间内获取成功。因此在实际应用中,为了使DES算法安全性能够得到增加,从事密码设计的工作中虽然又提出了独立密钥方法、基于DES的Triple算法,但在应用中起到的效果并不明显[4]。

在对称密码算法中IDEA算法是由我国学者莱学嘉和美国著名密码专家James L.Massey共同提出的,在IDEA数据加密算法中密文和明文都是64比特,但密钥长度则为128比特。IDEA算法需要建立在群运算的基础之上对密钥和数据进行运算,最后得到解密结果或密文输出。

IDEA算法品质优良,2128比特的密钥空间对其安全性予以了有利的支持,而且无论在硬件上还是在软件上都可以较快的实现。从本质上来看,IDEA算法算是一种“强”加算法,从目前情况来看,还没有出现对其产生有效供给的算法。endprint

3.2非对称加密算法

RSA与上述的DES算法最大的区别就是它的密钥算法被相对完整的公开,在加密过程中使用的加密密钥并不是私密的,在必要时可以通过广播或网络的形式对密钥进行公布,这也就是在加密过程中使用的公钥。在解密过程中应用的密钥则具有私密性,也就是我们常说的私钥。RSA的安全性基于大整数素因子分解的困难性,大数因子分解在数学界一直都是一道难题,到目前还没有人发现合理的解决方法。目前在最快的算法就是参数对照,然而完成1024比特的一个整数因子分解所需要的时间是巨大的。RSA在应用过程中不仅能够用于加密,而且也能用于认证和数字签名和密钥发布[5]。

3.3 ECC算法

ECC算法早在1985年就被提出,是非对称密码算法的一种。其安全性主要源于椭圆曲线离散对数问题求解难度大。建设Q是W(JR)(椭圆曲线)上的一点,点F是W(JR)上为Q倍数点,则存在整数Y大于0,使F与YF相等,椭圆曲线离散问题就是由给出的Q和F来确定出Y的值。依据目前的研究结果来看,对椭圆曲线上的离散对数问题处理要比离散对数处理难度更大,也就是说在椭圆曲线公钥密码上运用较小的数就可以实现同大区域相同的安全性。

4 密码算法的C语言实现

4.1 数据与逻辑运算

在DES算法中,多数为逻辑运算,密钥和明文都需要依照按ASCII码标准统一转化为十进制码,然后再进行密钥置换和IP置换,明文在完成置换后,要进行非线性置换,在DES算法中涉及到的置换都应当为按位逻辑运算。运算过程中的数据类型十分重要。

4.2 随机最大数的生成

无论是使用什么密码算法,在应用中随机最大数都是不可或缺的。一般来说一个能够被应用的密码随机数发生器应当具有以下特性:1) 产生的数值应当是无法预测的。2) 产生的数应当平均分布。3) 拥有一个大范围的取值范围,也就是在使用中能够获取到不同的数值。rand()函数经常用于C语言中随机函数的生成,但如果对信息的安全要求较高则不建议使用rand()函数。这主要是因为rand()具有一定的可预测性,rand()函数是以之前产生的随机数作为种子,然后再生成下一个随机数。

正确的做法是在系统中选取一个高级的函数方法CryptGenRandom,该方法具有平均分布和不可预测的特点,此函数已经在Winerypt.h中进行了声明,因此可使用于任意Windows平台。但在对该方法进行调用时需要C++中的CCrypRandom类的支持,CryptGenRandom主要从Windows系统中获取以下随机资源:当前进程、时钟数、内部CPU计数器、当前时间等。

4.3 大数运算

RSA加密需要有大数运算予以支持,目前主流RSA算法需要512位以上作为支持,而从目前情况来看,多数计算机中使用的编译器,仅支持64位,因此无法满足RSA加密的使用需求,为了解决这一问题则需要建立大数运算数据库,数据库中应当包含加、减、乘、除等。

大数表示一种思想:用数学完成对数据的存储,也就是利用10进制数对数组加以表示,然后函数进行编写,这样做的最大优点是符合人们长期以来养成的思维习惯,便于人们对其进行理解;主要弊端是效率低,而且在处理过程中需要优化,而且对该思想进行运算需要许多额外空间。另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,这样做的最大弊端是代码的可读性差、调试难度大。

4.4 C语言代码的实现

以求模为例,算法流程如下:

int mod(int* arrayA, int* arrayB,int arrayA_Length,int arrayB_Length)

{if(arrayA_Length

{for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}return arrayA_Length;

}

else

{for(i=arrayB_Length;i < arrayA_Length;i++)

{arrayC[j]=arrayA[i]; j=j+1;

}

arrayC_Length = multiply(arrayC,arrayB);

sub(arrayA,arrayC,arrayB,arrayA_Length,arrayC_Length,arrayB_Length);

while(arrayA_Length>arrayB_Length)

{sub(arrayA,arrayB,arrayA_Length,arrayB_Length);

}

for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}

return arrayA_Length;

}}

5 结束语

现代社会是信息社会,计算机技术、网络技术发迅速,信息安全已经成为当今社会的热点话题。尤其是网络信息安全已经成为了信息安全领域亟待解决的问题。使用密码算法是保证网络信息安全的一个重要手段。计算机密码学在解决信息安全上有无可代替的作用,而伴随着计算技术被应用到社会的各个领域,密码技术的应用领域也得到了进一步扩大,因此在日后的研究过程中要加强对密码学的研究,使其能够更好的为人类服务。

参考文献:

[1] 胡小敏.密码算法专用描述语言多项式和大数运算的设计与实现[D].陕西:西安电子科技大学,2012.

[2] 陈曼.分组密码算法能量与错误分析攻击及其防御对策研究 [D].山东:山东大学,2013.

[3] 张晓新,仲丛久.基于C语言实现的数据加密DES算法[J].沈阳航空工业学院学报,2004,21(2):48-49.

[4] 张文质,郝鹏翼.Huffman编码和解码的C语言实现[J].洛阳大学学报,2005,4(12):37-41.

[5] 林德敬,林柏钢.三大密码体制:对称密码、公钥密码和量子密码的理论与技术[J].电讯技术,2003,3:6-12.

3.2非对称加密算法

RSA与上述的DES算法最大的区别就是它的密钥算法被相对完整的公开,在加密过程中使用的加密密钥并不是私密的,在必要时可以通过广播或网络的形式对密钥进行公布,这也就是在加密过程中使用的公钥。在解密过程中应用的密钥则具有私密性,也就是我们常说的私钥。RSA的安全性基于大整数素因子分解的困难性,大数因子分解在数学界一直都是一道难题,到目前还没有人发现合理的解决方法。目前在最快的算法就是参数对照,然而完成1024比特的一个整数因子分解所需要的时间是巨大的。RSA在应用过程中不仅能够用于加密,而且也能用于认证和数字签名和密钥发布[5]。

3.3 ECC算法

ECC算法早在1985年就被提出,是非对称密码算法的一种。其安全性主要源于椭圆曲线离散对数问题求解难度大。建设Q是W(JR)(椭圆曲线)上的一点,点F是W(JR)上为Q倍数点,则存在整数Y大于0,使F与YF相等,椭圆曲线离散问题就是由给出的Q和F来确定出Y的值。依据目前的研究结果来看,对椭圆曲线上的离散对数问题处理要比离散对数处理难度更大,也就是说在椭圆曲线公钥密码上运用较小的数就可以实现同大区域相同的安全性。

4 密码算法的C语言实现

4.1 数据与逻辑运算

在DES算法中,多数为逻辑运算,密钥和明文都需要依照按ASCII码标准统一转化为十进制码,然后再进行密钥置换和IP置换,明文在完成置换后,要进行非线性置换,在DES算法中涉及到的置换都应当为按位逻辑运算。运算过程中的数据类型十分重要。

4.2 随机最大数的生成

无论是使用什么密码算法,在应用中随机最大数都是不可或缺的。一般来说一个能够被应用的密码随机数发生器应当具有以下特性:1) 产生的数值应当是无法预测的。2) 产生的数应当平均分布。3) 拥有一个大范围的取值范围,也就是在使用中能够获取到不同的数值。rand()函数经常用于C语言中随机函数的生成,但如果对信息的安全要求较高则不建议使用rand()函数。这主要是因为rand()具有一定的可预测性,rand()函数是以之前产生的随机数作为种子,然后再生成下一个随机数。

正确的做法是在系统中选取一个高级的函数方法CryptGenRandom,该方法具有平均分布和不可预测的特点,此函数已经在Winerypt.h中进行了声明,因此可使用于任意Windows平台。但在对该方法进行调用时需要C++中的CCrypRandom类的支持,CryptGenRandom主要从Windows系统中获取以下随机资源:当前进程、时钟数、内部CPU计数器、当前时间等。

4.3 大数运算

RSA加密需要有大数运算予以支持,目前主流RSA算法需要512位以上作为支持,而从目前情况来看,多数计算机中使用的编译器,仅支持64位,因此无法满足RSA加密的使用需求,为了解决这一问题则需要建立大数运算数据库,数据库中应当包含加、减、乘、除等。

大数表示一种思想:用数学完成对数据的存储,也就是利用10进制数对数组加以表示,然后函数进行编写,这样做的最大优点是符合人们长期以来养成的思维习惯,便于人们对其进行理解;主要弊端是效率低,而且在处理过程中需要优化,而且对该思想进行运算需要许多额外空间。另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,这样做的最大弊端是代码的可读性差、调试难度大。

4.4 C语言代码的实现

以求模为例,算法流程如下:

int mod(int* arrayA, int* arrayB,int arrayA_Length,int arrayB_Length)

{if(arrayA_Length

{for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}return arrayA_Length;

}

else

{for(i=arrayB_Length;i < arrayA_Length;i++)

{arrayC[j]=arrayA[i]; j=j+1;

}

arrayC_Length = multiply(arrayC,arrayB);

sub(arrayA,arrayC,arrayB,arrayA_Length,arrayC_Length,arrayB_Length);

while(arrayA_Length>arrayB_Length)

{sub(arrayA,arrayB,arrayA_Length,arrayB_Length);

}

for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}

return arrayA_Length;

}}

5 结束语

现代社会是信息社会,计算机技术、网络技术发迅速,信息安全已经成为当今社会的热点话题。尤其是网络信息安全已经成为了信息安全领域亟待解决的问题。使用密码算法是保证网络信息安全的一个重要手段。计算机密码学在解决信息安全上有无可代替的作用,而伴随着计算技术被应用到社会的各个领域,密码技术的应用领域也得到了进一步扩大,因此在日后的研究过程中要加强对密码学的研究,使其能够更好的为人类服务。

参考文献:

[1] 胡小敏.密码算法专用描述语言多项式和大数运算的设计与实现[D].陕西:西安电子科技大学,2012.

[2] 陈曼.分组密码算法能量与错误分析攻击及其防御对策研究 [D].山东:山东大学,2013.

[3] 张晓新,仲丛久.基于C语言实现的数据加密DES算法[J].沈阳航空工业学院学报,2004,21(2):48-49.

[4] 张文质,郝鹏翼.Huffman编码和解码的C语言实现[J].洛阳大学学报,2005,4(12):37-41.

[5] 林德敬,林柏钢.三大密码体制:对称密码、公钥密码和量子密码的理论与技术[J].电讯技术,2003,3:6-12.

3.2非对称加密算法

RSA与上述的DES算法最大的区别就是它的密钥算法被相对完整的公开,在加密过程中使用的加密密钥并不是私密的,在必要时可以通过广播或网络的形式对密钥进行公布,这也就是在加密过程中使用的公钥。在解密过程中应用的密钥则具有私密性,也就是我们常说的私钥。RSA的安全性基于大整数素因子分解的困难性,大数因子分解在数学界一直都是一道难题,到目前还没有人发现合理的解决方法。目前在最快的算法就是参数对照,然而完成1024比特的一个整数因子分解所需要的时间是巨大的。RSA在应用过程中不仅能够用于加密,而且也能用于认证和数字签名和密钥发布[5]。

3.3 ECC算法

ECC算法早在1985年就被提出,是非对称密码算法的一种。其安全性主要源于椭圆曲线离散对数问题求解难度大。建设Q是W(JR)(椭圆曲线)上的一点,点F是W(JR)上为Q倍数点,则存在整数Y大于0,使F与YF相等,椭圆曲线离散问题就是由给出的Q和F来确定出Y的值。依据目前的研究结果来看,对椭圆曲线上的离散对数问题处理要比离散对数处理难度更大,也就是说在椭圆曲线公钥密码上运用较小的数就可以实现同大区域相同的安全性。

4 密码算法的C语言实现

4.1 数据与逻辑运算

在DES算法中,多数为逻辑运算,密钥和明文都需要依照按ASCII码标准统一转化为十进制码,然后再进行密钥置换和IP置换,明文在完成置换后,要进行非线性置换,在DES算法中涉及到的置换都应当为按位逻辑运算。运算过程中的数据类型十分重要。

4.2 随机最大数的生成

无论是使用什么密码算法,在应用中随机最大数都是不可或缺的。一般来说一个能够被应用的密码随机数发生器应当具有以下特性:1) 产生的数值应当是无法预测的。2) 产生的数应当平均分布。3) 拥有一个大范围的取值范围,也就是在使用中能够获取到不同的数值。rand()函数经常用于C语言中随机函数的生成,但如果对信息的安全要求较高则不建议使用rand()函数。这主要是因为rand()具有一定的可预测性,rand()函数是以之前产生的随机数作为种子,然后再生成下一个随机数。

正确的做法是在系统中选取一个高级的函数方法CryptGenRandom,该方法具有平均分布和不可预测的特点,此函数已经在Winerypt.h中进行了声明,因此可使用于任意Windows平台。但在对该方法进行调用时需要C++中的CCrypRandom类的支持,CryptGenRandom主要从Windows系统中获取以下随机资源:当前进程、时钟数、内部CPU计数器、当前时间等。

4.3 大数运算

RSA加密需要有大数运算予以支持,目前主流RSA算法需要512位以上作为支持,而从目前情况来看,多数计算机中使用的编译器,仅支持64位,因此无法满足RSA加密的使用需求,为了解决这一问题则需要建立大数运算数据库,数据库中应当包含加、减、乘、除等。

大数表示一种思想:用数学完成对数据的存储,也就是利用10进制数对数组加以表示,然后函数进行编写,这样做的最大优点是符合人们长期以来养成的思维习惯,便于人们对其进行理解;主要弊端是效率低,而且在处理过程中需要优化,而且对该思想进行运算需要许多额外空间。另一种思路是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,这样做的最大弊端是代码的可读性差、调试难度大。

4.4 C语言代码的实现

以求模为例,算法流程如下:

int mod(int* arrayA, int* arrayB,int arrayA_Length,int arrayB_Length)

{if(arrayA_Length

{for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}return arrayA_Length;

}

else

{for(i=arrayB_Length;i < arrayA_Length;i++)

{arrayC[j]=arrayA[i]; j=j+1;

}

arrayC_Length = multiply(arrayC,arrayB);

sub(arrayA,arrayC,arrayB,arrayA_Length,arrayC_Length,arrayB_Length);

while(arrayA_Length>arrayB_Length)

{sub(arrayA,arrayB,arrayA_Length,arrayB_Length);

}

for(i=arrayA_Length-l ;i >=0;i—)

{modend[i]=a[i];

}

return arrayA_Length;

}}

5 结束语

现代社会是信息社会,计算机技术、网络技术发迅速,信息安全已经成为当今社会的热点话题。尤其是网络信息安全已经成为了信息安全领域亟待解决的问题。使用密码算法是保证网络信息安全的一个重要手段。计算机密码学在解决信息安全上有无可代替的作用,而伴随着计算技术被应用到社会的各个领域,密码技术的应用领域也得到了进一步扩大,因此在日后的研究过程中要加强对密码学的研究,使其能够更好的为人类服务。

参考文献:

[1] 胡小敏.密码算法专用描述语言多项式和大数运算的设计与实现[D].陕西:西安电子科技大学,2012.

[2] 陈曼.分组密码算法能量与错误分析攻击及其防御对策研究 [D].山东:山东大学,2013.

[3] 张晓新,仲丛久.基于C语言实现的数据加密DES算法[J].沈阳航空工业学院学报,2004,21(2):48-49.

[4] 张文质,郝鹏翼.Huffman编码和解码的C语言实现[J].洛阳大学学报,2005,4(12):37-41.

[5] 林德敬,林柏钢.三大密码体制:对称密码、公钥密码和量子密码的理论与技术[J].电讯技术,2003,3:6-12.

猜你喜欢
C语言
基于Visual Studio Code的C语言程序设计实践教学探索
51单片机C语言入门方法
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
《C语言程序设计》翻转课堂教学改革要点
浅谈基于C语言的计算机软件程序设计
高职高专院校C语言程序设计教学改革探索
基于C语言的学生成绩管理系统的设计与实现
基于C语言的常用排序算法比较研究
论子函数在C语言数据格式输出中的应用