2011-12-20 55 views
-1

我正在做一個圖像加密項目。我們在圖像上使用河豚加密。根據Paul Kocher的代碼http://www.schneier.com/blowfish-download.html。主要功能是如下Blowfish Algo For a Image

void main(void) { 
unsigned long L = 1, R = 2; 
BLOWFISH_CTX ctx; 

Blowfish_Init (&ctx, (unsigned char*)"TESTKEY", 7); 
Blowfish_Encrypt(&ctx, &L, &R); 
printf("%08lX %08lX\n", L, R); 
if (L == 0xDF333FD2L && R == 0x30A71BB4L) 
    printf("Test encryption OK.\n"); 
else 
    printf("Test encryption failed.\n"); 
Blowfish_Decrypt(&ctx, &L, &R); 
if (L == 1 && R == 2) 
    printf("Test decryption OK.\n"); 
else 
    printf("Test decryption failed.\n"); 
} 

這裏作者使用L = 1且L = 2來加密,其中作爲我將使用圖像像素到encypt和輸出將爲十六進制值。現在的問題是如何將輸出的十六進制值轉換爲有效的圖像格式,如.jpg或.tiff,以便將其顯示爲Blowfish加密圖像。

或者,如果我可以在不加密每個像素的情況下對整個圖像進行加密,那麼還是建議我使用其他方法?

需要對此提出建議。感謝提前

+0

你加密圖像的像素,或者圖像的文件內容的總體思路?如果是後者,則無法將其保存並讀取爲正常圖像,因爲加密將會使格式變爲灰色。 – CharlesB 2011-12-20 15:02:46

+0

@charlesB你可以建議我如何使用算法加密文件內容。沒有這樣的算法可用於文件數據,但所有算法都使用數字來進行加密。如果你有任何想法,請告訴我 – anupsahu 2011-12-20 15:13:07

+0

你沒有回答這個問題。像素數據和文件數據是不同的東西,你想要編碼什麼數據? – CharlesB 2011-12-20 15:32:13

回答

0

該庫只是將一個長整數加密成另一個長整數 - 這個數字來自哪裏並不重要。

你所要做的就是遍歷圖像中的像素,將長整數的值(可能是32位,但取決於你的平臺)複製到加密函數中,然後將得到的長整數的加密值複製到你的其他圖像。

你唯一需要做出的決定是 - 你想加密整個圖像文件 - 包括標題,還是隻有圖像數據塊?

如果你加密整個文件,你可以使用任何其他的Blowfish工具來加密/解密它 - 但是沒有人會知道它是一個圖像。如果你只加密圖像塊,其他人會知道它是一個圖像,並能夠打開它 - 但看到一張隨機圖片 - 但他們只能用你的軟件加密/解密。

// assuming Blowfish_Encrypt is context,input,output 
unsigned char *data = image.get_pointer_to_data(); 
int step = sizeof(unsigned long); 
for (int y=0;y<rows;y++) { 
    for (int x=0;x<cols;x+=step) { 
     memcpy(&L,data,step);  
     Blowfish_Encrypt(&ctx, &L, &R); 
     memcpy(data,&R,step);  
     data += step; 
    } 
} 

不是一個optomised的解決方案,你必須小心一點填充的 - 但顯示你

+0

我使用Matlab來計算加密圖像的熵和相關性。所以如果我使用整個圖像,我將無法在matlab軟件中讀取圖像。所以我需要的是加密數據塊。所以問題是加密的輸出是一個十六進制數字,它不是一個有效的圖像日期。所以我需要幫助誰加密或解密圖像,並且輸出應該被任何圖像處理工具識別 – anupsahu 2011-12-20 17:45:18

+0

@anupsahu - 輸出不是十六進制數,這就是printf顯示它爲您閱讀的內容。它是一個整數 - 只是內存中的32,0和1個塊 - 可以是像素或其他任何東西 – 2011-12-20 18:00:42