lsb演算法水印
❶ 什麼是LSB演算法
您好,LBS演算法是將秘密信息嵌入到載體圖像像素值的最低有效位,也稱最不顯著位,改變這一位置對載體圖像的品質影響最小的演算法。LSB演算法的基本原理: 對空域的LSB做替換,用來替換LSB的序列就是需要加入的水印信息、水印的數字摘要或者由水印生成的偽隨機序列。由於水印信息嵌入的位置是LSB,為了滿足水印的不可見性,允許嵌入的水印強度不可能太高。然而針對空域的各種處理,如遊程編碼前的預處理,會對不顯著分量進行一定的壓縮,所以LSB演算法對這些操作很敏感。因此LSB演算法最初是用於脆弱性水印的。 LSB演算法基本步驟: 1 將得到的隱藏有秘密信息的十進制像素值轉換為二進制數據; 2 用二進制秘密信息中的每一比特信息替換與之相對應的載體數據的最低有效位; 3 將得到的含秘密信息的二進制數據轉換為十進制像素值,從而獲得含秘密信息的圖像。 獵人安全網為您解答
❷ LSB演算法有什麼優點和缺點,針對其缺點有什麼改進方法
LSB(LeastSignificant Bits)演算法:將秘密信息嵌入到載體圖像像素值的最低有效位,也稱最不顯著位,改變這一位置對載體圖像的品質影響最小。
LSB演算法的基本原理:
對空域的LSB做替換,用來替換LSB的序列就是需要加入的水印信息、水印的數字摘要或者由水印生成的偽隨機序列。由於水印信息嵌入的位置是LSB,為了滿足水印的不可見性,允許嵌入的水印強度不可能太高。然而針對空域的各種處理,如遊程編碼前的預處理,會對不顯著分量進行一定的壓縮,所以LSB演算法對這些操作很敏感。因此LSB演算法最初是用於脆弱性水印的。
LSB演算法基本步驟:
1 將得到的隱藏有秘密信息的十進制像素值轉換為二進制數據;
2 用二進制秘密信息中的每一比特信息替換與之相對應的載體數據的最低有效位;
3 將得到的含秘密信息的二進制數據轉換為十進制像素值,從而獲得含秘密信息的圖像。
❸ matlab數字水印lsb方法
% read image
mat = imread('1.jpg');
mba = imread('2.bmp');
imgread = rgb2gray(mat);
mbt=imresize(mba,size(imgread));
mbt = uint8(mbt);
[maa,mab] = size(imgread);
[mba,mbb] = size(mbt);
md = ones(maa,mab);
ma = zeros(2*maa,2*mab);
ma = im2uint8(ma);
% progress the image
for i=1:1:maa
for j=1:1:mab
imgread(i,j)=imgread(i,j)-mod(imgread(i,j),4);
end
end
%========================
%enlarge image
%=======================
for j=1:1:mab
for i=1:1:maa
ma(2*i-1,2*j-1) = imgread(i,j);
ma(2*i,2*j-1) = imgread(i,j);
ma(2*i-1,2*j) = imgread(i,j);
ma(2*i,2*j) = imgread(i,j);
mb(2*i-1,2*j-1) = mbt(i,j);
mb(2*i,2*j-1) = mbt(i,j);
mb(2*i-1,2*j) = mbt(i,j);
mb(2*i,2*j) = mbt(i,j);
end
end
ma = ma+mb*3;
%ma = ma-mb*3;
%=======================
% attack
%=======================
noise = normrnd(0,0.2,2*maa,2*mab); %Gaussian, uniform,
% laplace,salt-pepper
ma = double(ma);
ma = ma+ noise;
ma = uint8(ma);
figure(1);
subplot(2,2,1);imshow(imgread);
subplot(2,2,2);imshow(mbt,[0,1]);
subplot(2,2,3);imshow(ma);
subplot(2,2,4);imshow(noise)%
%subplot(2,2,1);imshow(mb,[0,1]);subplot(2,2,2);imshow(ma);subplot(2,2,3);imshow(mc);
%=======================
% watermark extraction
%=======================
for i=1:1:maa
for j=1:1:mab
a=mod(ma(2*i-1,2*j-1),2)+mod(ma(2*i,2*j-1),2)+mod(ma(2*i-1,2*j),2)+mod(ma(2*i,2*j),2);
a=(-a+mod(ma(2*i-1,2*j-1),4)+mod(ma(2*i,2*j-1),4)+mod(ma(2*i-1,2*j),4)+mod(ma(2*i,2*j),4))/2;
if a<4
md(i,j)=0;
else
md(i,j)=1;
end
end
end
md = uint8(md);
figure(2);imshow(md,[0,1]);
❹ LSB信息隱藏C語言代碼問題
>for(j=64;j<(64+i*8);j++) //為什麼是從64開始??????
這個我猜是因為點陣圖文件頭包含一些很重要的信息,為避免修改而跳過這段內存;
>第二個問題是a[j]=a[j]>>1; //逐位獲取文字的二進制代碼 這句話怎麼理解?
for(k=0;k<8;k++){ }這個循環體內是對文字每個位元組的8bit信息逐位讀出。
t=a[j]&0x01; 這一句是讀出8個bit的最低位。
a[j]=a[j]>>1; //這句是讀完之後右移一位,高位清零,低位的第二bit移到第一bit,繼續循環讀取下一位。循環8次以完成從低到高的8bit的讀取。
通過j*k次循環,先將文字轉換成二進制數據,然後一位一位的存儲在圖像的LSB中。
LSB水印演算法比較簡單的一種演算法,極易被各種圖形處理破壞,屬於易損水印。
❺ LSB演算法有何優缺點
你中南信安的吧。加分。我給你發實驗報告,給20分最好了,這是我的新ID,沒財富。
綜上所述,LSB有如下缺點:
1) 嵌入消息較大時,所花時間較長。
2) 只能處理簡單的流格式的文件。
3) 為了滿足水印的不可見性,允許嵌入的水印強度較低,對空域的各種操作較為敏感。
4) 基本的LSB演算法抗JPEG壓縮能力弱。
5) 魯棒性差。
LSB演算法有如下優點:
1) 演算法簡單,易於實現,計算速度也快。
2) 在基礎演算法上能夠很快的進行改進,並在脆弱性水印中應用廣泛。
3) 由於能在最低有效位(一般是最後兩位)進行嵌入,故對於256色(8位)的RGB圖像,在3層圖像中均可插入1/8到1/4的消息,總的來說,容量還是足夠大的。
❻ 數字圖像LSB代碼
LSB演算法是數字圖像信息隱藏應用較早較普遍的演算法[3],是在圖像信息的最不重要二進制位嵌入秘密信息。根據24位BMP圖像文件的結構特點,每個文件只能非壓縮地存放一幅彩色圖像;文件頭由54個位元組的數據段組成,其中包含有該點陣圖文件的類型、大小、圖像尺寸及列印格式等;從第55個位元組開始,是該文件的圖像數據部分,由一系列的位元組所組成,每連續3個位元組便描述圖像一個像素點的顏色信息,這三個位元組分別代表藍、綠、紅三基色在此像素中的亮度。LSB演算法是用圖像數據部分每個位元組中最低位來隱藏信息。這樣每8個位元組就可隱藏1個位元組的信息[4]。
嵌入信息的方法為:首先,將待隱藏的秘密信息轉化為二進制數據碼流;然後,將BMP文件圖像數據部分的每個位元組的最低位替換為需隱藏的信息位。最後,原樣復制其他不需要繼續隱藏信息的原始數據。從對點陣圖文件的分析,得知偏移量為0x06的4個位元組為系統保留,可將被隱藏文件的大小寫入該位置,以便提取信息時提前知道有用信息的長度,提高解碼效率。對文件頭部的其他50個位元組,原樣復制即可。隱藏過程如圖1所示。
圖1. LSB圖像隱藏演算法示意圖
Fig.1 LSB data hiding algorithm
信息提取是把隱藏的信息從載體圖像中讀取出來,其過程和步驟正好與信息嵌入相反。首先,到隱藏信息後的圖像文件的0x06處讀取被隱藏信息的位元組數;然後,從0x36處開始,求取BMP文件圖像數據部分每個位元組最低位,每夠8個位元組,便將輸出的8位二進制數組成一個位元組。經過上述處理,得到一系列8位二進制數,便是隱藏信息的代碼,將代碼轉換成文本、或圖像、或聲音,就是隱藏的信息。提取過程如圖2所示。
由於原始24位BMP圖像文件隱藏信息後,其數據部分位元組數值最多變化為1,該位元組代表的像素顏色值最多隻變化了1/256,所以,已隱藏信息的BMP圖像與未隱藏信息的BMP圖像,用肉眼是看不出差別的。將信息直接嵌入像素RGB值的優點是嵌入信息的容量與所選取的掩護圖像的大小成正比。使用這種方法,一個大小為32k的24位BMP圖像文件,可以隱藏約32k/8=4k的信息(忽略文件頭不能隱藏數據的54個位元組),該方法具有較高的信息隱藏率。
圖2. LSB圖像提取演算法示意圖
Fig.2 LSB data extracting algorithm
由於該演算法是通過調整原始數據的最低位來隱藏信息,使一般用戶對於隱藏信息,在視覺和聽覺上很難察覺。但作為數字水印演算法,該演算法因其基本原理限制,所隱藏的數字水印信息是極為脆弱的,無法經受一些無損和有損的信號處理。
3 新的數字水印演算法
這種技術的改進,是在基於LSB圖像隱藏技術的基礎上,對待隱藏的水印信息進行反復的隱藏,因為圖片布滿水印信息,所以,有很強的抗剪裁能力。
對載體圖片進行剪裁後,極有可能會破壞水印信息原有的位置,使我們無法對水印信息進行定位,也就無從實現提取了。因此,這種演算法的關鍵在於如何對水印信息進行同步。下面,提出一種同步的方法:
(1)在數字水印信息前依次連續寫入同步信號0000,1111,1111數遍(4遍以上),然後寫入前標識符1001,0001,再寫入隱藏信息,最後寫入後標識符1001,0001。
(2)讀入被剪裁後的載體圖片的信息位,如果首位是0則跳過,從非0的位開始讀取,連續讀入8位,判斷該數據是否為同步字FF,如果不是同步字FF則繼續從非0的位開始讀其後的8位,直到連續讀出2組同步字FF,證明已經同步,然後一直到讀出前標識符,說明其後為隱藏信息位,讀出數據,直到讀入後標識符,說明隱藏信息已經完整的讀完,至此讀出一條完整的信息。如圖3所示,無論從第1個同步字的任何一位開始讀取,可以保證到第3個同步字時已經完成同步操作,第4個同步字完成確認同步並等待前標識的到來。
❼ 圖像水印的LSB演算法,VC++代碼
因為8位像素值的最低位為1或0對整個像素值影響不大,LSB就是把水印信息放入這個最低位,同時保證原始圖像基本無變化
void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP圖像數據
unsigned char efdata;//嵌入的文件數據
int t = 7;
int x[8];
int s[8];
int last_bit; //記錄位元組最低位本來的bit
for(UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{ //生產隱藏信息,並逐步嵌入到宿主圖像各像素的最低位上
bmdata = *p;//p指向圖像數據的每個像素,把當前像素值給bmdata
for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}
last_bit = x[0];//原始圖像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等於其他各位的異或
if (t == 7) //宿主圖片每走過八個位元組,計算一次s[]
{
efdata = *q;//q指向插入的水印數據
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印數據依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隱藏信息,隱藏信息等於原圖像高六位的異或再和文件數據異或
if (last_bit == 0) //嵌入隱藏信息
{
*p |= x[0];//如果該像素原本最低位為0;則將最終得到的異或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果該像素原本最低位為1;則將最終得到的異或水印值放入原像素
}
p++;//指向下一個像素
t--;//t用來定時每8個位元組插入一次完整的s
if (t == -1) //需要計算一次s[]
{
t = 7;
q++;//指向下一個作為待插入水印的文件數據
i2++;
}
}
}
void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//開辟等於插入文件數據大小的內存
unsigned char *q = m_pFile;//q指向該內存
unsigned char bmdata;//插入了水印的BMP圖像數據
int x[8];
int s[8];
int t = 7;
for (UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{
bmdata = *p; //p指向插入了水印的圖像數據
for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提取該圖像位元組的0~7位放入X[]數組
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8個位元組中的s[]
t--;
if (t == -1) //s[7]到s[0]組成一個位元組
{
*q = s[7] * 128 + s[6] * 64 + s[5] * 32 + s[4] * 16 +
s[3] * 8 + s[2] * 4 + s[1] * 2 + s[0];//還原原始的圖像數據
t = 7;
i2++;
q++;
}
p++;//指向下一像素
}
}
❽ 高分求:基於LSB的空域水印演算法實現
這是化學反映啊,應該去問化學老師去