流密码与分组密码编程

上传人:F****n 文档编号:99401846 上传时间:2019-09-19 格式:DOCX 页数:7 大小:32.30KB
返回 下载 相关 举报
流密码与分组密码编程_第1页
第1页 / 共7页
流密码与分组密码编程_第2页
第2页 / 共7页
流密码与分组密码编程_第3页
第3页 / 共7页
流密码与分组密码编程_第4页
第4页 / 共7页
流密码与分组密码编程_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《流密码与分组密码编程》由会员分享,可在线阅读,更多相关《流密码与分组密码编程(7页珍藏版)》请在金锄头文库上搜索。

1、上机一:流密码与分组密码编程【上机目的】熟悉流密码和分组密码加密/解密算法的基本原理,通过编程/开源代码分析分别了解一种标准流密码算法和一种标准分组密码算法的运行原理。【上机环境】1、 硬件 PC机一台。 2、 系统配置:操作系统windows XP以上。 3、编程语言:C/C+/C#/Java/Python【上机内容及要求】1、 分别利用RC4算法(或其它任一种标准流密码算法)和DES算法(或AES算法等其它任一种标准分组密码算法)对数据进行加解密操作2、 代码分析及注释3、 代码调试4、 代码修改及测试(选做)备注:可借鉴网上相关算法的开源代码进行编程实现,编程语言不限。【上机报告】1、提

2、交关键功能有注释的源码。2、提交运行测试结果(运行截图及说明)。3、运行测试结果分析。4、上机总结(任务完成情况、出现或待解决的问题、收获、体会等)。流密码流密码就是使用较短的一串数字(叫它密钥吧), 来生成无限长的伪随机密码流, 当然事实上只需要生成和明文长度一样的密码流就够了。 一个非常简单的流密码算法是,用6个比特位做密钥, 将它不断重复得到密码流. .直到和明文长度相等,然后将密码流和明文“相加” 就得到密文了,解密就是将这个密码流和密文“相加”。 流密码算法有个特殊的名称维吉尼亚密码, 当然这里密钥长度可以不是6。 用较短的密钥产生无限长的密码流的方法非常多, 其中有一种就叫做RC4

3、。把明文的信息限制在ascii码字符集内( 它已经能表示所有的英文资料了哈哈),每个字符是一个比特, 占8位。假设明文是abc,a、b、 c的ascii值分别为97、98、99。 二进制形式为、 。密钥流和明文长度一样,假设是sdf, 同样可以得到二进制流、 ,让他们在对应位做异或运算就可以得到密文了, c语言有运算符来实现“相加”的操作。我们就直接对字符进行“ 相加”即as, bd, cf。得到的结果的二进制形式为、 、, 它们分别表示ascii码值为18、6、5的字符RC4用两步来生成密码流 首先你指定一个短的密码,储存在keyMAX数组里, 还有一个数组S256,令Si=i。 然后利用数

4、组key来对数组S做一个置换, 也就是对S数组里的数重新排列,排列算法为for i from 0 to 255 Si := iendforj := 0for i from 0 to 255 j := (j + Si + keyi mod keylength) mod 256 swap values of Si and Sjendfor第二步利用上面重新排列的数组 S 来产生任意长度的密钥流,算法为i := 0j := 0while GeneratingOutput: i := (i + 1) mod 256 j := (j + Si) mod 256 swap values of Si and

5、 Sj K := S(Si + Sj) mod 256 output Kendwhileoutput K 一次产生一字符长度(8bit)的密钥流数据, 一直循环直到密码流和明文长度一样为止。 产生密钥流之后,对信息进行加密和解密就只是做个“相加” 的运算。 RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方

6、法。在介绍RC4算法原理之前,先看看算法中的几个关键变量: 1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节密钥流第i字节; 2、状态向量S:长度为256,S0,S1.S255。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换; 3、临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T

7、; 4、密钥K:长度为1-256字节,注意密钥的长度 keylen 与明文长度、钥流的长度没有必然关系,通常密钥的长度趣味16字节(128比特)。RC4的原理分为三步:1、初始化S和Tfor i=0 to 255 do Si =i; Ti=K imodkeylen ;2、初始排列Sfor i=0 to 255 do j= ( j+Si+Ti)mod256; swap(Si,Sj);3、产生密钥流for r=0 to len do /r为明文长度,r字节 i=(i+1) mod 256; j=(j+Si)mod 256; swap(Si,Sj); t=(Si+Sj)mod 256; kr=St;

8、下面给出RC4加密解密的C+实现:加密类:/* 加密类*/class RC4 public: /* 构造函数,参数为密钥长度 */ RC4(int kl):keylen(kl) srand(unsigned)time(NULL); for(int i=0;ikl;+i) /随机生产长度为keylen字节的密钥 int tmp=rand()%256; K.push_back(char(tmp); /* 由明文产生密文 */ void encryption(const string &,const string &,const string &);private: unsigned char S2

9、56; /状态向量,共256字节 unsigned char T256; /临时向量,共256字节 int keylen;/密钥长度,keylen个字节,取值范围为1-256 vector K; /可变长度密钥 vector k; /密钥流 /* 初始化状态向量S和临时向量T,供keyStream方法调用 */ void initial() for(int i=0;i256;+i) Si=i; Ti=Ki%keylen; /* 初始排列状态向量S,供keyStream方法调用 */ void rangeS() int j=0; for(int i=0;i256;+i) j=(j+Si+Ti)%

10、256; /coutj=jendl; Si=Si+Sj; Sj=Si-Sj; Si=Si-Sj; /* 生成密钥流 len:明文为len个字节 */ void keyStream(int len);void RC4:keyStream(int len) initial(); rangeS(); int i=0,j=0,t; while(len-) i=(i+1)%256; j=(j+Si)%256; Si=Si+Sj; Sj=Si-Sj; Si=Si-Sj; t=(Si+Sj)%256; k.push_back(St); void RC4:encryption(const string &pl

11、aintext,const string &ks,const string &ciphertext) ifstream in; ofstream out,outks; in.open(plaintext); /获取输入流的长度 in.seekg(0,ios:end); int lenFile=in.tellg(); in.seekg(0, ios:beg); /生产密钥流 keyStream(lenFile); outks.open(ks); for(int i=0;ilenFile;+i) outks(ki); outks.close(); /明文内容读入bits中 unsigned cha

12、r *bits=new unsigned charlenFile; in.read(char *)bits,lenFile); in.close(); out.open(ciphertext); /将明文按字节依次与密钥流异或后输出到密文文件中 for(int i=0;ilenFile;+i) out(unsigned char)(bitsiki); out.close(); delete bits;解密类:/* 解密类*/class RC4_decryptionpublic: /* 构造函数,参数为密钥流文件和密文文件 */ RC4_decryption(const string ks,co

13、nst string ct):keystream(ks),ciphertext(ct) /* 解密方法,参数为解密文件名 void decryption(const string &);private: string ciphertext,keystream;void RC4_decryption:decryption(const string &res) ifstream inks,incp; ofstream out inks.open(keystream); incp.open(ciphertext); /计算密文长度 inks.seekg(0,ios:end); const int lenFile=inks.tellg(); inks.seekg(0, ios:beg); /读入密钥流 unsigned char *bitKey=new unsigned charlenFile; inks.read(char *)bitKey,lenFile); inks.close(); /读入密文

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号