在谈到图像加密之前,我先让大家简单了解一下密码学的基本原理。下面我先将一个小故事:
王二狗是狗国军队里的一个师长。现在,他正在和奥三驴领导的驴国军队打仗。他想今晚偷袭驴军军营。但是他需要张五猫领导的猫国军队的支援。他需要送一封信给张五猫。信的内容是“Attack the enemy together tonight”,意思是今晚一起偷袭敌军。他让警卫员王三狗前去送信,但是加入这封信被驴国军队截了,就会..................
驴国军队就会先下手为强,将猫狗两国各个击破。于是他事先和张五猫约定。然后把信改成了“cwufdnumfgoiobutigumfuutplmv”然后叫警卫员送了出去。想必大家现在是
没事,奥三驴也是一脸懵逼。且听我细细道来,原来,王二狗和张五猫事先约定密码是2315。发信息的将真实信息按照这个密码,每个字母移动相应的位数。比如按照26个字母的排序abcdefghijklmnopqrstuvwxyz。attack里面的a就应该改成c,而t应该改成w。依此类推。如果超过了26个字母,就返回a。张五猫收到信息后向前反推,就知道了真实意思。这就是密码学的基本原理。
下面我给大家讲一讲图像加密
这就是简单加密后的女神图片。因为设置的密码比较简单,所以大家还能分辨出来,如果密码复杂就会变成这样
完全看不清楚,其实原理和上面说过的王二狗加密是一样的,因为图像的本质是就是一个大矩阵。里面的数字都是1--256的,彩色图像由三维矩阵构成,我们按照一个密码,比如[3,5,8,12,6,8]。将矩阵中的数字按顺序向后移动,就会将图像变得模糊不清。首先是载入图片,将图片名字改成"12.jpg",img=imread('12.jpg')。然后就可以运算了。代码使用了for循环实现加密
代码语言:javascript复制img=imread('12.jpg');%img代表原图像矩阵
img=double(img);
img_1=img(:);%img_1代表拉直后的图像矩阵
%password=[2,5,8,12,14,16,19,23,25,27,29,34,36,45,6,1,3,4,5,8,5,13];
password=randperm(256);
[m,n]=size(password);%密码的长和宽
for i=1:n
password(i)=password(i)^2 25;
end
img_new=zeros(size(img));%新图像的矩阵
c1=zeros(size(img));
j=1;
for i=1:size(img_1)
img_new(i)=password(j) img_1(i);
img_new(i)=mod(img_new(i),256);
j=j 1;
if j==n
j=1;
end
end
imshow(uint8(img_new))%显示图像的方法