【现代密码学】⽤MATLAB实现RC4算法
【现代密码学】⽤MATLAB实现RC4算法
这篇博客是我的第⼀篇博客,写得不太好,请多多原谅。
我写这篇博客的⽬的主要是因为在⽹上很少有关于RC4算法的MATLAB实现,⽤java、c语⾔等实现的很多。因此我就想⽤MATLAB来实现⼀下,以弥补这空⽩。
RC4算法我在这⾥就不介绍,有兴趣的点,这个链接去了解它的原理吧,链接的那篇博客说的挺好的。
这⾥RC4算法,我写了5个m⽂件函数,分别如下:
rc4.m
—这个⽂件是主函数⽂件,通过调⽤⼀下四个函数m⽂件来实验RC4算法
rc4_decode.m
—这个⽂件是解密函数
rc4_encode.m
—这个⽂件是加密函数
ksa.m
—这个⽂件是密钥调度算法(KSA,Key-Scheduling Algorithm)函数,⽤来置乱S盒的初始排列
prga.m
—这个⽂件是伪随机⽣成算法(PRGA,Pseudo Random-Generation Algorithm)函数,⽤来输出随机序列并修改S的当前排列顺序。
MATLAB代码实现
rc4.m函数⽂件
function ciphertext=RC4Code(plaintext,key,flag)
%RC4加密解密算法,输出密⽂
%plaintext 明⽂字符串
%key 密钥字符串
%flag 决定加密还是解密,0为解密,其他为加密
%made by Canlong Zhang
%初始化密⽂
ciphertext=[];
%s盒
s=[];
%获取明⽂长度
plaintextLength=length(plaintext);
%⽣成的密钥流
keySchedual=[];
%密钥调度算法
s=ksa(s,key);
%RPGA-伪随机⽣成算法
keySchedual=prga(s,keySchedual,plaintextLength);
%将密钥流每个字节转化为ASCII数值
keySchedualtASCII=double(keySchedual);
%如果flag不等于0,则加密,等于0,则解密
if flag~=0
%加密
ciphertext=rc4_encode(plaintext,keySchedualtASCII);
else if flag==0
ciphertext=plaintext;
%解密
rc4_decode(ciphertext,keySchedualtASCII);
end
end
rc4_decode.m函数⽂件
function plaintext2=rc4_decode(ciphertext,keySchedualtASCII)
%解密
%ciphertext 密⽂
%keySchedualtASCII 密钥流的ASCII码
%made by Canlong Zhang
%获取密⽂长度
ciphertextLength=length(ciphertext);
%将明⽂每个字节转化为ASCII数值
ciphertextASCII=double(ciphertext);
plaintext2=[];
%为密⽂的每个字节⽤密钥流加密
for i=1:ciphertextLength
%将密钥流与明⽂字节进⾏异或处理,因为matlab⽆法直接对字节进⾏异或,因此在这⾥对数值进⾏异或处理%bitxor只能对⼗进制数字进⾏异或处理
plaintextXORASCII=bitxor(ciphertextASCII(i),keySchedualtASCII(i));
plaintext2=[plaintext2 char(plaintextXORASCII)];
end
%输出明⽂
disp(['The ciphertext is:',ciphertext])
disp(['The decode plaintext is:',plaintext2])
rc4_encode.m函数⽂件
function ciphertext=rc4_encode(plaintext,keySchedualtASCII)
%加密
%plaintext 明⽂
%keySchedualASCII 密钥流的ASCII码
%made by Canlong Zhang
%初始获密⽂
ciphertext=[];
%获取明⽂长度
plaintextLength=length(plaintext);
%将明⽂每个字节转化为ASCII数值
plaintextASCII=double(plaintext);
ciphertextASCII=1;
%为明⽂的每个字节⽤密钥流加密
for i=1:plaintextLength
%将密钥流与明⽂字节进⾏异或处理,因为matlab⽆法直接对字节进⾏异或,因此在这⾥对数值进⾏异或处理%bitxor只能对⼗进制数字进⾏异或处理
ciphertextXORASCII=bitxor(plaintextASCII(i),keySchedualtASCII(i));
ciphertext=[ciphertext char(ciphertextXORASCII)];
end
%输出密⽂
disp(['The plaintext is:',plaintext])
disp(['The encode ciphertext is:',ciphertext])
ksa.m函数⽂件
function s=ksa(s,key)
%ksa-密钥调度算法-利⽤key来对s盒做⼀下置换,也就是对s和重新排序
%s 输⼊的s盒
%key 密钥字符串
%made by Canlong Zhang
%初始化s盒
for i=1:256
s(i)=i-1;
end
j=1;
%将密钥字符串转化为ascii码数组
keyASCII=double(key);
%获取密钥的长度+1
keyLength=length(key)+1;
for i=1:256
%i对密钥长度+1取余数
modIToKeyLength=mod(i,keyLength);
if modIToKeyLength==0
modIToKeyLength=length(key);
end
j=(j+s(i)+key(modIToKeyLength));
j=mod(j,256);
if j==0
j=256;
end
%将s盒中的⾓标为i和j交换
temp=s(j);
s(j)=s(i);
s(i)=temp;
end
s;
prga.m函数⽂件
function keySchedual=prga(s,keySchedual,plaintextLength)
%PRGA(Pseudo Random-Generation Algorithm)伪随机⽣成算法,⽤来输⼊随机序列并修改s的党旗排列顺序%s s盒
%keySchedual 密钥流
%plaintextLength 明⽂长度
%made by Canlong Zhang
i=1;
j=1;
for k=1:plaintextLength
i=mod(i+1,256);
j=mod(j+s(i),256);
%置换s(i)和s(j)
temp=s(j);
s(j)=s(i);
s(i)=temp;
%⽣成密钥流数组
matlab学好了有什么用keySchedualIndex=mod(s(i)+s(j),256);
%因为matlab的数组的索引是从1开始,因此,在index=0时,把它赋值为256
if keySchedualIndex==0
keySchedualIndex=256;
end
keySchedual=[keySchedual char(s(keySchedualIndex))];
end
keySchedual;
加密解密结果
rc4第三个参数为决定是加密还是解密,如果为0,则是解密,否则是加密。
加密
解密
⼀些问题
编码问题
在运⾏程序之前要在MATLAB软件中输⼊:
slCharacterEncoding('UTF-8');
来设置编码为UTF-8,因为MATLAB默认的编码为ANSI,不然会出现加密或解密乱码,从⽽得不到正确的明⽂或密⽂,也不能⽤来加密或解密中⽂字符了。
注意: 设定编码为UTF-8,这个很重要我曾经由于没有写设置这个编码格式,所以总是加密出来的密
⽂显⽰问号,⽽且加密不了中⽂,这个问题困惑了⼏乎⼀个学期,后来偶然看到有些⼈的程序是有这个设置,因此我也设置了这个,最终我的程序才能运⾏,⽽且才能加密中⽂。
运⾏程序的时候要放在英⽂⽬录下运⾏。
不知道为什么什么在程序运⾏加密解密后,再设置编码输出的中⽂才不会乱。但是如果在运⾏加密解密之前设置了编码再运⾏程序,这是后输出中⽂就会乱,因此为了不乱码,我把输出的全部换成英⽂。
原来输出的代码
没有解决的问题
不知道为什么在输出有中⽂的时候,第⼀次运⾏matlab,先运⾏后,编码,输出中⽂就没有问题:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论