南 华 大 学
网 络 安
题目:RSA加解密算法 姓名 学号:
导师: 全
非对称加密算法的实现
非对称密码系统即公钥密码系统,主流分为基于大整数分解难度,基于离散
一、设计内容、算法原理
对数计算难度和椭圆曲线公钥密码三类。本次实验主要介绍RSA 、ELG加密。 二、RSA
1).RSA公钥密码算法原理和过程:
Alice要求Bob将信息m用RSA方法加密传送回来,
Alice找到大素数p,q, 令n=pq, 取a>1满足 (a,(n))1,再找d使得
da1(mod(n)),然后
Alice将n、a作为加密密钥(公钥)发送给Bob, 这里p,q,
d,(n)都是私钥,要求保密,用作解密。
Bob 将原文m
这里大素数要求足够大,通常要求是大于100位的十进制数。有资料表明,几
十位的素数构造的RSA公钥密码系统是不安全的。因为位数较多,加密效率就不
d
d
并将密文m(modn),
aa
d
ad
EA传送给 Alice。
得到原文
DA(EA)EA(m)m
m
(n)k1
m(modn)
够高,因此,通常用来加密对称密码的密钥,例如,加密序列密码的密钥。
Maple简介:Maple是一个具有强大符号运算能力、图形处理能力的交互式计算机代数系统,它可以进行各种科学计算和数学推理,它的高精度数值计算能力对于处理大数的计算和素性判定有其独特的功能。它适合于所有需要科学计算的人.。
RSA算法可以实现数字签名。 B向A进行签名,则
1、B不能否认进行了签名 2、A不能篡改B的签名
设A(如网站)的公钥为EA,私钥为DA B(签名者)的公钥为 EB,私钥为DB,B的原文m, B用DB作用m , 得到DB(m),再用A提供的EA作用,得到 EA(DB(m))C,B将C和EB发给A, A收到后,先用DA作用于C再用EB作用 EB(DA(C))
B不能否认进行了签名,因为AEB(DA(EA(DB(m))。)这时,m
用B提供的EB算出;A不能篡改B的签名,因为B可以用A提供的EA和DB算出,而A不知道DB,改动后算不出上面等式。 2)、RSA公钥密码算法程序流程 1、A的准备工作
(1) 产生两个u到v位的随机数,如果是偶数,则加1,然后判别是否是
素数,如果是,赋值给p,q
(2) 令n=pq, t=(p-1)(q-1);
(3) 找1amin{p1,q1} 满足 (a,t)1,找一个不能整除t的素数,依次
试除。
(4) 解
ax1(modt)
相当于求解
tyax1
,将 t,a辗转相除,得到
n
利用P01,P1q1,PkqkPk1Pk2,x(1)Pn,再除以q1,q2,,qn,给d
(5) 将公钥 n,a发送给B 2、B的加密过程
t,再赋值
(1) 原文m长度设为56位,远小于n,保证了(m, n)=1, 加密得到密文
sm(modn),分
a
m为十进制数字和字符串两种情况
(2) 将密文s传送给 A。 3、A的解密过程
A收到s后,计算 先分别求解
d
ms(modn)
d
d
得到原文m。直接计算速度太慢,且溢出,
b1s(modp,)b2s(modq),然后利用孙子定理解同余式组
xb1(modp)
,xb2(modq),它的解xM1M1'b1M2M2'b2(modn) 就是原文。
2
反复利用
dr
来计算 m(modp)可以大大加快运行速度。
d
3)、基于RSA算法的数字签名程序流程
B向阿A进行数字签名。 只需A和B都拥有密钥生成、加密和解密程序。 A运行密钥生成程序,将公钥EA ={n,a}发给B, 将私钥DA
密。
B运行密钥生成程序,将公钥EB ={n1,a1}发给A, 将私钥DB
保密。
B计算 签名m
将密文C传送给 A。
A收到后,先计算DA(C)(C)d
(DB)(m
a1
d1
{p,q,d,(n)}保
{p1,q1,d1,(n1)}
再计算C(DB)(modn)并m(modn1),
d1
a
((DB))DB
adad
DB
(n)k1
再计算 DB(modn),
)m
a1a1d1
m
(n1k)
得到签名m(modn1)
1m。
三、ELG
四、设计过程、设计的特点和结果、心得 1)、密钥生成
选出一个大素数 p
选出 d 作为群G 中的一个成员, 使得 1 d p 2 选出 e1作为群 G 中的一个本原根 e2 e1d mod p
C2 P e2r) mod p // C1和C2是密文
Public_key (e1, e2, p) // 公开宣布 Private_key d //保密 2)、解密
P C2 (C1d) 1] mod p // P 是明文 3)、证明
C2 (C1d) 1] mod p =P e2r) (e1dr) 1 mod p = P 五、实现环境
Windows xp
Maple13 + mapletoolbox+matlab 混合编程
六、编写的源程序代码 1、RSA_System
RSA_SYSTEM.m
function varargout = RSA_SYSTEM(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @RSA_SYSTEM_OpeningFcn, ... 'gui_OutputFcn', @RSA_SYSTEM_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
function RSA_SYSTEM_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject; X = imread('back.jpg');
subplot('position',[-0.00,-0.3,1.0,1.6]); imagesc(X); colormap(gray); axis image off;
guidata(hObject, handles);
function varargout = RSA_SYSTEM_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
function primeP_Callback(hObject, eventdata, handles)
function primeP_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
function primeQ_Callback(hObject, eventdata, handles)
function primeQ_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function phN_Callback(hObject, eventdata, handles)
function phN_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function publicN_Callback(hObject, eventdata, handles)
function publicN_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function PruducPrime_Callback(hObject, eventdata, handles)
P=maple('nextprime(rand(10^120)())'); Q=maple('nextprime(rand(10^120)())'); N=P*Q;
phN=(Q-1)*(P-1);
set(handles.primeP,'String',char(P)) set(handles.primeQ,'String',char(Q)) set(handles.publicN,'String',char(N)) set(handles.phN,'String',char(phN)) set(handles.Private_Key,'Enable','on'); set(handles.Selecte_String,'Enable','on'); set(handles.SelecteNum,'Enable','on'); %计算私钥d global d e e=2^16+1; format rat E=1/e;
setmaple('e',e); setmaple('E',E); setmaple('n2',phN); setmaple('n',N);
d=maple('convert(E,rational) mod n2'); setmaple('d',d);
function SelecteNum_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile; if FilterIndex~=0 global m
im=importdata(strcat(PathName,FileName)); is=isa(im,'cell'); if is==0
m=csvread(strcat(PathName,FileName)); set(handles.Num_Secret,'Enable','on'); end if is==1
msgbox('请选择数字型文件!','警告:'); end end
function Num_Secret_Callback(hObject, eventdata, handles)
fidout=fopen('密文.txt','w'); global m
for i=1:length(m) M=m(i);
setmaple('m',M);
C=maple('Power(m,e) mod n');
fprintf(fidout,'%s\n\n',char(C)); end
msgbox('恭喜!你已成功加密,产生文件为"密文.txt"','温馨提示:'); set(handles.Num_CodeBreak,'Enable','on');
function Num_CodeBreak_Callback(hObject, eventdata, handles)
%以下是解密过程
fidin=fopen('密文.txt'); fidout=fopen('明文.txt','w');
while ~feof(fidin) % 判断是否为文件末尾
tline=fgetl(fidin); % 从文件读行 if isempty(tline)==0 %若该行非空 midvar=sscanf(tline,'%f'); setmaple('C',tline); m=maple('Power(C,d) mod n')
fprintf(fidout,'%s\n\n',char(m)); end
continue % 如果是非数字继续下一次循环 end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文.txt"','温馨提示:'); set(handles.Num_CodeBreak,'Enable','off'); set(handles.Num_Secret,'Enable','off');
function Selecte_String_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile; if FilterIndex~=0 global path
path=strcat(PathName,FileName);
set(handles.String_Secret,'Enable','on'); end
function String_Secret_Callback(hObject, eventdata, handles)
global path
a=importdata(path,'%s'); is=isa(a,'double'); if is ~= 1 b=cell2mat(a); mm=double(b);
fidout1=fopen('密文1.txt','w'); for i=1:length(mm) M=mm(i);
setmaple('m',M);
C=maple('convert((Power(m,e) mod n),binary)'); fprintf(fidout1,'%s\n\n',char(C)); end
msgbox('恭喜!你已成功加密,产生文件为"密文1.txt"','温馨提示:'); set(handles.String_CodeBreak,'Enable','on'); end if is==1
msgbox('请选择字符型文件!','警告:'); set(handles.String_Secret,'Enable','off'); end
function String_CodeBreak_Callback(hObject, eventdata, handles)
fidin=fopen('密文1.txt'); fidout=fopen('明文1.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 if isempty(tline)==0 %若该行非空 midvar=sscanf(tline,'%f'); setmaple('C',tline);
m=maple('Power(convert(C,decimal,binary),d) mod n'); m=double(m); m=char(m);
fprintf(fidout,'%s',m); end
continue % 如果是非数字继续下一次循环 end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文1.txt"','温馨提示:'); set(handles.String_CodeBreak,'Enable','off'); set(handles.String_Secret,'Enable','off');
function Private_Key_Callback(hObject, eventdata, handles) global d
set(handles.privateKey,'String',char(d));
function privateKey_Callback(hObject, eventdata, handles)
function privateKey_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end %
-------------------------------------------------------------------- function Open_Callback(hObject, eventdata, handles) uiopen;
%
-------------------------------------------------------------------- function Close_Callback(hObject, eventdata, handles) close(gcf); %
-------------------------------------------------------------------- function ELG_Callback(hObject, eventdata, handles) ELG_SYSTEM
delete(handles.RSA_SYSTEM);
2、ELG_System
ELG_SYSTEM.m
function varargout = ELG_SYSTEM(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @ELG_SYSTEM_OpeningFcn, ... 'gui_OutputFcn', @ELG_SYSTEM_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
function ELG_SYSTEM_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject; X = imread('key.jpg');
subplot('position',[-0.00,-0.4,1.4,1.7]); imagesc(X); colormap(gray); axis image off;
guidata(hObject, handles);
function varargout = ELG_SYSTEM_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%
--------------------------------------------------------------------
function Open_Callback(hObject, eventdata, handles)
uiopen;
%
--------------------------------------------------------------------
function Close_Callback(hObject, eventdata, handles)
close(gcf);
%
--------------------------------------------------------------------
function RSA_Callback(hObject, eventdata, handles)
RSA_SYSTEM
delete(handles.ELG_SYSTEM);
function primeP_Callback(hObject, eventdata, handles)
function primeP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function public_ha_Callback(hObject, eventdata, handles)
function public_ha_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Produce_PublicKey_Callback(hObject, eventdata, handles)
function ProduecPublicKey_Callback(hObject, eventdata, handles)
global xa p ha
p=maple('m := proc (n) global a, q; for a do q := nextprime((rand(10^n))());
if isprime(4*q+1) = true then break end if end do; 4*q+1 end proc; m(150)');
setmaple('p',p);
set(handles.primeP,'String',char(p));
xa=maple('rand(10^100)()');
setmaple('xa',xa);
ha=maple('2 &^ xa mod p');
setmaple('ha',ha);
set(handles.public_ha,'String',char(ha));
set(handles.PrivateOut,'Enable','on');
set(handles.Select_String,'Enable','on');
set(handles.Select_Num,'Enable','on');
function Select_Num_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile;
if FilterIndex~=0
global m
im=importdata(strcat(PathName,FileName));
is=isa(im,'cell');
if is==0
m=csvread(strcat(PathName,FileName));
set(handles.Code_Num,'Enable','on');
end
if is==1
msgbox('请选择数字型文件!','警告:');
end
end
function Code_Num_Callback(hObject, eventdata, handles)
fidout=fopen('密文.txt','w');
global m
for i=1:length(m)
M=m(i);
setmaple('m',M);
k=maple('rand(10^150)()');
setmaple('k',k);
U=maple('2 &^ k mod p');
v=maple('ha &^ k mod p');
setmaple('v',v);
V=maple('m*v mod p');
fprintf(fidout,'%s\n',char(U));
fprintf(fidout,'%s\n\n',char(V));
end
msgbox('恭喜!你已成功加密,产生文件为"密文.txt"','温馨提示:');
set(handles.Break_Num,'Enable','on');
function Break_Num_Callback(hObject, eventdata, handles)
%以下是解密过程
fidin=fopen('密文.txt');
fidout=fopen('明文.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行
if isempty(tline)==0 %若该行非空
t1line='';
midvar=sscanf(tline,'%f');
t1line=tline;
tline=fgetl(fidin);
midvar=sscanf(tline,'%f');
setmaple('C1',t1line);
setmaple('C2',tline);
m=maple('convert(C2/C1 &^ xa, rational) mod p');
fprintf(fidout,'%s\n\n',char(m));
end
continue % 如果是非数字继续下一次
循环
end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文.txt"','温馨提示:');
set(handles.Code_Num,'Enable','off');
set(handles.Break_Num,'Enable','off');
% --- Executes on button press in Select_String.
function Select_String_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile;
if FilterIndex~=0
global path
path=strcat(PathName,FileName);
set(handles.Code_String,'Enable','on');
end
% --- Executes on button press in Code_String.
function Code_String_Callback(hObject, eventdata, handles)
global path
a=importdata(path,'%s');
is=isa(a,'double');
if is ~= 1
b=cell2mat(a);
mm=double(b);
fidout1=fopen('密文1.txt','w');
for i=1:length(mm)
M=mm(i);
setmaple('m',M);
k=maple('rand(10^150)()');
setmaple('k',k);
U=maple('convert(2 &^ k mod p,binary)');
v=maple('ha &^ k mod p');
setmaple('v',v);
V=maple('convert(m*v mod p,binary)');
fprintf(fidout1,'%s\n',char(U));
fprintf(fidout1,'%s\n\n',char(V));
end
msgbox('恭喜!你已成功加密,产生文件为"密文1.txt"','温馨提示:');
set(handles.Break_String,'Enable','on');
end
if is==1
msgbox('请选择字符型文件!','警告:');
set(handles.Break_String,'Enable','off');
end
% --- Executes on button press in Break_String.
function Break_String_Callback(hObject, eventdata, handles)
fidin=fopen('密文1.txt');
fidout=fopen('明文1.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行
if isempty(tline)==0 %若该行非空
t1line='';
midvar=sscanf(tline,'%f');
t1line=tline;
tline=fgetl(fidin);
midvar=sscanf(tline,'%f');
setmaple('C1',t1line);
setmaple('C2',tline);
% m=maple('Power(convert(C2,decimal,binary),d) mod n');
m=maple('convert(convert(C2,decimal,binary)/convert(C1,decimal,binary)
&^ xa, rational) mod p');
m=double(m);
m=char(m);
fprintf(fidout,'%s',m);
end
continue % 如果是非数字继续下一次
循环
end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文1.txt"','温馨提示:');
set(handles.Code_String,'Enable','off');
set(handles.Break_String,'Enable','off');
% --- Executes on button press in PrivateOut.
function PrivateOut_Callback(hObject, eventdata, handles)
global xa
set(handles.Private_Key,'String',char(xa));
function Private_Key_Callback(hObject, eventdata, handles)
function Private_Key_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
附:RSA运行演示(ELG类似
)
南 华 大 学
网 络 安
题目:RSA加解密算法 姓名 学号:
导师: 全
非对称加密算法的实现
非对称密码系统即公钥密码系统,主流分为基于大整数分解难度,基于离散
一、设计内容、算法原理
对数计算难度和椭圆曲线公钥密码三类。本次实验主要介绍RSA 、ELG加密。 二、RSA
1).RSA公钥密码算法原理和过程:
Alice要求Bob将信息m用RSA方法加密传送回来,
Alice找到大素数p,q, 令n=pq, 取a>1满足 (a,(n))1,再找d使得
da1(mod(n)),然后
Alice将n、a作为加密密钥(公钥)发送给Bob, 这里p,q,
d,(n)都是私钥,要求保密,用作解密。
Bob 将原文m
这里大素数要求足够大,通常要求是大于100位的十进制数。有资料表明,几
十位的素数构造的RSA公钥密码系统是不安全的。因为位数较多,加密效率就不
d
d
并将密文m(modn),
aa
d
ad
EA传送给 Alice。
得到原文
DA(EA)EA(m)m
m
(n)k1
m(modn)
够高,因此,通常用来加密对称密码的密钥,例如,加密序列密码的密钥。
Maple简介:Maple是一个具有强大符号运算能力、图形处理能力的交互式计算机代数系统,它可以进行各种科学计算和数学推理,它的高精度数值计算能力对于处理大数的计算和素性判定有其独特的功能。它适合于所有需要科学计算的人.。
RSA算法可以实现数字签名。 B向A进行签名,则
1、B不能否认进行了签名 2、A不能篡改B的签名
设A(如网站)的公钥为EA,私钥为DA B(签名者)的公钥为 EB,私钥为DB,B的原文m, B用DB作用m , 得到DB(m),再用A提供的EA作用,得到 EA(DB(m))C,B将C和EB发给A, A收到后,先用DA作用于C再用EB作用 EB(DA(C))
B不能否认进行了签名,因为AEB(DA(EA(DB(m))。)这时,m
用B提供的EB算出;A不能篡改B的签名,因为B可以用A提供的EA和DB算出,而A不知道DB,改动后算不出上面等式。 2)、RSA公钥密码算法程序流程 1、A的准备工作
(1) 产生两个u到v位的随机数,如果是偶数,则加1,然后判别是否是
素数,如果是,赋值给p,q
(2) 令n=pq, t=(p-1)(q-1);
(3) 找1amin{p1,q1} 满足 (a,t)1,找一个不能整除t的素数,依次
试除。
(4) 解
ax1(modt)
相当于求解
tyax1
,将 t,a辗转相除,得到
n
利用P01,P1q1,PkqkPk1Pk2,x(1)Pn,再除以q1,q2,,qn,给d
(5) 将公钥 n,a发送给B 2、B的加密过程
t,再赋值
(1) 原文m长度设为56位,远小于n,保证了(m, n)=1, 加密得到密文
sm(modn),分
a
m为十进制数字和字符串两种情况
(2) 将密文s传送给 A。 3、A的解密过程
A收到s后,计算 先分别求解
d
ms(modn)
d
d
得到原文m。直接计算速度太慢,且溢出,
b1s(modp,)b2s(modq),然后利用孙子定理解同余式组
xb1(modp)
,xb2(modq),它的解xM1M1'b1M2M2'b2(modn) 就是原文。
2
反复利用
dr
来计算 m(modp)可以大大加快运行速度。
d
3)、基于RSA算法的数字签名程序流程
B向阿A进行数字签名。 只需A和B都拥有密钥生成、加密和解密程序。 A运行密钥生成程序,将公钥EA ={n,a}发给B, 将私钥DA
密。
B运行密钥生成程序,将公钥EB ={n1,a1}发给A, 将私钥DB
保密。
B计算 签名m
将密文C传送给 A。
A收到后,先计算DA(C)(C)d
(DB)(m
a1
d1
{p,q,d,(n)}保
{p1,q1,d1,(n1)}
再计算C(DB)(modn)并m(modn1),
d1
a
((DB))DB
adad
DB
(n)k1
再计算 DB(modn),
)m
a1a1d1
m
(n1k)
得到签名m(modn1)
1m。
三、ELG
四、设计过程、设计的特点和结果、心得 1)、密钥生成
选出一个大素数 p
选出 d 作为群G 中的一个成员, 使得 1 d p 2 选出 e1作为群 G 中的一个本原根 e2 e1d mod p
C2 P e2r) mod p // C1和C2是密文
Public_key (e1, e2, p) // 公开宣布 Private_key d //保密 2)、解密
P C2 (C1d) 1] mod p // P 是明文 3)、证明
C2 (C1d) 1] mod p =P e2r) (e1dr) 1 mod p = P 五、实现环境
Windows xp
Maple13 + mapletoolbox+matlab 混合编程
六、编写的源程序代码 1、RSA_System
RSA_SYSTEM.m
function varargout = RSA_SYSTEM(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @RSA_SYSTEM_OpeningFcn, ... 'gui_OutputFcn', @RSA_SYSTEM_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
function RSA_SYSTEM_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject; X = imread('back.jpg');
subplot('position',[-0.00,-0.3,1.0,1.6]); imagesc(X); colormap(gray); axis image off;
guidata(hObject, handles);
function varargout = RSA_SYSTEM_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
function primeP_Callback(hObject, eventdata, handles)
function primeP_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
function primeQ_Callback(hObject, eventdata, handles)
function primeQ_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function phN_Callback(hObject, eventdata, handles)
function phN_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function publicN_Callback(hObject, eventdata, handles)
function publicN_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
function PruducPrime_Callback(hObject, eventdata, handles)
P=maple('nextprime(rand(10^120)())'); Q=maple('nextprime(rand(10^120)())'); N=P*Q;
phN=(Q-1)*(P-1);
set(handles.primeP,'String',char(P)) set(handles.primeQ,'String',char(Q)) set(handles.publicN,'String',char(N)) set(handles.phN,'String',char(phN)) set(handles.Private_Key,'Enable','on'); set(handles.Selecte_String,'Enable','on'); set(handles.SelecteNum,'Enable','on'); %计算私钥d global d e e=2^16+1; format rat E=1/e;
setmaple('e',e); setmaple('E',E); setmaple('n2',phN); setmaple('n',N);
d=maple('convert(E,rational) mod n2'); setmaple('d',d);
function SelecteNum_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile; if FilterIndex~=0 global m
im=importdata(strcat(PathName,FileName)); is=isa(im,'cell'); if is==0
m=csvread(strcat(PathName,FileName)); set(handles.Num_Secret,'Enable','on'); end if is==1
msgbox('请选择数字型文件!','警告:'); end end
function Num_Secret_Callback(hObject, eventdata, handles)
fidout=fopen('密文.txt','w'); global m
for i=1:length(m) M=m(i);
setmaple('m',M);
C=maple('Power(m,e) mod n');
fprintf(fidout,'%s\n\n',char(C)); end
msgbox('恭喜!你已成功加密,产生文件为"密文.txt"','温馨提示:'); set(handles.Num_CodeBreak,'Enable','on');
function Num_CodeBreak_Callback(hObject, eventdata, handles)
%以下是解密过程
fidin=fopen('密文.txt'); fidout=fopen('明文.txt','w');
while ~feof(fidin) % 判断是否为文件末尾
tline=fgetl(fidin); % 从文件读行 if isempty(tline)==0 %若该行非空 midvar=sscanf(tline,'%f'); setmaple('C',tline); m=maple('Power(C,d) mod n')
fprintf(fidout,'%s\n\n',char(m)); end
continue % 如果是非数字继续下一次循环 end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文.txt"','温馨提示:'); set(handles.Num_CodeBreak,'Enable','off'); set(handles.Num_Secret,'Enable','off');
function Selecte_String_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile; if FilterIndex~=0 global path
path=strcat(PathName,FileName);
set(handles.String_Secret,'Enable','on'); end
function String_Secret_Callback(hObject, eventdata, handles)
global path
a=importdata(path,'%s'); is=isa(a,'double'); if is ~= 1 b=cell2mat(a); mm=double(b);
fidout1=fopen('密文1.txt','w'); for i=1:length(mm) M=mm(i);
setmaple('m',M);
C=maple('convert((Power(m,e) mod n),binary)'); fprintf(fidout1,'%s\n\n',char(C)); end
msgbox('恭喜!你已成功加密,产生文件为"密文1.txt"','温馨提示:'); set(handles.String_CodeBreak,'Enable','on'); end if is==1
msgbox('请选择字符型文件!','警告:'); set(handles.String_Secret,'Enable','off'); end
function String_CodeBreak_Callback(hObject, eventdata, handles)
fidin=fopen('密文1.txt'); fidout=fopen('明文1.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 if isempty(tline)==0 %若该行非空 midvar=sscanf(tline,'%f'); setmaple('C',tline);
m=maple('Power(convert(C,decimal,binary),d) mod n'); m=double(m); m=char(m);
fprintf(fidout,'%s',m); end
continue % 如果是非数字继续下一次循环 end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文1.txt"','温馨提示:'); set(handles.String_CodeBreak,'Enable','off'); set(handles.String_Secret,'Enable','off');
function Private_Key_Callback(hObject, eventdata, handles) global d
set(handles.privateKey,'String',char(d));
function privateKey_Callback(hObject, eventdata, handles)
function privateKey_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end %
-------------------------------------------------------------------- function Open_Callback(hObject, eventdata, handles) uiopen;
%
-------------------------------------------------------------------- function Close_Callback(hObject, eventdata, handles) close(gcf); %
-------------------------------------------------------------------- function ELG_Callback(hObject, eventdata, handles) ELG_SYSTEM
delete(handles.RSA_SYSTEM);
2、ELG_System
ELG_SYSTEM.m
function varargout = ELG_SYSTEM(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @ELG_SYSTEM_OpeningFcn, ... 'gui_OutputFcn', @ELG_SYSTEM_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
function ELG_SYSTEM_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject; X = imread('key.jpg');
subplot('position',[-0.00,-0.4,1.4,1.7]); imagesc(X); colormap(gray); axis image off;
guidata(hObject, handles);
function varargout = ELG_SYSTEM_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%
--------------------------------------------------------------------
function Open_Callback(hObject, eventdata, handles)
uiopen;
%
--------------------------------------------------------------------
function Close_Callback(hObject, eventdata, handles)
close(gcf);
%
--------------------------------------------------------------------
function RSA_Callback(hObject, eventdata, handles)
RSA_SYSTEM
delete(handles.ELG_SYSTEM);
function primeP_Callback(hObject, eventdata, handles)
function primeP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function public_ha_Callback(hObject, eventdata, handles)
function public_ha_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Produce_PublicKey_Callback(hObject, eventdata, handles)
function ProduecPublicKey_Callback(hObject, eventdata, handles)
global xa p ha
p=maple('m := proc (n) global a, q; for a do q := nextprime((rand(10^n))());
if isprime(4*q+1) = true then break end if end do; 4*q+1 end proc; m(150)');
setmaple('p',p);
set(handles.primeP,'String',char(p));
xa=maple('rand(10^100)()');
setmaple('xa',xa);
ha=maple('2 &^ xa mod p');
setmaple('ha',ha);
set(handles.public_ha,'String',char(ha));
set(handles.PrivateOut,'Enable','on');
set(handles.Select_String,'Enable','on');
set(handles.Select_Num,'Enable','on');
function Select_Num_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile;
if FilterIndex~=0
global m
im=importdata(strcat(PathName,FileName));
is=isa(im,'cell');
if is==0
m=csvread(strcat(PathName,FileName));
set(handles.Code_Num,'Enable','on');
end
if is==1
msgbox('请选择数字型文件!','警告:');
end
end
function Code_Num_Callback(hObject, eventdata, handles)
fidout=fopen('密文.txt','w');
global m
for i=1:length(m)
M=m(i);
setmaple('m',M);
k=maple('rand(10^150)()');
setmaple('k',k);
U=maple('2 &^ k mod p');
v=maple('ha &^ k mod p');
setmaple('v',v);
V=maple('m*v mod p');
fprintf(fidout,'%s\n',char(U));
fprintf(fidout,'%s\n\n',char(V));
end
msgbox('恭喜!你已成功加密,产生文件为"密文.txt"','温馨提示:');
set(handles.Break_Num,'Enable','on');
function Break_Num_Callback(hObject, eventdata, handles)
%以下是解密过程
fidin=fopen('密文.txt');
fidout=fopen('明文.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行
if isempty(tline)==0 %若该行非空
t1line='';
midvar=sscanf(tline,'%f');
t1line=tline;
tline=fgetl(fidin);
midvar=sscanf(tline,'%f');
setmaple('C1',t1line);
setmaple('C2',tline);
m=maple('convert(C2/C1 &^ xa, rational) mod p');
fprintf(fidout,'%s\n\n',char(m));
end
continue % 如果是非数字继续下一次
循环
end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文.txt"','温馨提示:');
set(handles.Code_Num,'Enable','off');
set(handles.Break_Num,'Enable','off');
% --- Executes on button press in Select_String.
function Select_String_Callback(hObject, eventdata, handles)
[FileName,PathName,FilterIndex] = uigetfile;
if FilterIndex~=0
global path
path=strcat(PathName,FileName);
set(handles.Code_String,'Enable','on');
end
% --- Executes on button press in Code_String.
function Code_String_Callback(hObject, eventdata, handles)
global path
a=importdata(path,'%s');
is=isa(a,'double');
if is ~= 1
b=cell2mat(a);
mm=double(b);
fidout1=fopen('密文1.txt','w');
for i=1:length(mm)
M=mm(i);
setmaple('m',M);
k=maple('rand(10^150)()');
setmaple('k',k);
U=maple('convert(2 &^ k mod p,binary)');
v=maple('ha &^ k mod p');
setmaple('v',v);
V=maple('convert(m*v mod p,binary)');
fprintf(fidout1,'%s\n',char(U));
fprintf(fidout1,'%s\n\n',char(V));
end
msgbox('恭喜!你已成功加密,产生文件为"密文1.txt"','温馨提示:');
set(handles.Break_String,'Enable','on');
end
if is==1
msgbox('请选择字符型文件!','警告:');
set(handles.Break_String,'Enable','off');
end
% --- Executes on button press in Break_String.
function Break_String_Callback(hObject, eventdata, handles)
fidin=fopen('密文1.txt');
fidout=fopen('明文1.txt','w');
while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行
if isempty(tline)==0 %若该行非空
t1line='';
midvar=sscanf(tline,'%f');
t1line=tline;
tline=fgetl(fidin);
midvar=sscanf(tline,'%f');
setmaple('C1',t1line);
setmaple('C2',tline);
% m=maple('Power(convert(C2,decimal,binary),d) mod n');
m=maple('convert(convert(C2,decimal,binary)/convert(C1,decimal,binary)
&^ xa, rational) mod p');
m=double(m);
m=char(m);
fprintf(fidout,'%s',m);
end
continue % 如果是非数字继续下一次
循环
end
fclose(fidout);
msgbox('恭喜!你已成功解密,产生文件为"明文1.txt"','温馨提示:');
set(handles.Code_String,'Enable','off');
set(handles.Break_String,'Enable','off');
% --- Executes on button press in PrivateOut.
function PrivateOut_Callback(hObject, eventdata, handles)
global xa
set(handles.Private_Key,'String',char(xa));
function Private_Key_Callback(hObject, eventdata, handles)
function Private_Key_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
附:RSA运行演示(ELG类似
)