eds加密算法matlab仿真,基于Matlab的DES算法

《基于Matlab的DES算法》由会员分享,可在线阅读,更多相关《基于Matlab的DES算法(11页珍藏版)》请在人人文库网上搜索。

1、密码学与网络安全课程实验利用Matlab语言实现DES加密算法姓名:ZA 学号:XXXXX一、 实验目的1) 牢固掌握DES密码算法2) 通过编程实现DES算法,深入掌握现代密码算法实现的基本方法3) 验证DES算法中各个模块在实现混淆和弥散中的作用二、 实验内容要求1) DES算法实现:利用Matlab语言实现DES密码算法,输入64比特明文和56比特密钥,加密得到64比特的密文;2) DES弱密钥验证:观察弱密钥两次加密的结果,与非弱密钥两次加密的结果进行比较;3) DES算法初步应用:尝试加密一个字符串,字符串的长度大于8个字节;4) DES弥散特性分析:试输出每一轮加密得到的比特序列,。

2、并比较当初始明文1个比特发生变化时,每一轮加密输出的哪些比特发生变化。三、 实验方案与步骤3.1 DES算法实现a) 算法实现方案Matlab(矩阵实验室)是一款工程计算用的软件,功能十分强大。Matlab的计算基于矩阵,而DES算法用矩阵描述是十分简洁方便的。因此,选用Matlab作为算法实现语言,基于一系列的矩阵变换、运算来实现DES算法的加密。b) 主要功能实现流程及代码解析1) 加密程序图1 DES基本结构DES算法的结构非常简单,是一个16次的迭代。核心是函数中一系列变换。根据算法框图,程序步骤主要分为三大部分:1) 输入明文和密钥进行字符转换2) 产生16轮密钥矩阵3) 16轮迭代。

