12 Logistic 混沌加、解密
一维迭代映射 离散动力系统
不动点 周期 K 点 都是我们研究随机系统时不希望看到的点
Logistic 方程, 人口方程
从倍分叉到混沌
混沌定义, 蝴蝶效应特征
罗伦兹方程
logistic 映射加密流程
13 复合混沌加、解密
Composite Discrete Chaotic Sequence
本原多项式
加密代码 MATLAB
function [img1]=FHHD(img,x0,g0,j0)
[m,n,s] = size(img); %获取尺寸,宽度,高度 s = 1 为灰色,s = 3 为彩色
img1 = img; %初始化加密之后图像
for i=1:s %依次对每个比特进行加密
for j=1:n
for k=1:m
for l=1:8
% 1、使用反馈移位寄存器依次输出ri
%使用本源多项式 x^7+x^3+1 抽头8、4、1位
ri = bitget(g0,1);
bit1 = bitget(g0,4);
bit2 = bitget(g0,8);
% 将抽头的三位进行异或得到新的最高位值newbit
newbit = bitxor(ri,bit1);
newbit = bitxor(newbit,bit2);
% 原始反馈移位寄存器g0右移一位
g0 = bitshift(g0,-1);
% 将g0最高位设置为计算得到的newbit
g0 = bitset(g0,8,newbit);
% 2、明文对应位与ri异或得到qi值
qi = bitxor(bitget(img(k,j,i),l),ri);
% 3、根据qi值用对应的混沌函数以及初始变量获得新的迭代混沌值
fx = 1-sqrt(abs(2*x0-1)); % 截断小数点,防止计算机浮点数表示的误差
if(qi == 0)
fx = 1-fx;
end
% 更新x0的值
x0 = fx;
% 4、混沌值进行Rj非线性变换得到密文
img1(k,j,i) = bitset(img1(k,j,i),l,mod(floor(fx*2^j0),2));
end
end
end
end
imwrite(img1,'jmtx.bmp','BMP');
解密代码 MATLAB
function [img1]=FHHDJM(img,x0,g0,j0)
[m,n,s] = size(img); %获取尺寸,宽度,高度,s = 1 为灰色,s = 3 为彩色
img1 = img; %初始化加密之后图像
for i=1:s %依次对每个比特进行加密
for j=1:n
for k=1:m
for l=1:8
% 1、使用f1与初始x0计算混沌值 % 截断小数点,防止计算机浮点数表示的误差
fx = 1-sqrt(abs(2*x0-1));
% 更新x0的值
x0 = fx;
% 2、混沌值进行Rj非线性变换得到si
si = mod(floor(fx*2^j0),2);
% 3、用1减去密文与si进行异或得到qi
% 高版本MATLAB可以直接使用下面的语句
%qi = 1-bitxor(bitget(img(k,j,i),l),si);
tmp=bitxor(bitget(img(k,j,i),l),si);
if tmp==1
qi=0;
else
qi=1;
end
% 4、使用反馈移位寄存器依次输出ri
% 使用本源多项式 x^7+x^3+1 抽头8、4、1位
ri = bitget(g0,1);
bit1 = bitget(g0,4);
bit2 = bitget(g0,8);
% 将抽头的三位进行异或得到新的最高位值newbit
newbit = bitxor(ri,bit1);
newbit = bitxor(newbit,bit2);
% 原始反馈移位寄存器g0右移一位
g0 = bitshift(g0,-1);
% 将g0最高位设置为计算得到的newbit
g0 = bitset(g0,8,newbit);
% 5、qi与ri的异或值得到明文
mi = bitxor(qi,ri);
img1(k,j,i) = bitset(img1(k,j,i),l,mi);
end
end
end
end
imwrite(img1,'gmtx.bmp','BMP');
主函数 MATLAB
%
% 复合混沌加、解密实战系统
%
% img = imread('dog.jpg');
img = imread('a.bmp');
img1 = FHHD(img,0.15624562,164,10); % 复合混沌函数初始值, 本原函数初始值, 2^j 的 j
img2 = FHHDJM(img1,0.15624562,164,10);
figure,subplot(1,3,1);
imshow(img);title('原始图像');
subplot(1,3,2);
imshow(img1);title('加密图像');
subplot(1,3,3);
imshow(img2);title('解密图像');