数字图像加密算法

本文主要介了四种加密:随机扰乱图片信息的行或列进行加密;随机扰乱图片信息的像素点进行加解密;缩放图片信息的像素点进行加解密;以上都属于加密后立即进行解密。再就是利用混沌序列进行加解密,使用了固定算法,通过加解密密钥形成了加密后的非立即解密方法。

1.随机打乱各行进行数字图像加密:

《数字图像加密算法》

%随机打乱各行进行数字图像加密
clear
RGB = imread('bb2.jpg');
s = size(RGB);
%不放回的均匀分布的从1到s(1)到整数,个数为s(1)抽样
r = randsample(s(1), s(1));
RGBS = RGB(r, :, :);
j = 1; f = 1:length(r);
while j <= length(r)
    f(j) = find(r == j);
    j = j + 1;
end
RGBE = RGBS(f, :, :);
subplot(1, 2, 1); imshow(RGBS); title('加密后');
subplot(1, 2, 2); imshow(RGBE); title('解密后');

2.随机打乱各列进行数字图像加密:

《数字图像加密算法》

%随机打乱各列进行加密
clear
RGB = imread('bb2.jpg');
s = size(RGB);
r = randsample(s(2), s(2));
RGBS = RGB(:, r, :);
i = 1; f = 1:length(r);
while i <= length(r)
    f(i) = find(r == i);
    i = i + 1;
end
RGBE = RGBS(:, f, :);
subplot(1, 2, 1);imshow(RGBS);title('加密后');
subplot(1, 2, 2);imshow(RGBE);title('解密后');

3.同时打乱各行和各列进行数字图像加密

《数字图像加密算法》

%同时打乱各行和各列进行数字图像加密
clear;
RGB = imread('bb2.jpg');
s = size(RGB);
r = randsample(s(1), s(1));
RGBS = RGB(r, :, :);
c = randsample(s(2), s(2));
RGBSS = RGBS(:, c, :);
i = 1; f = 1:length(c);
while i <= length(c)
    f(i) = find(c == i);
    i = i + 1;
end
j = 1;g = 1:length(r);
RGBE = RGBSS(:, f, :);
while j <= length(r)
    g(j) = find(r == j);
    j = j + 1;
end
RGBEE = RGBE(g, :, :);
subplot(1, 2, 1); imshow(RGBSS); title('加密后');
subplot(1, 2, 2); imshow(RGBEE); title('解密后');

4.随机打乱像素点进行数字图像加密

加密效果比较好,但加解密密时间呈指数倍增加。

%随机打乱像素点进行数字图像加密
clear;
RGB = imread('bb2.jpg');
s = size(RGB);
n = s(1) * s(2) * s(3);
r = randsample(n, n);
RGBS =  RGB(r);
RGBSS = reshape(RGBS, s(1), s(2), s(3));	
i = 1; f = 1:n;
while i <= n
    f(i) = find(r == i);
    i = i + 1;
end
RGBE = RGBS(f);
RGBEE = reshape(RGBE, s(1), s(2), s(3));
subplot(1, 2, 1); imshow(RGBSS); title('加密后');
subplot(1, 2, 2); imshow(RGBEE); title('解密后');

《数字图像加密算法》

5.像素点的RGB值缩放进行数字图像加密

加密的效果会随着缩放的倍数增加会更好,但易于破解。

《数字图像加密算法》

%通过像素点的RGB值的缩放进行数字图像加密
clear;
RGB = imread('lenna.jpg');
s = size(RGB);
r = rand(s(1), s(2), s(3)) * 10;
RGBD = im2double(RGB);
RGBS = RGBD .* r;
RGBE = RGBS ./ r;
subplot(1, 2, 1); imshow(RGBS); title('加密后');
subplot(1, 2, 2); imshow(RGBE); title('解密后');

6.混沌序列数字图像加密

《数字图像加密算法》

《数字图像加密算法》

%混沌序列数字图像加密程序,输入的加密密钥在0~1范围的数
clear;
RGB = imread('bb2.jpg', 'jpg');
s = size(RGB);
N = s(1) * s(2) * s(3);
%m = 1:N;
m(1) = input('输入加密密钥: ');
disp('加密中...');
for i = 1:N-1
    m(i+1) = 4 * m(i) - 4 * m(i)^2;
