分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点_第1页
分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点_第2页
分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点_第3页
分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点_第4页
分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、作业二、分析比较分组密码AES-CFB 或 OFB与流密码RC4的特点一、RC4算法介绍RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点,使其在一些协议和标准里得到了广泛应用。流密码也属于对称密码,但与分组加密算法不同的是,流密码不对明文数据进行分组,

2、而是用密钥生成与明文一样长短的密码流对明文进行加密,加解密使用相同的密钥。RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;(2)、密钥长度可变,一般用256个字节。  对称密码的工作方式有四种:电子密码本(ECB, electronic codebook)方式、密码分组链接(CBC, cipherblock chaining)方式、密文反馈(CFB, cipher-feedback)方式、输出反馈(OFB, output-feedback)方式。   RC4算法采用的是输出反馈工作方式,所以可以用一个短的密钥产生一个相对较长的密钥

3、序列。   OFB方式的最大的优点是消息如果发生错误(这里指的是消息的某一位发生了改变,而不是消息的某一位丢失),错误不会传递到产生的密钥序列上;缺点是对插入攻击很敏感,并且对同步的要求比较高。 RC4的执行速度相当快,它大约是分块密码算法DES的5倍,是3DES的15倍,且比高级加密算法AES也快很多。RC4算法简单,实现容易。RC4的安全保证主要在于输入密钥的产生途径,只要在这方面不出现漏洞,采用128bit的密钥是非常安全的。 RC4算法加密流程:包括密钥调度算法KSA和伪随机子密码生成算法PRGA两大部分(以密钥长度为256个字节为例)。 密钥调

4、度算法:首先初始化状态矢量S,矢量S中元素的值被按升序从0到255排列,即S0=00, S1=1, , S255=255.同时建立一个临时矢量T,如果密钥K的长度为256字节,则将K赋给T。否则,若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。这些预操作可概括如下:  /*初始化*/     fori = 0 to 255 do     Si= i;     Ti= Ki mod k

5、eylen;   然后用T产生S的初始置换,从S0到S255,对每个Si,根据由Ti确定的方案,将Si置换为S中的另一字节:   /*S的初始序列*/    j= 0     fori = 0 to 255 do    j= (j + Si + Ti) mod 256     swap(Si,Sj);因为对S的操作仅是交换,所以惟一的改变就是顺序的改变。S仍然包含从0到255的所有元素,在初始化的过程中,密钥的主要功

6、能是将S-box搅乱,代码中的变量i确保S-box的每个元素都得到处理,变量j保证S-box的搅乱是随机的。因此不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且该序列是随机的。伪随机序列生成算法:矢量S一旦完成初始化,输入密钥就不再被使用。密钥流的生成是从S0到S255,对每个Si,根据当前S的值,将Si与S中的另一字节置换。当S255完成置换后,操作继续重复,从S0开始:     /*密钥流的产生*/         i,j = 0;

7、0;        while(true)       i= (i + 1) mod 256;         j= (j + Si) mod 256;         swap(Si,Sj);         t= (Si +

8、sj) mod 256;         k= St   伪随机序列一旦生成,就得到子密码sub_k,把子密钥和明文进行异或运算,得到密文。解密过程也完全相同。加密中,只需将k的值与下一明文字节异或;相反解密中,将k的值与下一密文字节异或就可以还原出明文信息。算法描述为:         for(i = 0; i < textlength; i +)     &

9、#160;   ciphertexti=keystreamiplaintexti RC4算法存在的问题:因为RC4算法具有实现简单,加密速度快,对硬件资源耗费低等优点,使其跻身于轻量级加密算法的行列。但是其简单的算法结构也容易遭到破解攻击,RC4算法的加密强度完全取决于密钥,即伪随机序列生成,而真正的随机序列是不可能实现,只能实现伪随机。这就不可避免出现密钥的重复。RC4算法不管是加密还是解密,都只进行了异或运算,这就意味着,一旦子密钥序列出现了重复,密文就极有可能被破解。 具体破解过程如下:若明文、密钥是任意长的字节,可以用重合码计数法(counting coi

10、ncidence)找出密钥长度。把密文进行各种字节的位移,并与原密文进行异或运算,统计那些相同的字节。如果位移是密钥长度的倍数,那么超过60%的字节将是相同的;如果不是,则至多只有0.4%的字节是相同的,这叫做重合指数(index of coincidence)。找出密钥长度倍数的最小位移,按此长度移到密文,并且和自身异或。由于明文每字节有1.3位的实际信息,因此有足够的冗余度去确定位移的解密。对所有的密钥,输出密钥流的前几个字节不是随机的,因此极有可能会泄露密钥的信息。如果一个长期使用的密钥与一个随机数串联产生RC4算法密钥,那么可以通过分析大量由该密钥加密的密文得到这个长期使用的密钥。解决

11、该问题的办法是:抛弃密钥流最初的那部分数据。RC4 is a stream cipher with variable key length. Typically, 128 bit (16 byte) keys are used for strong encryption, butshorter insecure key sizes have been widely used due to export restrictions.1.RC4_set_key:sets up theB<RC4_KEY> B<key> using the B<len> b

