复合混沌加密

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('解密图像');