%明文关联图像解密函数PREDCRYPT
%
%%
%读入密文图像C,并将其分成u块,每块包含16个像素点
function P=PRDECRYPT(C,K)
C_d2=double(C);
[Mc,Nc]=size(C_d2);
u=floor(Mc*Nc/16);%%%%
C_d1=transpose(C_d2);
C_d1=transpose(C_d1(:));%一维行向量
C_d2=zeros(u,16);
for i=1:u
C_d2(i,:)=C_d1((i-1)*16+1 : i*16);
end
u2=u;
for i=u:-1:1
if C_d2(i,1)+C_d2(i,2)==0
C_d2(i,:)=[];
u2=u2-1;
else
break;
end
end
u=u2;
M_d2=zeros(u,16);
%%
%对应解密算法第(1)步,用于产生查找表LT,用e表示
%step 1
a=3.57+0.43*K(1);
b=3.57+0.43*K(2);
x0=K(3);
y0=K(4);
e=zeros(1,256);
x=zeros(1,132);
y=zeros(1,132);
for i=1:132
x1=a*x0*(1-x0);
y1=b*x0*y0*(1-x0*y0);
x(i)=x1;
y(i)=y1;
if(i<=128)
e(2*i-1)=x1;
e(2*i)=y1;
end
x0=x1;%
y0=y1;
end
%%
%对应解密算法第(3)——(10)步,将密文C还原为中间密文,保存在M_d2中。
for stp=1:u
%step 2
C0=C_d2(stp,:);
%step 3
k1=mod(ceil(x(131)*1e6),16)+1;
l1=mod(ceil(y(131)*1e8),256);
k2=mod(ceil(x(132)*1e6),16)+1;
l2=mod(ceil(y(132)*1e8),256);
if k2==k1
k2=mod(k2,16)+1;
end
d2=mod((C0(k2)+l2),256)+1;
x(132)=mod(x(132)+e(d2),1);
%step 4
w=zeros(1,18);
x0=x(132);
y0=y(132);
for i=1:9
x1=a*x0*(1-x0);
y1=a*x0*y0*(1-x0*y0);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w(2*i-1)=x1;
w(2*i)=y1;
x0=x1;
y0=y1;
end
x08b=w(17);
y08b=w(18);
v=mod(ceil(w(1:16)*1e8),256);
q=zeros(1,16);
if k2==16
q(1)=mod(C0(1)+256-v(1)-C0(2),256);
q(k2)=C0(k2);
q(mod((k2-1)+15,16)+1)=mod(C0(mod((k2-1)+15,16)+1)+256-v(mod((k2-1)+15,16)+1)-0,256);
for i=k2-2:-1:2
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
elseif k2==1
q(16)=mod(C0(16)+256-v(16)-C0(2),256);
C0(16)=mod(q(16)+v(16),256);
for i=15:-1:k2+1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
q(k2)=C0(k2);%
else
q(16)=mod(C0(16)+256-v(16),256);
for i=15:-1:k2+1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
q(k2)=C0(k2);
q(mod((k2-1)+15,16)+1)=mod(C0(mod((k2-1)+15,16)+1)+256-v(mod((k2-1)+15,16)+1)-C0(mod(k2,16)+1),256);
for i=k2-2:-1:1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
end
q0=C0(1);
Q0=q;
%step 5
d1=mod((q(k1)+l1),256)+1;
x(131)=mod(x(131)+e(d1),1);
%step 6
h=zeros(1,18);
x0=x(131);
y0=y(131);
for i=1:9
x1=a*x0*(1-x0);
y1=a*x0*y0*(1-x0*y0);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h(2*i-1)=x1;
h(2*i)=y1;
x0=x1;
y0=y1;
end
x08f=h(17);
y08f=h(18);
g=mod(ceil(h(1:16)*1e8),256);
r=zeros(1,16);
if k1==16
r(1)=mod(Q0(1)+256-g(1)-Q0(15),256);
Q0(1)=mod(r(1)+g(1),256);
for i=2:k1-1
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
r(k1)=Q0(k1);
elseif k1==1
r(k1)=Q0(k1);
r(mod(k1,16)+1)=mod(Q0(mod(k1,16)+1)+256-g(mod(k1,16)+1)-0,256) ;
for i=k1+2:16
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
else
r(1)=mod((Q0(1)+256-g(1)),256);
for i=2:k1-1
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);%
end
r(k1)=Q0(k1);
r(mod(k1,16)+1)=mod(Q0(mod(k1,16)+1)+256-g(mod(k1,16)+1)-Q0(mod((k1-1)+15,16)+1),256 );
for i=k1+2:16
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
end
r15=Q0(16);
R0=r;
M_d2(stp,:)=R0;
%step 7
l3=mod(ceil(y08f*1e8),256);
d3=mod((r15+l3),256)+1;
x08f=mod(x08f+e(d3),1);
x(131)=a*x08f*(1-x08f);
y(131)=b*x08f*y08f*(1-x08f*y08f);
%step 8
l4=mod(ceil(y08b*1e8),256);
d4=mod((q0+l4),256)+1;
x08b=mod(x08b+e(d4),1);
x(132)=a*x08b*(1-x08b);
y(132)=b*x08b*y08b*(1-x08b*y08b);
end%step 9-10
%%
%对应解密算法第(11)步,由中间密文得到还原后的图像,保存在M_d2中。
M_d3=zeros(u,16);
for i=1:u
M_d3(i,:)=M_d2(u-i+1,:);
end
C_d2=M_d3;
x(131:132)=x(129:130);
y(131:132)=y(129:130);
for stp=1:u
%step 2
C0=C_d2(stp,:);
%step 3
k1=mod(ceil(x(131)*1e6),16)+1;
l1=mod(ceil(y(131)*1e8),256);
k2=mod(ceil(x(132)*1e6),16)+1;
l2=mod(ceil(y(132)*1e8),256);
if k2==k1
k2=mod(k2,16)+1;
end
d2=mod((C0(k2)+l2),256)+1;
x(132)=mod(x(132)+e(d2),1);
%step 4
w=zeros(1,18);
x0=x(132);
y0=y(132);
for i=1:9
x1=a*x0*(1-x0);
y1=a*x0*y0*(1-x0*y0);%%%%%%%%%%%%%%%%%
w(2*i-1)=x1;
w(2*i)=y1;
x0=x1;
y0=y1;
end
x08b=w(17);
y08b=w(18);
v=mod(ceil(w(1:16)*1e8),256);
q=zeros(1,16);
if k2==16
q(1)=mod(C0(1)+256-v(1)-C0(2),256);
q(k2)=C0(k2);
q(mod((k2-1)+15,16)+1)=mod(C0(mod((k2-1)+15,16)+1)+256-v(mod((k2-1)+15,16)+1)-0,256);
for i=k2-2:-1:2
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
elseif k2==1
q(16)=mod(C0(16)+256-v(16)-C0(2),256);
C0(16)=mod(q(16)+v(16),256);
for i=15:-1:k2+1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
q(k2)=C0(k2);%
else
q(16)=mod(C0(16)+256-v(16),256);
for i=15:-1:k2+1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
q(k2)=C0(k2);
q(mod((k2-1)+15,16)+1)=mod(C0(mod((k2-1)+15,16)+1) + 256 - v(mod((k2-1)+15,16)+1)-C0(mod(k2,16)+1),256);
for i=k2-2:-1:1
q(i)=mod(C0(i)+256-v(i)-C0(i+1),256);
end
end
q0=C0(1);
Q0=q;
%step 5
d1=mod((q(k1)+l1),256)+1;
x(131)=mod(x(131)+e(d1),1);
%step 6
h=zeros(1,18);
x0=x(131);
y0=y(131);
for i=1:9
x1=a*x0*(1-x0);
y1=a*x0*y0*(1-x0*y0);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h(2*i-1)=x1;
h(2*i)=y1;
x0=x1;
y0=y1;
end
x08f=h(17);
y08f=h(18);
g=mod(ceil(h(1:16)*1e8),256);
r=zeros(1,16);
if k1==16
r(1)=mod(Q0(1)+256-g(1)-Q0(15),256);
Q0(1)=mod(r(1)+g(1),256);
for i=2:k1-1
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
r(k1)=Q0(k1);
elseif k1==1
r(k1)=Q0(k1);
r(mod(k1,16)+1)=mod(Q0(mod(k1,16)+1)+256-g(mod(k1,16)+1)-0,256) ;
for i=k1+2:16
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
else
r(1)=mod((Q0(1)+256-g(1)),256);
for i=2:k1-1
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);
end
r(k1)=Q0(k1);
r(mod(k1,16)+1)=mod(Q0(mod(k1,16)+1)+256-g(mod(k1,16)+1)-Q0(mod((k1-1)+15,16)+1),256 );
for i=k1+2:16
r(i)=mod((Q0(i)+256-g(i)-Q0(i-1)),256);%
end
end
r15=Q0(16);
R0=r;
M_d2(stp,:)=R0;
%step 7
l3=mod(ceil(y08f*1e8),256);
d3=mod((r15+l3),256)+1;
x08f=mod(x08f+e(d3),1);
x(131)=a*x08f*(1-x08f);
y(131)=b*x08f*y08f*(1-x08f*y08f);
%step 8
l4=mod(ceil(y08b*1e8),256);
d4=mod((q0+l4),256)+1;
x08b=mod(x08b+e(d4),1);
x(132)=a*x08b*(1-x08b);
y(132)=b*x08b*y08b*(1-x08b*y08b);
end%step 9-10
%%
%由还原后的向量M_d2得到图像P
P_d1=transpose(M_d2);
P_d1=transpose(P_d1(:));
if mod(Mc*Nc,16)==0
ex_r=0;
elseif Nc>16
ex_r=1;
else
ex_r=ceil(16/Nc);
end
P_d=zeros(Mc-ex_r,Nc); %加密多加了ex_r行
for i=1:length(P_d1)
P_d(floor((i-1)/Nc)+1,mod((i-1),Nc)+1)=P_d1(i);
end
P=uint8(P_d);
end
评论0