txt中是matlab代码:
fid=fopen('33.wav','rb');
a=fread(fid,inf,'uchar');
n=length(a)-44;
fclose(fid);
io=imread('kkk.bmp');
[row col]=size(io); # 返回图像尺寸
wi=io(:); # 二维转一维
if row*col>n
error('文件太小'); # 要隐写的目的文件要够大
end
watermarkedaudio=a;
watermarklength=row*col;
for k=1:row*col # 从1到row*col
watermarkedaudio(44+k)=bitset(watermarkedaudio(44+k),1,wi(k));
end
figure;
subplot(2,1,1);plot(a);
subplot(2,1,2);plot(watermarkedaudio);
fid = fopen('2.wav', 'wb');
fwrite(fid,watermarkedaudio,'uchar');
fclose(fid);
- fread:从二进制文件读取数据
- inf : 读出fid指向的打开的文件的全部数据
- imread:读取图像
- bitset(A,pos,V):将A以二进制来表示,并将第pos个位置(从右数), 设置为
V
的值,在将所得到的值转换成10进制数并返回。 - figure:使用默认属性值创建一个新的图窗窗口
- subplot:将当前图窗划分为
m
×n
网格,并在p
指定的位置创建坐标区 plot(Y)
绘制Y
对一组隐式 x 坐标的图。- 如果
Y
是向量,则 x 坐标范围从 1 到length(Y)
。 - 如果
Y
是矩阵,则对于Y
中的每个列,图中包含一个对应的行。x 坐标的范围是从 1 到Y
的行数。
- 如果
要想逆向算法拿到bmp位示图,要知道图片的正确大小,原题目中的分数提示388,这里脑洞388*height。编写脚本测试height,在height=100时,拿到隐写文件:
# python脚本
import numpy as np
from PIL import Image
wav = open('aaa.wav','rb')
content = wav.read()
wav.close()
bins = []
for i in range(45,45+388*100):
bins.append(255 if int(bin(content[i])[-1:]) else 0)
flag = np.array(bins,np.uint8).reshape(388,100)
imgg = Image.fromarray(flag).save('res.bmp')
% matlab脚本
clc;
clear;
row = 388;
col = 100;
marklength = row*col;
imgData = [0];
wavFile = fopen('aaa.wav','rb');
data = fread(wavFile,inf,'uchar');
for i=45:marklength+45
imgData(i-44) = bitget(data(i),1);
end
% 一维数组转二维数组
img = convert(imgData,row,col);
imwrite(img,'flag.bmp');
imshow('flag.bmp');
function A=convert(oi,row,col)
%创建一个二维空数组
A = zeros(row,col);
for i=1:row
for j=1:col
A(i,j) = oi((i-1)*col+j);
end
end
end
- clc:清除命令窗口的内容
- clear:清除工作空间的所有变量
拿到:
flag还镜像了,添加代码反转一下:
# python
flag = np.flipud(flag)
# matlab
img = flipud(img);
flag{dce97bd455ae1a00faaebd31c57e7d47}