0

我正在使用 LSB 技术进行视频隐写术。我使用 traffic.avi 和 xylophone.mpg 作为封面媒体,当我使用 licence.txt 文件(在附件中)编码到视频中时,它运行良好但是当我对输入文本使用简短消息,它会显示一个错误,即

“ENCODE 中的矩阵 MSG 必须有 K 列。” 有时在使用短文本时会出现错误“msg is too long to encoding”

我不知道这两组编码意味着什么以及如何编辑代码以使编码短消息成为可能...下面是我猜与此问题相关的一些代码

     num2add = 80-length(msg);  % Number of spaces to add to end of MSG.
     if num2add < 0, error('This message is too long to encode.'), end
     newmsg = [msg,repmat(' ',1,num2add)]; % 80 chars always encoded.
     msgmat = dec2bin(newmsg)-48; % Each row is a bin. rep. of an ascii char.

还有这个编码

    if m_msg == 1
        type_flag = 2;  % binary vector
        [msg, added] = vec2mat(msg, k);
    elseif m_msg ~= k
        error('comm:encode:InvalidMatrixColumnSize','The matrix MSG in ENCODE must have K columns.'); 

下面是完整的编码编码 在上述编码的第一部分之后继续!

    B = pic1(:,:,1);   [piclngth pichght] = size(B);  % Choose the first page.
    dim1 = piclngth-2;   dim2 = pichght-3;   keyb = key(end:-1:1);
    rows = cumsum(double(key));   
    columns = cumsum(double(keyb));  % Coord pairs for KEY (rows,columns)
    A = zeros(dim1,dim2); % This matrix will house the hiding points.
    A = crtmtrx(A,rows,columns,dim1,dim2,key);
    idx = find(A==1);  % This same index will be used for pic matrix.

    for vv = 1:80  % This is the encoder.  
    for uu = 1:8 
    if msgmat(vv,uu)==1;
       if rem(B(idx(uu+8*(vv-1))),2)==0
            if(frame==1)
            disp('some pixel value of original frame');
            B(idx(uu+8*(vv-1)))
             end
          B(idx(uu+8*(vv-1))) = B(idx(uu+8*(vv-1)))+1;
            if(frame==1)
            disp('some pixel value of stegno video frame');
            B(idx(uu+8*(vv-1)))
             end
       end
    elseif rem(B(idx(uu+8*(vv-1))),2)==1
            if(frame==1)
            disp('some pixel value of original frame');
            B(idx(uu+8*(vv-1)))
             end
          B(idx(uu+8*(vv-1))) = B(idx(uu+8*(vv-1)))-1;
            if(frame==1)
            disp('some pixel value of stegno video frame');
            B(idx(uu+8*(vv-1)))
             end
         end
     end
   end
    global newpic;
    newpic = pic1;   newpic(:,:,1) = B;
    f(frame) = im2frame(newpic);
  end

    frameRate = get(vidObj,'FrameRate');


    movie2avi(f,'stegano_video.avi','compression','None', 'fps', 20);
    success = 1;

    function A = crtmtrx(A,rows,columns,dim1,dim2,key)
    % Creates the matrix used to find the points to hide the message.

    jj = 1;   idx = 1;
  while 640 > length(idx) %  Need 560 points to hide 80 characters.     
for ii = 1:length(rows)
    if rows(ii) < dim1
       rows(ii) = rem(dim1,rows(ii))+1;
    else
       rows(ii) = rem(rows(ii),dim1)+1;
    end
    if columns(ii) < dim2
       columns(ii) = rem(dim2,columns(ii))+1;
    else
       columns(ii) = rem(columns(ii),dim2)+1;
    end
    A(rows(ii),columns(ii)) = 1;
end
rows = jj*cumsum(double(columns))+round(dim2/2);  % Each pass is diff.
columns = jj*cumsum(double(rows))+round(dim1/2);
if jj > ceil(640/length(key))+2  % Estimate how many iters. needed.
   idx = find(A==1);
 end
   jj = jj+1;
end

这是一些输入文本,右边是加密的 txt

4

1 回答 1

0

触发错误的代码非常清楚:

num2add = 80-length(msg);  % Number of spaces to add to end of MSG.
if num2add < 0, error('This message is too long to encode.'), end

所以基本上只要msg. 我不确定 80 是否有意义,您可以尝试增加它,但这可能会破坏其他东西。

于 2013-12-13T15:49:20.077 回答