居然花了20分。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。石家庄经济学院通信实习报告院系:信息工程学院学号:407109060423姓名:王筱晗日期:2010-7-2一、实习目的1.熟练掌握MATLAB语言的使用2.了解一般的加密方法,和加密思想。掌握RSA非对称加密方法和凯撒加密方法的加密思想及其matlab实现3.理解huffman,fano,shanoon的编码的编码原理以及其matlab实现4.了解加密和编码的实际应用二、实习要求1.根凯撒加密算法和RSA加密算法,对一段文字进行加密,并用matlab实现2.根据huffman,fano,shanoon编码的原理,利用MATLAB语言实现三种编码方式编码。3.通过相应的加密方法对输入的文字进行加密,然后通过相应的码字对输入的字符串进行编码。得到相应的二进制码组三、实习内容(1)实习题目字符串加密与高效率编码的matlab实现(2)原理介绍1.RSA加密算法基本原理RSA是目前昀有影响力的公钥加密算法,RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n及e1),(n及e2)就是密钥对。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1modn;B=A^e2modn;e1和e2可以互换使用,即:1A=B^e2modn;B=A^e1modn;2.凯撒加密算法的基本原理凯撒加密是基于一个移位替换的思想,把原为的每一个字符替换为其后面的第n个字符。这种方法简单,并且保密性不好,但是这种方法体现了一个昀基本的加密思想。--替换。3.字符概率统计的基本原理统计出输入文字中每一个字符出现的概率,为之后编码工作做好准备,因为本例中所选用的三种高效率的编码方式都是以每个字符出现概率为基础的。4.霍夫曼编码原理霍夫曼(Huffman)编码是为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。步骤进行:l)将信号源的符号按照出现概率递减的顺序排列。2)将两个昀小出现概率进行合并相加,得到的结果作为新符号的出现概率。3)重复进行步骤1和2直到概率相加的结果等于1为止。4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。5.费诺编码原理首先,将信源符号以概率递减的次序排列起来,将排列好的信源符号划分成两大组。使每组的概率和近于相同,并各赋值予一个二元符号”0”,”1”然后将每一个二元码符号以此下去,直至每个小组只剩一个信源符号为止,昀后有前向后读取码符号序列。这样信源符号所对应的码符号序列则为编的的码字。将概率按从大到小的顺序排列按编码进制数将概率分组,使每组概率和尽可能接近或相等。给每组分配一位码元将每一分组再按同样原则划分,重复b和c,直到概率不再可分为止6.香农编码原理香农第二定理(有噪信道编码定理)设某信道有r个输入符号,s个输出符号,信道容量为C,当信道的信息传输率R码长N足够长,总可以在输入的集合中(含有r^N个长度为N的码符号序列),找到M(M=2^(N(C-a))),a为任意小的正数)个码字,分别代表M个等可能性的消息,组成一个码以及相应的译码规则,使信道输出端的昀小平均错误译码概率Pmin达到任意小。2首先信源概率降序排列,然后计算各个概率的累加概率si。接着取li=-log(p(si))Li向上取整,为码长。将累加概率f(si)变化成二进制小数,根据码长去相应的若干位的码字。得到香农编码(3)原理框图输入一段文字(英文)选择加密进行RSA加密进行凯撒加密请选择编码方式(4)功能说明此程序可以实现的功能有1.对文字进行凯撒加密或者进行RSA非对称加密,确保数据的安全性2.对密文进行huffman,fano,Shannon编码。以较高的编码效率对密Huffman编码Fano编码Shanoon编自动选择生成相应码字,进行编码分别计算三种编码的编码效率,选出昀高的对文字进行编码形成01组成的二进制码以及加密密钥图1高效率字符串加密编码原理框图3文进行编码。使之占用更低的带宽。3.可以自动分析对一段文字的三种编码方式分别得出的编码效率。自动的选择编码效率昀高的一种编码方式进行编码4.完成上诉一系列的功能以后,输出生成的密文和密钥5.通过所选定的编码方式的对输入文本信息进行二进制码元的编码。(5)实现步骤1.对于凯撒加密算法的MATLAB实现。凯撒密码算法的核心思想是密码字符向后移动若干位。将字符转换称为ASCII码以后,就很容易实现相应的字符的运算。其matlab实现的源程序如下functionw=kaisa(w)i=input('请输入移位个数');w=abs(w);forn=1:length(w)ifw(n)122-iw(n)=w(n)+i;elsew(n)=w(n)-26+i;endend'密文是'disp(w)w=setstr(w);2.RSA算法的matlab实现.RSA具体算法:公私钥生随机选定两个大素数p,q.计算公钥和私钥的公共模数n=pq.计算模数n的欧拉函数φ(n).选定一个正整数e,使1eφ(n),且e与φ(n)互质.计算d,满足de≡1(modφ(n)),(k为某个正整数).n与e决定公钥,n与d决定私钥.RSA编码的matlab实现的子程序源代码functionRSA1=rsa(minwen)%minwen=input('明文序列:');m=1;fori=300:1:2000k=0;forj=2:1:(i-1)ifrem(i,j)==0k=1;4break;endendifk==0f(m)=i;m=m+1;endendn1=10;h=ceil(n1.*rand(1,2));%产生两个随机数p=f(h(1,1));q=f(h(1,1)+h(1,2));%产生两个随机互异素数n=p*q;%计算公钥nQ=(p-1)*(q-1);forj=1:1:100000k=0;E=ceil(500*rand);fori=2:1:(Q-1)ifrem(Q,i)==0&&rem(E,i)==0k=1;break;endendifk==0e=E;break;endend%计算公钥el1=length(minwen);b=dec2bin(e);l2=length(b);forj=1:1:l1c=0;d=1;fori=1:1:l2c=2*c;d=mod(d*d,n);ifb(i)=='1'c=c+1;d=mod(d*minwen(j),n);5endendifminwen(j)=97&&minwen(j)=122miwen(j)=char(mod(d,26)+97);%明文是小写字母elseifminwen(j)=65&&minwen(j)=90miwen(j)=char(mod(d,26)+65);%明文是大写字母elsemiwen(j)=d;%明文是数字endend'密钥是'disp(Q)%Q=(p-1)(q-1)disp(e)disp(n)%私钥n'密文是'disp(miwen)RSA1=miwen;3.计算出每个字符出现的概率并按照概率的大小进行排序。排序的基本思想是利用字符串寻找函数strfin的。通过此函数可以知道某一个字符在原文中出现的次数。用此数除以原文的总的长度length(w)即为此字符出现的概率。function[zi,pr]=pro(w)pr=[];zi=[];lang=length(w);b=abs(w);i=1;c=0;form=0:1:127l=strfind(b,(c+m));cd=length(l);ifcd~=0p=cd/lang;pr(i)=p;zi(i)=c+m;i=i+1;%sprintf('字符%c的个数为%f此字符出现的概率是%f',b+m,cd,p)end6endzi=setstr(zi)pr=pr;4.对计算得到的概率数据进行huffman编码进行huffman编码时利用的functionc=huffman(p)n=size(p,2);ifn==1%此时已合并到一棵树上了,直接返回c=cell(1,1);c{1}='';returnend%找昀小的[p1,i1]=min(p);index=[(1:i1-1),(i1+1:n)];%这里的index是一个trick%他跟踪了现在的p的每个分量,在原来的p里面的下标%在昀后,将依据这个下标来成码p=p(index);n=n-1;%找第二小的。[p2,i2]=min(p);index2=[(1:i2-1),(i2+1:n)];%index2是在上一个p中的下标p=p(index2);i2=index(i2);%i2变为在原p中次小值的下标index=index(index2);%继续跟踪现在的p在原p中的下标p(n)=p1+p2;%生成一个新节点,即合并的两个昀小节点的和c=huffman(p);%对新的p的序列做huffman编码c{n+1}=strcat(c{n},'1');%p(n)是开始合并的节点7c{n}=strcat(c{n},'0');%这里从c(n)分出两枝,对开始合并的两节点成码%恢复原顺序index=[index,i1,i2];c(index)=c;5.对计算得到的概率数据进行fano编码functionc=fano(p)%p=[0.250.250.200.150.100.05]%c=fano(p)n=size(p,2);%已经编码完成ifn==1c=cell(1,1);c{1}='';returnend[p,index]=sort(p);%按概率排序p=fliplr(p);total=sum(p);%总概率acc=0;%累积概率flag=0;%是否到达尾部的标志fori=1:n-1newacc=acc+p(i);ifabs(total-2*newacc)=abs(total-2*acc)flag=1;break;endacc=newacc;endif~flagi=n;endsplit=i;%从分界点对两边的码递归做fanoc1=fano(p(1:split-1));8c2=fano(p(split:n));c=cell(1,n);%添加前缀0,1fori=1:split-1c{i}=strcat('0',c1{i});endfori=split:nc{i}=strcat('1',c2{i-split+1});end%将顺序调整回去c=fliplr(c);c(index)=c;6.对计算得到的概率数据进行Shannon编码functionc=shannon(p)%p=[0.250.250.200.150.100.05]%shannon(p)[p,index]=sort(p);p=fliplr(p);%从大到小n=length(p);pa=0;%累加概率fori=2:npa(i)=pa(i-1)+p(i-1);endifp~=0k=ceil(-log2(p));%码长计算endc=cell(1,n);%生成元胞数组,存码字,是cell,跟上一行不一样fori=1:nc{i}='';tmp=pa(i);forj=1:k(i)tmp=tmp*2;iftmp=1tmp=