資源簡介
用matlab實現hill密碼 帶源碼
辛辛苦苦寫的,只供參考
希望對您有寫幫助

代碼片段和文件信息
function?hill()
%輸入密鑰
disp(‘輸入密鑰(矩陣)的維數‘);
n=input(‘‘);
disp(‘輸入密鑰(矩陣按行輸入)‘);
key=zeros(nn);
for?j=1:n
????for?k=1:n
????key(jk)=input(‘‘);
????end
end
d=det(key);%求矩陣的行列式
if?d==0%判斷矩陣是否可逆
????error(‘密鑰矩陣不可逆,無法實現Hill密碼‘);
end
i=1;%歐幾里德算法
r0=26;
r1=d;
w=zeros(126);
while?mod(r0r1)~=0
????w(i)=fix(r0/r1);
????tmp=r0;
????r0=r1;
????r1=mod(tmpr1);
????i=i+1;
end
i=i-1;r0=1;r1=1;
while?i>0
????tmp=r0;
????r0=r1;
????r1=tmp+w(i)*r1;
????i=i-1;
end
%r1為d的逆
if?r1==0
????error(‘密鑰矩陣不可逆,無法實現Hill密碼‘);
end
d=r1;
%輸入明文
message=input(‘輸入明文?\n‘‘s‘);
m=size(message);
m=m(2);
if?mod(mn)~=0
????error(‘輸入錯誤,明文長度應為矩陣維數的倍數‘);
end
for?i=1:m
????if?message(i)>=‘a‘?&&?message(i)<=‘z‘
????????message(i)=message(i)-97;
????elseif?message(i)>=‘A‘?&&?message(i)<=‘Z‘
????????message(i)=message(i)-65;
????else
????????error(‘輸入錯誤,應該輸入字母‘);
????end
end
%加密
i=1;
while?i ????A(i:i+n-1)=message(i:i+n-1)*key;
????i=i+n;
end
for?i=1:m
????if?A(i)>26
????????A(i)=mod(A(i)26);
????end
????A(i)=A(i)+97;
end
str=char(A);
fprintf(‘密文為%s‘str);
%解密
k=1;
b=zeros(n-1n-1);
for?i=1:n?????????????????????%求逆矩陣
????for?j=1:n
????????for?p=1:n
????????????for?q=1:n
????????????????if?p~=i?&&?q~=j
????????????????????if?p>i
????????????????????????k1=p-1;
????????????????????else
????????????????????????k1=p;
????????????????????end
????????????????????if?q>j
????????????????????????k2=q-1;
????????????????????else
????????????????????????k2=q;
????????????????????end
????????????????????b(k1k2)=key(pq);
????????????????end
????????????end
????????end
?????????tmp=(-1)^(i+j)*det(b);
?????????tmp=mod(tmp26);
?????????if?tmp<0
?????????????tmp=tmp+26;
?????????end
?????????key2(ij)=tmp;
????end
end
key2=d*key2‘;
for?i=1:n
????for?j=1:n
????????key(ij)=mod(key(ij)26);
????????if?key(ij)<0
????????????key(ij)=key(ij)+26;
????????end
????end
end
for?i=1:m
????A(i)=A(i)-97;
end
i=1;
while?i ????B(i:i+n-1)=A(i:i+n-1)*key2;
????i=i+n;
end
for?i=1:m
????if?B(i)>26
????????B(i)=mod(B(i)26);
????end
????B(i)=B(i)+97;
end
str2=char(B);
fprintf(‘\n對密文解密后明文為%s\n‘str2)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2181??2008-11-22?20:27??Hill密碼\hill.asv
?????文件???????2327??2008-11-22?22:14??Hill密碼\hill.m
?????目錄??????????0??2008-11-22?20:57??Hill密碼
-----------?---------??----------?-----??----
?????????????????4508????????????????????3
評論
共有 條評論