3、%demo5.mclc, clear all;%-第一步 输入明文和密钥-%M=ABCDEF;% K=ABCDEF;%MB=; for i=1:16Mi=M(i);MBi=0000,dec2bin(hex2dec(Mi);MBi=MBi(end-3:end);MBi=str2num(MBi(1),str2num(MBi(2),str2num(MBi(3),str2num(MBi(4);MB=MB,MBi;endM=MB;% 转化为64位二进制明文KB=;for i=1:16Ki=K(i);KBi=0000,dec2bin(hex2dec(Ki);KBi=KBi(end-3:end);KBi=s。

4、tr2num(KBi(1),str2num(KBi(2),str2num(KBi(3),str2num(KBi(4);KB=KB,KBi;endK=KB;% 转化为64位二进制密钥%-第三步 产生密钥-%PC_1=57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4;%PC_1置换矩阵 56位KEY0=K(PC_1);% 初始矩阵变。

5、换 64 to 56%循环移位shift_array=-1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1; C(1,:)=KEY0(1:28);%C0D(1,:)=KEY0(29:56);%D0for i=2:17C(i,:)=circshift(C(i-1,:),shift_array(i-1); %前28位循环移位%circshift是右移 移动负数位表示左移D(i,:)=circshift(D(i-1,:),shift_array(i-1); %后28位循环移位endPC2=14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16。

6、,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32;Ki=zeros(16,48);%循环移位KEY_MAT=C,D;%17*56KEY_MAT=KEY_MAT(2:17,:);%16*56PC_2=14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32; for。

7、 i=1:16Ki(i,:)=KEY_MAT(i,PC_2);endKEY=Ki;%-第四步 Feistel结构-%IP=58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7;%IP初始置换矩阵M=M(IP);%初始置换m0_L=M(1:32); %输入的左半部分明文m0_R=M(33:。

8、64);% 输入的右半部分明文 L,R=fchange(m0_L,m0_R,1,KEY);mi=L,R;mi2_hex(1,:)=mi%进入16轮迭代 for i=2:16L,R=fchange(L,R,i,KEY);mi=L,R;mi2_hex(i,:)=miendIP_1=40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 。

9、33 1 41 9 49 17 57 25;%IP_1初始逆置换矩阵m16=R,L;% 最后一步进行交换C=m16(IP_1); %IP逆置换m_hex=m_2_hex(C)% 转化为16进制 输出密文%fchange.mfunction Li,Ri = fchange(Li_1,Ri_1,m,KEY)%第i轮f函数的实现 输入Ri-1 表示第i-1轮的右半部分密文 输出第i轮的密文 Ri_1_ex=trm32_to_48(Ri_1);% 第一步 右半明文进行32to48扩展 OK Ri_1_ex2=reshape(Ri_1_ex,1,48); %将扩展的48位变为向量 OK f=bitxor。

10、(KEY(m,:),Ri_1_ex2); %与第i轮密钥按位异或f1=reshape(f,6,8); %变为矩阵 8个6位二进制数 8*6%经过S1盒s=S_box(1);x=2*f1(1,1)+f1(1,6); %S盒纵坐标 y=8*f1(1,2)+4*f1(1,3)+2*f1(1,4)+f1(1,5);%S盒横坐标f2=s(x+1,y+1); %取S盒中某一数f2_bin=0000,dec2bin(f2);% % 字符串处理f2_bin=f2_bin(end-3:end);f2_1=str2num(f2_bin(1),str2num(f2_bin(2),str2num(f2_bin(3),。

11、str2num(f2_bin(4);%省略s2s8盒 Ri_1_P=P_exchange(f2S); %转化为向量并置换运算PRi=bitxor(Li_1,Ri_1_P); %Li_1与f函数后的Ri_1进行按位异或 Li=Ri_1; %交换位置end程序见demo5.m。2) 解密程序DES算法设计巧妙也体现在其解密过程非常简单,结构和加密算法完全一样,只需要将16轮加密所用的密钥完全倒过来。对密钥矩阵16X64的行倒序排列,得到倒过来后的密钥矩阵。其余部分与解密程序保持一致即可。解密时,输入密文和密钥,得到明文。程序见demo5_inv.m。c) 加密64比特明文,对密文进行解密得到明文,。

12、观察是否与初始明文一致加密。这里用Matlab 中的GUI界面编写了加解密的交互程序。交互程序见desecb.m。在程序demo5.m中输入64比特明文及64比特密钥:M=ABCDEF;K=ABCDEF;运行:m_hex = 56CC09E7CFDC4CEF图2 DES_demo GUI界面解密:在程序demo5_inv.m中输入64比特密文及64比特密钥:M=56CC09E7CFDC4CEF;K=ABCDEF;运行: m_hex =ABCDEF将密文解密后与初始明文一致。为了证明程序对DES算法的正确实现,用密码学习软件Cryptool进行了验证。加密结果与本程序一致。图3 CrypTool。

13、加密结果3.2 DES弱密钥验证a) 用选定的弱密钥进行两次加密,观察得到的结果用已知四个弱密钥中的一个FFFFFFFFFFFFFFFF,对ABCDEF进行加密:M=ABCDEF;K=FFFFFFFFFFFFFFFF;m_hex =6DCE0DCA3再次加密:M=6DCE0DCA3;K=FFFFFFFFFFFFFFFF;m_hex = ABCDEF可以看出,两次加密后密文和第一次的初始明文一样,相当于是加密后再解密。验证了弱密钥。b) 用选定的非弱密钥进行两次加密,观察得到的结果用已知四个半弱密钥中的一个01FE01FE01FE01FE和对ABCDEF进行加密:M=ABCDEF;K=01FE0。

14、1FE01FE01FE;m_hex =8A76C7A4F16D47ED再用与01FE01FE01FE01FE对应的半弱密钥FE01FE01FE01FE01FE01加密:M=8A76C7A4F16D47ED;K=FE01FE01FE01FE01;m_hex =ABCDEF可以看出,一对半弱密钥能够互相加解密。3.3 DES算法初步应用a) 任意选定一个长度大于8个字符的字符串,设计一种方法对这个字符串进行加密用电码本模式ECB直接对明文分成以64位一组的块,这里用密文分组链接模式CBC来实现。算法步骤:1) 对任意长(m bit)明文分成N组,每组64bit2) 初始向量IV与第一组明文异或3)。

15、 第i-1组密文与第i组明文异或作为DES的输入明文4) 迭代N-1次5) 得到N*64bit密文,截取为 m bit算法框图为:图4 DES_CBC模式基本结构程序编写主要实现对任意长明文分组,以及对DES外围结构的改变。主要代码如下:M=ABCDEFABCDABCDEFABCD;% 任意长明文K=ABCDEF;%密钥IV=AABBCCDD; %初始向量%*明文分组a=ceil(length(M)/16); %向上取整MB=M;for i=1:16*a-length(M)MB=MB 0;endMi=;for j=1:a Mi(j,:)=MB(16*j-15):16*j); endM=bitx。

16、or(M,IV); %算法核心是先按位异或再输入DES程序见mydes.m,demo5_CBC.m。运行,得密文:C_CBC =21BC605D513B38E8D8EF6671DD7E6266C1FA5AC143D26与明文等长(60*4bit)。b) 分析你所设计的这种方法有什么优点和/或缺点CBC算法的优点很明显能有效地避免ECB对明文统计特征的泄漏,因为同一明文块输入DES中的实际明文是不一样的。CBC算法的缺点也是很明显的,由于其算法结构的限制,CBC不能实现并行运算,且误差传递效应比ECB差,一个密文块损坏,会引起两个明文块损坏。3.4 DES弥散特性分析a) 选择任意64比特明文m。

17、,选择任意56比特密钥k进行加密,并输出每一轮加密的64比特序列选定明文和密钥,依次输出每一轮加密输出的密文:明文:M=ABCDEF;密钥:K=ABCDEF;每一轮的加密结果如下表所示:轮数密文轮数密文1F0AAF0AA5E1CEC6325E1CEC6382E13C49382E13CF94F90DD64AFB50DD64AFBB6BF1470BC27F1470BC2394C8F458394C8F45348DC7469348DC746F37100C610F37100C63C22A9CB113C22A9CB0A37C369120A37C3695C725FFB135C725FFBF4748AD614。

18、F4748AD6CC6C340E15CC6C340EBA88F69916BA88F699FB21FB9C表1 16轮加密结果b) 随机改变m中的一个比特,用上述密钥k进行加密,并输出每一轮加密的64比特序列,与上一步的结果进行比较,你发现了什么?将明文:M=ABCDEF中第四位二进制改为1, 则明文变为:M=ABCDEF, 用相同的密钥加密,用红字标注出前6轮密文中与之前对应相等的位数,结果为:轮数密文轮数密文1F0AAF0AA5E1DEC6325E1DEC63A3E52C893A3E52C89ECE9D0E24ECE9D0E269DD75C5569DD75C5ABC7850D6ABC7850。

19、D0DC7CB6170DC7CB61A75AF6488A75AF64855F4CFF9955F4CFF92689AB42102689AB4249F546141149FDFDC287122DFDC287A13AAB62F91498AB62F9D4C4149D15D4C4149DCF16CFAAE41685表3 明文改变1bit后的16轮加密结果首先定性的可以明显看出:第一轮密文有1bit不相等:即第二轮密文有7bit 不相等:即即即即即即为了说明弥散特性,对改变后的16轮密文与之前产生密文进行定量分析(相等位数检查程序见bitcheck.m):轮数相等位数轮数相等位数16325734243153。

20、06347358329311022112412301325143415311625表4 明文改变1bit前后的16轮加密结果中相等比特位数由上表可以看出,随着轮数增加,初始明文1bit的改变对于密文的弥散效应越好。理论上,任意两个64位二进制序列相等时在相等位数为32时概率最大(每一位取0,1是等概率的), 因此在第四轮之后可认为弥散效应已经使得两组64位二进制序列不具有相关性。这些结论充分说明,1bit明文的改变对于密文的改变影响是很大的。c) 对明文m,随机改变k的一个比特,并以此进行加密,同样输出每一轮的64比特序列,与第一步中的结果进行比较,你发现了什么?将密钥:k=ABCDEF中第四。

21、位二进制数改为1, 则密钥为:k=ABCDEF, 输入相同的明文,用红字标注出前2轮密文中与之前对应相等的位数,结果为:轮数密文轮数密文1F0AAF0AA5F18EC6325F18EC6382A82D5D382E13CF94F90DD64AFB382A82D5D49A47B98449A47B98B918F4AD5B918F4ADBEB559976BEBD27C9E751D27C9E0D1B52DF80D1B52DF1F1F546091F1F54603AA16D15103AA16D15DBC7BB1E11DBC7BB1ED19C8AD112D19C8AD1CF57EA8213CF57EA82F6DA759D14F6DA759D30E6B2611530E6B26198CA7A011698CA7A0149C4EF99表5 密钥改变1bit后的16轮加密结果同样进行弥散特性的定量分析:轮数相等位数轮数相等位数1622553474355286317308329331029112812291329142815361641表6 密钥改变1bit前后的16轮加密结果中相等比特位数与a)和b)中结果比较,1bit密钥的改变对于密文的改变影响同样是很大的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是二维DBSCAN聚类算法MATLAB代码实现。 ``` function [C, idx] = dbscan(X,epsilon,MinPts) % DBSCAN Clustering % % [C, idx] = dbscan(X,epsilon,MinPts) clusters the points in the n-by-p % matrix X using DBSCAN algorithm, where each row represents a point in the % p-dimensional space. % % Input: % X: n-by-p data matrix. % epsilon: the radius of the neighborhood. % MinPts: the minimum number of points in the neighborhood. % % Output: % C: cluster assignments for each point in X. 0 means noise. % idx: indices of the core points. % % Reference: % Martin Ester, Hans-Peter Kriegel, Jorg Sander, and Xiaowei Xu. 1996. % A density-based algorithm for discovering clusters in large spatial databases % with noise. In Proceedings of the 2nd International Conference on Knowledge % Discovery and Data Mining (KDD'96), Evangelos Simoudis, Jiawei Han, and Usama % Fayyad (Eds.). AAAI Press 226-231. n = size(X,1); % Calculate the distance matrix D = squareform(pdist(X)); % Initialize the visited and noise flags visited = false(n,1); noise = false(n,1); % Initialize the cluster assignments C = zeros(n,1); k = 0; % Find the core points for i = 1:n % Find the neighbors within the radius neighbors = find(D(i,:) <= epsilon); % If there are less than MinPts neighbors, mark as noise if numel(neighbors) < MinPts noise(i) = true; else % Mark as core point C(i) = k; % Mark all neighbors as visited visited(i) = true; visited(neighbors) = true; % Find the connected components while ~isempty(neighbors) j = neighbors(1); neighbors(1) = []; % Add j to the current cluster C(j) = k; % If j is a core point, add its neighbors to the list if numel(find(D(j,:) <= epsilon)) >= MinPts neighbors = [neighbors find(D(j,:) <= epsilon)]; end % Mark j as visited visited(j) = true; end % Move to the next cluster k = k + 1; end end % Find the border points for i = 1:n if ~noise(i) && ~visited(i) % Find the neighbors within the radius neighbors = find(D(i,:) <= epsilon); % If there is a core point in the neighborhood, assign to that cluster for j = neighbors if C(j) > 0 C(i) = C(j); break; end end end end % Output the indices of the core points idx = find(~noise); end ``` 在代码中,输入参数X是数据矩阵,epsilon是邻域半径,MinPts是邻域最小点数。输出参数C是数据点的簇分配,0表示噪声点。idx是核心点的索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值