实验9-综合复习及CTF中的隐藏题解析

  • 实验题目(此栏实验前由老师填写)

第一部分:综合复习

一、读取图片“house.png”,将其每个像素的最低2位清0,保存为”house01.png”并显示该图片(标题注明为你的姓名全拼)。

clc;
A=imread('house.png');
[h,w]=size(A);
for i=1:h
     for j=1:w
   B(i,j)=bitand(A(i,j), 252);
end
end
imwrite(B,'house01.png');
imshow(B,[]);
title('luruohan');

二、读取图片“house.png”,将其每个像素的最高2位清0,保存为”house02.png”并显示该图片(标题注明为你的姓名全拼)。

clc;
A=imread('house.png');
[h,w]=size(A);
for i=1:h
     for j=1:w
   B(i,j)=bitand(A(i,j), 63);
end
end
imwrite(B,'house01.png');
imshow(B,[]);
title('luruohan');

三、读取一幅RGB图像“baboon.bmp”,分别提取R、G、B颜色分量,

将每个颜色分量最低位清0,再合成为RGB图像,保存为“baboon01.bmp”,并显示该图像(标题注明为你的姓名全拼)。

clc;
A=imread('baboon.bmp');
Ar=A(:,:,1);
Ag=A(:,:,2);
Ab=A(:,:,3);
[h,w]=size(Ar);
for i=1:h
     for j=1:w
   Ar(i,j)=bitand(Ar(i,j),254);
   Ag(i,j)=bitand(Ag(i,j),254);
  Ab(i,j)=bitand(Ab(i,j),254);
end
end
B(:,:,1)=Ar;
B(:,:,2)=Ag;
B(:,:,3)=Ab;
imwrite(B,'baboon01.bmp');
imshow(B,[]);
title('luruohan');

四、读取一幅RGB图像“baboon.bmp”,提取R(或G、B)颜色分量,

将该颜色分量最低4位清0,再与其它分量合成为RGB图像,保存为“baboon02.bmp”,并显示该图像(标题注明为你的姓名全拼)。

clc;
A=imread('baboon.bmp');
Ar=A(:,:,1);
Ag=A(:,:,2);
Ab=A(:,:,3);
[h,w]=size(Ar);
for i=1:h
     for j=1:w
   Ar(i,j)=bitand(Ar(i,j),240);
   
end
end
B(:,:,1)=Ar;
B(:,:,2)=Ag;
B(:,:,3)=Ab;
imwrite(B,'baboon02.bmp');
imshow(B,[]);
title('luruohan');

