加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RSA加密算法的matlab实现

(2015-10-19 15:13:37)
标签:

it

分类: 加密算法
最近接触到一些信息安全相关的设计,里面用到了RSA的加密算法,以前听说过这个国际加密算法,感觉很高大上的赶脚,然后就各种google查资料,看了好多的博客,发现其实RSA算法的实现还是挺简单的。
一,这里先讲一下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;
   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
end
%---------------------------------------------------
%随机找出一个大的质数p
while(1)
  i=rand()*(index-1);
  if i>10
      break;
  end
end
%---------------------------------------------------
%随机找出一个大的质数q,且p!=q
while(1)
    j=rand()*(index-1);
    if j>10 && round(j+1)~=round(i+1)
        break;
    end
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)
  
    e=zs(round(rand()*(index-1))+1);%这里找出的e是质数
    if(mod(r,e)~=0)    %只要r不是e的倍数就满足条件
        break;
    end
end
%---------------------------------------
%利用扩张欧几里得算法求取e关于r的模反元素d
if(mod(r,e)~=0)
    d=(e_gcd(e,r));
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
    en_info(k)=sym(uint8(info(k)));
end
disp(en_info);

%数据采用公钥进行加密--------------------
tic;%加密计时器开始
for k=1:col
    tmp(k)=sym(mod(en_info(k)^e,n));
end
disp('after encrypted,the info is:');
disp(tmp);  
toc;%加密计时器结束
%数据采用私钥解密------------------------
tic;%解密计时器开始
for k=1:col 
    den_info(k)=mod(tmp(k)^d,n);
end
%有符号数字转换成字符--------------------
for k=1:col 
    den_info_c(k)=uint8(den_info(k));
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)
    error('the fist argument should be lower then the second.');
    return;
end
[x3,x2]=e_gcd_all(e,r,0);
if x2>0
    x=x2;
else
    [x3,x]=e_gcd_all(e,r,1);
end
end

function [x,y]= e_gcd_all(e,r,b)

if e==b
     x=0;
     y=1;
  return;
end

[x1,y1]=e_gcd_all(mod(r,e),e,b);

x=y1;

y=(1-r*y1)/e;

end

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有