end
m = mod(m * 1000, 256);
m = uint8(m);
n = 1;
%RGBS = zeros(s(1), s(2), s(3));
for i = 1:s(3)
    for j = 1:s(2)
        for k = 1:s(1)
            RGBS(k, j, i) = bitxor(m(n), RGB(k ,j, i));
            n = n + 1;
        end
    end
end
disp('加密成功!');
imwrite(RGBS, '加密后的bb2.jpg','jpg');
subplot(1,2 ,1);imshow(RGBS);title('加密后的图片');

%混沌加密的解密程序,输入的解密密钥即是加密密钥
%注意:使用非立即加密和解密的算法进行数字图像加密时,当对jpg格式的图像进行加密后
%的写入,再在解密程序中读入加密后的jpg的图片,图片会部分失真,而利用bmp格式的图像
%进行写入和读出时就不会出现这样的情况,由于jpg格式的图像是有损压缩,虽然是同一张
%图像写入和读出的数字图像的RGB值已经不同了;与此相反bmp格式的图像是无损压缩,因此
%不会出现这样的情况。
%clear;
RGBS1 = imread('加密后的bb2.jpg', 'jpg');
s1 = size(RGBS1);
N1 = s1(1) * s1(2) * s1(3);
%m = 1:N;
m1(1) = input('输入解密密钥: ');
disp('解密中...');
for i1 = 1:N1-1
    m1(i1+1) = 4 * m1(i1) - 4 * m1(i1)^2;
end
%RGBE = zeros(s(1), s(2), s(3));
m1 = mod(m1 * 1000, 256);
m1 = uint8(m1);
n1 = 1;
for i1 = 1:s1(3)
    for j1 = 1:s1(2)
        for k1 = 1:s1(1)
            %这里不能使用RGBS1,由于jpg是有损压缩格式,读入和读出存在误差;
            %故使用加密后没写入jpg格式时的RGB;
            %RGBE(k1, j1, i1) = bitxor(m1(n1), RGBS1(k1, j1, i1));
            RGBE(k1, j1, i1) = bitxor(m1(n1), RGBS(k1, j1, i1));
            n1 = n1 + 1;
        end
    end
end
disp('解密成功!');
imwrite(RGBE, '解密后的bb2.jpg', 'jpg');
subplot(1, 2, 2); imshow(RGBE); title('解密后的图片');

《数字图像加密算法》

解密程序2:

%混沌加密的解密程序,输入的解密密钥即是加密密钥
%注意:使用非立即加密和解密的算法进行数字图像加密时,当对jpg格式的图像进行加密后
%的写入,再在解密程序中读入加密后的jpg的图片,图片会部分失真,而利用bmp格式的图像
%进行写入和读出时就不会出现这样的情况,由于jpg格式的图像是有损压缩,虽然是同一张
%图像写入和读出的数字图像的RGB值已经不同了;与此相反bmp格式的图像是无损压缩,因此
%不会出现这样的情况。
%clear;
RGBS1 = imread('加密后的bb2.jpg', 'jpg');
s1 = size(RGBS1);
N1 = s1(1) * s1(2) * s1(3);
%m = 1:N;
m1(1) = input('输入解密密钥: ');
disp('解密中...');
for i1 = 1:N1-1
    m1(i1+1) = 4 * m1(i1) - 4 * m1(i1)^2;
end
%RGBE = zeros(s(1), s(2), s(3));
m1 = mod(m1 * 1000, 256);
m1 = uint8(m1);
n1 = 1;
for i1 = 1:s1(3)
    for j1 = 1:s1(2)
        for k1 = 1:s1(1)
            %这里不能使用RGBS1,由于jpg是有损压缩格式,读入和读出存在误差;
            %故使用加密后没写入jpg格式时的RGB;
            RGBE(k1, j1, i1) = bitxor(m1(n1), RGBS1(k1, j1, i1));
            %RGBE(k1, j1, i1) = bitxor(m1(n1), RGBS(k1, j1, i1));
            n1 = n1 + 1;
        end
    end
end
disp('解密成功!');
imwrite(RGBE, '解密后的bb2.jpg', 'jpg');
subplot(1, 2, 2); imshow(RGBE); title('解密后的图片');

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/lhkaikai/article/details/23743051
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