五、LSB隐藏(顺序隐藏

1、读取“house.png”图像,使用LSB方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像中。并保存为“house01.png”,显示该图像(标题注明为你的姓名全拼)。

cover = imread('house.png') ; 
ste_cover = cover; 
ste_cover=double(ste_cover); 


f_id = fopen('sec.txt', 'r') ; 
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ; 
if len_total > m*n
error( '嵌入的信息量太大') ;
 end

p = 1; 
for f2 = 1:n
 for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ; 
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
 ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
 break; 
end 
p = p + 1; 
end 

end
 ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
 imwrite( ste_cover, 'houses01.png') ; %显示隐藏结果; 
subplot( 1, 2, 1) ; imshow( cover) ; title( '原始图像') ;
 subplot( 1, 2, 2) ; imshow( 'houses01.png') ; title( '隐藏信息后的图像');

2、读取“house01.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。

 
 
ste_cover=imread('houses01.png');
ste_cover=double(ste_cover);
%判断嵌入消息量是否过大
[m,n]=size(ste_cover);
frr=fopen('sec01.txt','w');
%p作为消息嵌入位数计数器,将消息序列写回文本文件
p=1;
for f2=1:n
    for f1=1:m
         if bitand(ste_cover(f1,f2),1)==1
             fwrite(frr,1,'ubit1');
             result(p,1)=1;
         else  
             fwrite(frr,0,'ubit1');
             result(p,1)=0;
         end
         if p==len_total
             break;
         end    
         p=p+1;
    end
    
end
fclose(frr);



六、LSB隐藏(顺序隐藏

1、读取“baboon.bmp”图像,使用LSB方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像R分量中。再与其它分量合成,并保存为“baboonr.bmp”,显示该图像(标题注明为你的姓名全拼)。

 
 cover = imread('baboon.bmp') ; 
ste_cover = cover(:,:,2); 
ste_cover=double(ste_cover); 


f_id = fopen('sec01.txt', 'r') ; 
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ; 
if len_total > m*n
error( '嵌入的信息量太大') ;
 end

p = 1; 
for f2 = 1:n
 for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ; 
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
 ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
 break; 
end 
p = p + 1; 
end 

end
 ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
cover(:,:,2)=ste_cover;
 imwrite( cover, 'baboonr.bmp') ; %显示隐藏结果; 
subplot( 1, 2, 1) ; imshow( 'baboon.bmp') ; title( '原始图像') ;
 subplot( 1, 2, 2) ; imshow( 'baboonr.bmp') ; title( 'luruohan');

2、读取“baboonr.bmp”图像,提取R分量,再提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。

 
 cover = imread('baboon.bmp') ; 
ste_cover = cover(:,:,2); 
ste_cover=double(ste_cover); 


f_id = fopen('sec01.txt', 'r') ; 
[ msg, len_total] = fread( f_id, 'ubit1');
[ m, n] = size( ste_cover) ; 
if len_total > m*n
error( '嵌入的信息量太大') ;
 end

p = 1; 
for f2 = 1:n
 for f1 = 1:m
%ste_cover( f1, f2) = ste_cover( f1, f2) -mod( ste_cover( f1, f2) , 2) + msg( p, 1) ; 
ste_cover( f1, f2) = bitand(ste_cover( f1, f2), 254) ;
 ste_cover( f1, f2) = ste_cover( f1, f2) + msg( p, 1) ;
if p == len_total
 break; 
end 
p = p + 1; 
end 

end
 ste_cover = uint8( ste_cover) ; %生成隐密后的图像;
cover(:,:,2)=ste_cover;
 imwrite( cover, 'baboonr.bmp') ; %显示隐藏结果; 
subplot( 1, 2, 1) ; imshow( 'baboon.bmp') ; title( '原始图像') ;
 subplot( 1, 2, 2) ; imshow( 'baboonr.bmp') ; title( 'luruohan');

七、DCT隐藏(顺序隐藏

1、读取“house.png”图像,使用DCT方法,将sec.txt中信息(你的姓名全拼及学号)隐藏到该图像中。并保存为“housedct.png”,显示该图像(标题注明为你的姓名全拼)。

%文件名:hidedctadv.m
 
alpha=0.1;
frr=fopen('sec.txt','r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread('house.png');
%将图象矩阵转为double型
data0=double(data0)/255;
%取图象的一层做隐藏 
%对图象分块
T=dctmtx(8);
%对分块图象做DCT变换
DCTrgb=blkproc(data0,[8 8],'P1*x*P2',T,T');
DCTrgb0=DCTrgb;

[row,col]=size(DCTrgb);
%[k1,k2]=randinterval(a,count,key);

%信息嵌入
temp=0;
k=1;
for i=1:row/8
    for j=1:col/8
        x=(i-1)*8+1;y=(j-1)*8+1;
   if msg(k,1)==0 
     if DCTrgb(x+4,y+1)>DCTrgb(x+3,y+2)
        temp=DCTrgb(x+4,y+1);
        DCTrgb(x+4,y+1)=DCTrgb(x+3,y+2); 
        DCTrgb(x+3,y+2)=temp; 
     end
   else
      if DCTrgb(x+4,y+1)<=DCTrgb(x+3,y+2)
        temp=DCTrgb(x+4,y+1);
        DCTrgb(x+4,y+1)=DCTrgb(x+3,y+2); 
        DCTrgb(x+3,y+2)=temp; 
     end
   end  
   
  if DCTrgb(x+4,y+1)>DCTrgb(x+3,y+2)
      DCTrgb(x+3,y+2)=DCTrgb(x+3,y+2)-alpha;%将原本小的系数调整得更小
  else
      DCTrgb(x+4,y+1)=DCTrgb(x+4,y+1)-alpha;
  end    
  if k==count
      break;
  end    
      k=k+1;  
    end
end
%信息写回保存 
 DCTrgb1=DCTrgb;
 data=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
 result=data;
 imwrite(result,'housedct.png');
 imshow(result,[]);
 title('luruohan')
 

2、读取“housedct.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中。显示其中的内容。



%函数功能:本函数用于DCT隐藏信息的提取

data0=imread('housedct.png');
data0=double(data0)/255;
 [row,col]=size(data0);
%分块做DCT变换
T=dctmtx(8);
DCTcheck=blkproc(data0,[8 8],'P1*x*P2',T,T');

 %准备提取并回写信息
frr=fopen('sec02.txt','w');
 k=1;
for i=1:row/8
    for j=1:col/8
        x=(i-1)*8+1;y=(j-1)*8+1;

   if DCTcheck(x+4,y+1)<=DCTcheck(x+3,y+2) 
      fwrite(frr,0,'ubit1');
         else
     fwrite(frr,1,'ubit1'); 
         
   end
    if k==112
         break;
    end
     k=k+1;
    end
end
fclose(frr);

八、4bit替换法

1、读取“kgy.jpg”转变为灰度图,再采用4bit替换法将其隐藏到“lena.bmp”中,保存为“pepper01.bmp”显示该图像(标题注明为你的姓名全拼)。

2、读取“pepper01.bmp”,提取其中隐藏的图像,显示该图像(标题注明为你的姓名全拼)。

 % 提取图像信息并分层 
cover = imread('lenna.bmp') ; 
cover1= cover(:,:,1);
 [row, col] = size(cover1) ; 
RGB = imread('kgy.jpg');
msg=(rgb2gray(RGB));
%修改图片大小
msg=imresize(msg,[row,col]);
 
% 置载体图像 R 层的低 4bit 为 0
 for i = 1:row
 for j = 1:col 
cover1( i, j) = bitand( cover1( i, j) , 240) ;
 end 
end
% 置秘密图像的低 4bit 为 0 
takemsg4 = bitand( msg, 240) ; 
% 将秘密图像的高 4bit 右移 4 位
 shiftmsg4 = bitshift( takemsg4, - 4) ; 
% 图像隐藏
for i = 1:row 
for j = 1:col
cover1( i, j) = bitor( cover1( i, j) , shiftmsg4( i, j) ) ;
 end 
end 
% 写回并保存 
cover(:,:, 1) = cover1; 
imwrite( cover, 'pepper01.bmp') ;

%以下为提取代码,可单独分离为一个脚本
data = imread('pepper01.bmp') ;
  
A = data(:,:,1) ;
[ row, col] = size( A) ;
for i = 1:row 
for j = 1:col 
A( i, j) = bitand( A( i, j) , 15) ; 
end
 end
A = bitshift( A, 4) ; 
% 显示结果
subplot( 221) , imshow( 'lenna.bmp') ; title( '载体图像');
 subplot( 222) , imshow( msg) ; title( '秘密图像'); 
  
subplot( 223) , imshow( data) ; title( '载密图像luruohan'); 
imwrite(A,'pepper01.bmp');
subplot( 224) , imshow( A) ; title( '提取的密秘图像luruohan');

九、基于LSB的水印嵌入

编写脚本程序,使用LSB方法把一张图像嵌入到另一个图像中去。

(注意:需要进行图像的二值化操作)。

再编写脚本程序把隐藏的水印提取出来。

Cimg=rgb2gray(imread('C:\Users\S3214\Desktop\pic-9\baboon.png'));
[M,N]=size(Cimg);
figure,imshow(Cimg);
title('载体图像');
imwrite(Cimg,'C:\Users\S3214\Desktop\InputImg.png');
BinImg=rgb2gray(imread('C:\Users\S3214\Desktop\pic-9\huwei.png'));
[m,n]=size(BinImg);
if m>M || n>N
BinImg=imresize(BinImg,[M,N]);
end
BinImg=im2double(BinImg);
BinImg=imbinarize(BinImg,0.50);
figure,imshow(BinImg);
title('需要被隐藏的二值图像');
imwrite(BinImg,'C:\Users\S3214\Desktop\mark1.png');
if(m<=M && n<=N)
for i=1:m
   for j=1:n
       if BinImg(i,j) == bitget(Cimg(i,j),1)
        continue;
      elseif BinImg(i,j) == 0 && bitget(Cimg(i,j),1) == 1
         Cimg(i,j)=Cimg(i,j)-1;
      elseif BinImg(i,j) == 1 && bitget(Cimg(i,j),1) == 0
          Cimg(i,j)=Cimg(i,j)+1;
           end
         end
       end
  else
   fprintf('BinImg is too big than Cimg!!!');
end
imshow(Cimg);
imwrite(Cimg,'C:\Users\S3214\Desktop\outputwatermark1.png');

十、基于DCT的数字水印图像隐藏实现

1、读取一个RGB图‘baboon.png’,取得该图的R分量。

(注意观察尺寸大小)

2、对该 R分量进行DCT变量;

3、读取“huawei.png(或者du.png,或者kgy.jpg)” ,变换为灰度图,尺寸大小设置为64x64(即前一图像的尺寸/8的大小)。

保存为”mark.bmp”.

4、设置嵌入因子为0.1,对mark.bmp进行DCT变换。

5.把mark.bmp嵌入到R分量中。嵌入后的分量图像进行DCT逆变换,再合成至原图像中,并保存为withmark.bmp。显示该图像。

% The watermark image is embedded into the color image by DCT transformation 
% 将水印图像做DCT变换嵌入到彩色图像中 
clc;
clear all;
wtype = 'dct2';
iwtype = 'idct2';
originalImage=imread('baboon.png');
alpha=0.1;    % Embedded factor       嵌入因子 
dim_i=size(originalImage);
rm=dim_i(1);
cm=dim_i(2);
% Embedding formula         设嵌入公式v‘=v(1+aXk)中的a=0.1
% Display carrier image          显示原始图片
subplot(2,2,1);
imshow(originalImage);title('Original Image');

% Read and display watermark images  水印图片
watermark=imread('kgy.bmp');
watermark = rgb2gray(watermark);
subplot(2,2,2);
imshow(watermark);title('Watermark Image'); 
% DCT transform of watermark image      对水印图片做DCT变换
watermark_dct=blkproc(watermark,[8,8],wtype);
waterseria=watermark_dct(:);  % 列向量
% Extract green channel     提取绿色分量
image=imread('baboon.png'); % 重新读取一次原始图像,为了分离和复原颜色通道更方便。
image_g=image(:,:,2);
% DCT transformed for green channel   对绿色分量进行DCT变换
dct_image_g=blkproc(image_g,[8,8],wtype);   
dct_image1=dct_image_g;

k=1;
for i=1:rm/8
    for j=1:cm/8
        x=(i-1)*8;y=(j-1)*8;
        ave=(dct_image_g(x+3,y+5)+dct_image_g(x+5,y+5)+dct_image_g(x+4,y+4)+dct_image_g(x+4,y+6)+dct_image_g(x+2,y+7))/5;
        dct_image1(x+4,y+5)=ave+alpha*waterseria(k);
        k=k+1;
    end
end
image2=blkproc(dct_image1,[8,8],iwtype);  % 反DCT变换
%将嵌入水印的绿色分量加到原图中
image(:,:,2)=image2;

% 计算PSNR
%PSNR=psnr(image_g,image2);

image = uint8(image);
%加水印之后的图片
subplot(2,2,3);
imshow(image)
name='嵌入水印图像';
title(strcat(num2str(name)))
% k=',num2str(alpha),'   PSNR=',num2str(PSNR)));
imwrite(image,'withmark.bmp','bmp');

6、编写提取脚本程序,从withmark.bmp中提取嵌入的水印图像。

第二部分:CTF中隐藏题解析

登录蓝盾平台,根据个人实际完成1-3个CTF隐写练习题。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值