RSA加密算法的matlab实现

标签:
it |
分类: 加密算法 |
最近接触到一些信息安全相关的设计,里面用到了RSA的加密算法,以前听说过这个国际加密算法,感觉很高大上的赶脚,然后就各种google查资料,看了好多的博客,发现其实RSA算法的实现还是挺简单的。
for j=2:i-1
p=mod(i,j);
%===i%j
if
p==0
break;
elseif
j==i-1
index=index+1;
zs(index)=i;
end
end
i=rand()*(index-1);
if
i>10
break;
end
j=rand()*(index-1);
if j>10 &&
round(j+1)~=round(i+1)
break;
end
e=zs(round(rand()*(index-1))+1);%这里找出的e是质数
if(mod(r,e)~=0)
%只要r不是e的倍数就满足条件
break;
end
d=(e_gcd(e,r));
en_info(k)=sym(uint8(info(k)));
tmp(k)=sym(mod(en_info(k)^e,n));
den_info(k)=mod(tmp(k)^d,n);
den_info_c(k)=uint8(den_info(k));
error('the fist argument
should be lower then the second.');
return;
x=x2;
[x3,x]=e_gcd_all(e,r,1);
x=0;
y=1;
return;
一,这里先讲一下RSA秘钥的生成步骤:
1.随意选择两个大的质数p和q,p不等于q,计算N=pq。
2.根据欧拉函数,求得r = (p-1)(q-1) 选择一个小于 r 的整数 e(1
3.将 p 和 q 的记录销毁。
4.得到的{n,e}就是公钥,{n,d}就是私钥。秘钥的位数由n的值决定,与n所占用的二进制位宽相等。如果n=1023,那么秘钥就是10位的。
二,讲一下数据的加密过程。
加密要用到公钥{n,e},假如明文是m(十进制),密文是c(十进制),可以利用公式me ≡
c (mod n)(这个公式中 ≡表示的同余的概念)得到密文c=me %n,就是m的e次方对n求余。
注意:要加密的m的应该小于n,如果大于n
的话就要进行分组切割。
三,讲一下数据的解密过程。
解密要用到私钥{n,d},假如密文是c,可以使用公式cd ≡
m (mod n)得到明文。也就是m= cd%n。
四,贴一下自己写的matlab的验证算法(包括秘钥生成,加密,解密等)
set(0,'RecursionLimit',10000);
clear
all;
clc;
%-----------------------------------------------------
%初始化生成1000以内的质数
index=1;
zs(1)=2;
for
i=3:1000;
end
%---------------------------------------------------
%随机找出一个大的质数p
while(1)
end
%---------------------------------------------------
%随机找出一个大的质数q,且p!=q
while(1)
end
p=zs(round(i+1));%查表获得质数
q=zs(round(j+1));%查表获得质数
%-----------------------------------------------------
%计算n
n=p*q;
%计算(p-1)*(q-1)----------------------------------
r=(p-1)*(q-1);
%----------------------------------------------------
%随机取一个e,满足1
%这里取的是质数,只要r不是e的倍数就满足条件。
while(1)
end
%---------------------------------------
%利用扩张欧几里得算法求取e关于r的模反元素d
if(mod(r,e)~=0)
end
%--------------------------------------
%得到公钥
disp(sprintf('public
key={n,e}={%d,%d} for encryption ',n,e));
%------------------------------------------------
%得到私钥
disp(sprintf('private
key={n,d}={%d,%d} for decryption',n,d));
disp('before
encrypt,the info is:');
%-----------------------------------------
%待加密的信息
info='hello,i
am koala.';
disp(info);
%----------------------------------------
%获得字符串长度
[row,col]=size(info);
for
k=1:col
end
disp(en_info);
%数据采用公钥进行加密--------------------
tic;%加密计时器开始
for
k=1:col
end
disp('after
encrypted,the info is:');
disp(tmp);
toc;%加密计时器结束
%数据采用私钥解密------------------------
tic;%解密计时器开始
for
k=1:col
end
%有符号数字转换成字符--------------------
for
k=1:col
end
disp('after
decrypted,the info is:');
disp(sprintf('%s',den_info_c));
disp(den_info);
toc;%解密计时器结束
%--------------------------------------
%clear
var
clear
j;
clear
k;
clear
index;
clear
row;
clear
tmp;
clear
zs;
clear
info;
clear
col;
clear
i;
clear
den_info;
clear
den_info_c;
clear
en_info;
运行结果如下所示:
这个是自己写的扩展欧几里得算法:
function x= e_gcd(e,r)
%e_gcd Summary of this function goes here
% Detailed explanation goes here
if(e>r)
end
[x3,x2]=e_gcd_all(e,r,0);
if x2>0
else
end
end
function [x,y]= e_gcd_all(e,r,b)
if e==b
end
[x1,y1]=e_gcd_all(mod(r,e),e,b);
x=y1;
y=(1-r*y1)/e;
end