12、ytes long key atB<data>.2.RC4: encrypts or decrypts the B<len>bytes of data at B<indata> using B<key> and places the result atB<outdata>.  Repeated RC4() callswith the same B<key> yield a continuous key stream. Since RC4 is a streamcipher (the input is X

13、ORed with a pseudo-random key stream to produce theoutput), decryption uses the same function calls as encryption.以下是测试代码:cryptotest.h:cpp view plaincopy1. #ifndef _CRYPTOTEST_H_  2. #define _CRYPTOTEST_H_  3.   4. #include <string>  

14、5.   6. using namespace std;  7.   8. typedef enum   9.     GENERAL = 0,  10.     ECB,  11.     CBC,  12.     CFB, 

15、 13.     OFB,  14.     TRIPLE_ECB,  15.     TRIPLE_CBC  16. CRYPTO_MODE;  17.   18. string DES_Encrypt(const string cleartext, const string key, CRYPT

16、O_MODE mode);  19. string DES_Decrypt(const string ciphertext, const string key, CRYPTO_MODE mode);  20.   21. string RC4_Encrypt(const string cleartext, const string key);  22. string&

17、#160;RC4_Decrypt(const string ciphertext, const string key);  23.   24. #endif /_CRYPTOTEST_H_  rc4test.cpp:cpp view plaincopy1. #include "stdafx.h"  2. #include <iostream>  3. #include

18、0;<string>  4. #include <vector>  5. #include <openssl/rc4.h>  6. #include "cryptotest.h"  7.   8. using namespace std;  9.   10. string RC4_Encrypt(const string 

19、cleartext, const string key)  11.   12.     RC4_KEY rc4key;  13.     unsigned char* tmp = new unsigned charcleartext.length() + 1;  14.     

20、memset(tmp, 0, cleartext.length() + 1);  15.   16.     RC4_set_key(&rc4key, key.length(), (const unsigned char*)key.c_str();  17.     RC4(&rc4key, cleartext.length(), (cons

21、t unsigned char*)cleartext.c_str(), tmp);  18.   19.     string str = (char*)tmp;  20.   21.     delete  tmp;  22.   23.     return str

22、;  24.   25.   26. string RC4_Decrypt(const string ciphertext, const string key)  27.   28.     RC4_KEY rc4key;  29.     unsigned char* tmp = new

23、 unsigned charciphertext.length() + 1;  30.     memset(tmp, 0, ciphertext.length() + 1);  31.   32.     RC4_set_key(&rc4key, key.length(), (const unsigned char*)key.c

24、_str();  33.     RC4(&rc4key, ciphertext.length(), (const unsigned char*)ciphertext.c_str(), tmp);  34.   35.     string str = (char*)tmp;  36.   37.   

25、0; delete  tmp;  38.   39.     return str;  40.   main.cpp:cpp view plaincopy1. #include "stdafx.h"  2. #include "cryptotest.h"  3. #include "TestMemory.h&

26、quot;  4. #include <iostream>  5. #include <string>  6.   7. using namespace std;  8.   9. void test_RC4()  10.   11.     string cleartext = "中

27、国北京12345$abcde%ABCDE!"  12.     string ciphertext = ""  13.     string key = "beijingchina1234567890ABCDEFGH!"  14.   15.     ciphertext =&#

28、160;RC4_Encrypt(cleartext, key);  16.     string decrypt = RC4_Decrypt(ciphertext, key);  17.   18.     cout<<"src cleartext: "<<cleartext<<endl;  19.  

29、   cout<<"genarate ciphertext: "<<ciphertext<<endl;  20.     cout<<"src ciphertext: "<<ciphertext<<endl;  21.     cout<<"genarate cle

30、artext: "<<decrypt<<endl;  22.   23.     if (strcmp(cleartext.c_str(), decrypt.c_str() = 0)  24.         cout<<"RC4 crypto ok!"<<endl;&#

31、160; 25.     else  26.         cout<<"RC4 crypto error!"<<endl;  27.   二、分组密码AES的模式分组密码是最基本的密码技术之一, 其处理消息的长度是固定的, 如 DES为 64比特、AES 为 128比特, 但是在实际中需要处理的消息通常是任意长的 ,且要求密文尽量不确定 ,

32、而分组密码自身不能做到 ,因此,引出了如何利用分组密码处理任意长度消息的问题. 解决这个问题的技术就是分组密码工作模式. 分组密码工作模式的设计理念为了阐述分组密码工作模式的设计理念,我们首先介绍如何评价一个分组密码工作模式. 工作模式的评价指标有三个方面 : 安全性、性能、模式 /执行特点.安全性评价指标包括: 抵抗现有攻击的能力 ; 可证明安全性,在合理的假设下 ,是否有安全性的证明结果 ; 和类似模式安全性的比较 , 和现在用的模式(如 CBC)的比较; 随机性 ,输出的统计特性 ; 是否拥有合理的数学背景等.性能评价指标包括计算的有效性、空间需求 、可并行性和预处理能力等.模式 /执行特点评价指标包括可提供的密码服务、灵活性 、错误特性、模式本身抗错性和简单性等.安全性是所有评价指标中最重要的 , 因为其它性能的评估相对容易、相对直观. 安全性评价中的第一条类似于分组密

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论