MATLAB实现RSA算法

RSA算法

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2×e1)≡1(mod(p-1)×(q-1))。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A≡B^e2( mod n);B≡A^e1 (mod n);(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A≡B^e1 (mod n);B≡A^e2( mod n);

其他更多关于RSA算法请见百度


MATLAB实现

       这里就直接列代码出来了,目前只能实现RSA加密,还不能实现解密,因为解密的时候由于得出来的密钥的e2(d)太大,导致密文的密钥的次方太大,超出了MATLAB默认的数值范围,所以是不能解密。

function encode_decode=myrsa(plaintextORciphertext,p,q,flag,eORd)
%p q 输入的两个素数
%当flag!=0时,eORd为与p-1)(q-1)的最小公倍数L互素的数,且小于L,即为公钥
%当flag=0时,eORd为私钥
%flag等于0时为解密,不等于0时为加密。默认为加密;
%made by Canlong Zhang
%date 2017.12.20 17:03:01

%设置编码为utf-8
slCharacterEncoding('UTF-8');
%如果输入的参数少于4个那么就默认是加密
if nargin<4 
    flag=1;
   end;
%公钥n
n=p*q;
%如果flag不等于0,则是加密
if flag~=0
    %输入的为明文
    plaintext=plaintextORciphertext;
    %求fai=(p-1)(q-1)
    fai=(p-1)*(q-1);
    %如果加密的时候没有给出公钥e,则求公钥
    if nargin<5 
    for i=2:fai
       if gcd(i,fai)==1&i<fai
           eORd=i;
           break;
       end
    end
    end
    e=eORd;
    %计算出私钥
    for j=3:fai
        if mod(e*j,fai)==1
            %密钥d
            d=j;
            break;
        end
    end
    %遍历明文
    plaintextLength=length(plaintextORciphertext);
    %将密文转化为ascii码
    plaintextASCII = double(plaintext);
    %加密
    ciphertextASCII=mod(plaintextASCII.^e,n);
    ciphertext=char(ciphertextASCII);
    fprintf('The ciphertext is: %s\n',ciphertext);
    fprintf('The public key is:n=%d,e=%d\n',n,e);
    fprintf('The private key is:n=%d,d=%d\n',n,d);
%如果flag为0,则是解密
else if flag==0
        if nargin<5 
            error('加密时,输入参数错误,输入参数应该等于5') 
        end
        %输入的密文
        ciphertext=plaintextORciphertext;
        %公钥n
        n=p*q;
        %私钥d
        d=eORd;
        %解密
        ciphertextASCII=double(ciphertext);
        plaintextASCII=mod(ciphertextASCII.^d,n);
        plaintext=char(plaintextASCII);
        fprintf('The plaintext is: %s\n',plaintext);
        fprintf('The private key is:n=%d,d=%d\n',n,d)
    end
end

提供一个下载链接。
http://kanlon.ink/Canlong/Canlong.zip
后期有时间,我会继续改进的。

  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值