古詩詞大全網 - 藝術簽名 - 加密和解密字符串的算法原理

加密和解密字符串的算法原理

我們經常需要壹種措施來保護我們的數據不被壹些心懷不軌的人看到或破壞。在信息時代,信息可以幫助群體或個人,使他們受益。同樣,信息也可以被用來構成威脅,對他們造成傷害。在競爭激烈的大公司裏,工業間諜經常會獲取對方的信息。因此,客觀上需要壹種強有力的安全措施來保護機密數據不被竊取或篡改。數據加密和解密非常簡單,從宏觀角度來看很容易理解。壹些加密和解密的方法非常直接,容易掌握,可以很容易地對機密數據進行加密和解密。

壹:數據加密方法

傳統上,我們有幾種加密數據流的方法。這些方法都可以很容易的用軟件實現,但是當我們只知道密文的時候,要破譯這些加密算法就不容易了(當同時有原文和密文的時候,要破譯加密算法就不容易了,但是已經可以了)。最好的加密算法對系統性能影響不大,還能帶來其他先天優勢。比如我們都知道的pkzip,壓縮加密數據。再比如dbms的壹些軟件包,總會包含壹些加密方法,使復制文件的功能對壹些敏感數據無效,或者需要用戶的密碼。所有這些加密算法必須具有高效的加密和解密能力。

好在在所有的加密算法中,最簡單的是“置換表”算法,也能滿足加密的需要。每個數據段(總是壹個字節)對應“替換表”中的壹個偏移量,偏移量對應的值作為加密文件輸出。加密和解密程序都需要這樣的“替換表”。事實上,80x86 cpu系列在硬件級別有壹個指令“XLAT”來完成這樣的工作。這種加密算法比較簡單,加解密速度很快,但是壹旦這個“替換表”被對方得到,那麽這種加密方案就完全被識破了。此外,這種加密算法對於黑客來說非常簡單,只要找到壹個“替換表”。在計算機出現之前,這種方法已經被廣泛使用。

這種“置換表”方法的壹個改進是使用兩個或多個“置換表”,它們都基於數據流中的字節位置或數據流本身。這時候解碼就變得更加困難了,因為黑客必須正確的進行幾次變換。通過使用更多的“置換表”並以偽隨機方式使用每個表,這種改進的加密方法變得難以破譯。例如,我們可以對所有偶數編號的數據使用表A,對所有奇數編號的數據使用表B。即使黑客獲得了明文和密文,他也很難破譯這種加密方案,除非黑客確切知道使用了兩張表。

類似於“替換表”的使用,“變換數據位置”也用於計算機加密。然而,這需要更多的執行時間。從輸入中讀取明文並放入緩沖區,然後在緩沖區中對它們重新排序,然後按此順序輸出。解密程序以相反的順序恢復數據。這種方法總是與其他壹些加密算法混合在壹起,這使得解密變得極其困難,幾乎不可能。比如有壹個單詞,可以通過改變字母順序變成listen,但是所有的字母都沒有變,不增不減,只是字母之間的順序變了。

但是有壹種更好的加密算法只有計算機才能做到,那就是字/字節循環移位和異或運算。如果我們循環移位數據流中的壹個單詞或字節,並使用多個或變化的方向(向左或向右),我們可以快速生成加密的數據流。這個方法很好,更難破譯!而且,更進壹步,如果我們使用異或運算,壹位壹位做異或運算,會使密碼更難破譯。如果再次使用偽隨機方法,這涉及到生成壹系列數字,我們可以使用斐波那契數列。將序列生成的數進行模運算(比如模3)得到壹個結果,然後循環移位這個結果的次數,將幾乎不可能解碼二級密碼!但是,我們的解密程序使用斐波那契序列的偽隨機方法生成密碼是非常容易的。

在某些情況下,我們希望知道數據是否被篡改或破壞,因此我們需要生成壹些校驗碼,並將它們插入到數據流中。這樣做對數據安全和程序本身都有好處。但是感染了計算機程序的病毒並不關心這些數據或程序是否經過加密或數字簽名。所以每次加密程序加載到內存開始執行的時候,都要檢查是否被病毒感染,需要加密解密的文件都要做這個檢查!這樣的系統自然要保密,因為病毒程序的編寫者會用它來破壞別人的程序或數據。所以在壹些殺毒或殺毒軟件中必須使用加密技術。

循環冗余校驗是壹種典型的數據校驗方法。對於每個數據塊,它使用位循環移位和異或運算生成16位或32位的校驗和,使得丟失壹兩位的錯誤肯定導致校驗和錯誤。這種方法早已應用於文件傳輸,如xmodem-crc。這種方法已經成為壹種標準,並且有據可查。然而,基於標準crc算法的改進算法對於發現加密數據塊中的錯誤以及文件是否被病毒感染是非常有效的。

2.基於公鑰的加密算法

好的加密算法的壹個重要特征是它能夠指定壹個密碼或密鑰,並用它來加密明文。不同的密碼或密鑰產生不同的密文。這分為兩種方式:對稱密鑰算法和非對稱密鑰算法。所謂對稱密鑰算法是指加密和解密都使用同壹個密鑰,而非對稱密鑰算法是指加密和解密使用不同的密鑰。非常著名的pgp公鑰加密和rsa加密方法都是非對稱加密算法。加密密鑰(公鑰)與解密密鑰(私鑰)非常不同。從數學上講,幾乎沒有真正不可逆的算法。例如,如果對輸入' a '執行操作,結果是' b ',那麽我們可以基於' b '執行相應的操作,並導出輸入' a '。在某些情況下,我們可以得到某個值的每壹個操作,或者該操作是未定義的(例如,除數是0)。對於未定義的操作,基於加密算法,可以成功地防止公鑰被轉換成私鑰。因此,破譯非對稱加密算法並找到唯壹密鑰的唯壹方法是反復試驗,這需要大量的處理時間。

Rsa加密算法使用兩個非常大的素數來生成公鑰和私鑰。即使可以通過因式分解從壹個公鑰得到私鑰,但這種運算所涉及的計算量是如此巨大,在現實中是不可行的。加密算法本身非常慢,這使得使用rsa算法加密大量數據是不可行的。這就使得壹些真正的加密算法是基於rsa加密算法的。Pgp算法(以及大多數基於rsa算法的加密方法)使用公鑰加密壹個對稱加密算法的密鑰,然後使用壹個快速對稱加密算法加密數據。這種對稱算法的密鑰是隨機生成的,並且是保密的。因此,獲取該密鑰的唯壹方法是使用私鑰對其進行解密。

我們舉個例子:假設我們現在要加密壹些數據,使用密鑰‘12345’。使用rsa公鑰,用rsa算法加密這個密鑰‘12345’,放在要加密的數據前面(後面可能跟壹個分隔符或者文件長度,以區別數據和密鑰)。然後,用對稱加密算法對文本進行加密,使用的密鑰是‘12345’。當對方收到時,解密程序找到加密密鑰,用rsa私鑰解密,然後確定數據的起始位置,用密鑰‘12345’解密數據。這樣,可以安全地傳輸和解密可靠且高效的加密數據。

可以在以下站點找到壹些基於rsa算法的簡單加密算法:

ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa

3.壹種新的多步加密算法

現在有了新的加密算法,據說幾乎無法破譯。這個算法是6月1998正式公布的。該算法詳細描述如下:

使用壹系列數字(如128位密鑰)生成可重復但高度隨機化的偽隨機數字序列。壹次使用256個條目,用壹個隨機數序列生成壹個密碼轉換表,如下所示:

把256個隨機數放在壹個矩陣裏,然後排序,用初始位置這樣壹種方式(我們要記住初始位置)生成壹個表,這個表是隨機排序的。表中的數字介於0和255之間。如果不知道怎麽做,可以不去管。但是,下面也提供了壹些原始代碼(如下)以便我們了解如何做。現在,已經生成了壹個特定的256字節的表。然後讓這個隨機數生成器生成這個表中的其余數,這樣每個表都是不同的。接下來,使用“獵槍技術”技術來生成解碼表。基本上,如果A映射到B,那麽B必然映射到A,所以b[a[n]] = n.(n是0到255之間的數)。在壹個循環中賦值,使用壹個256字節的解碼表,它對應於我們在上壹步中剛剛生成的256字節的加密表。

用這種方法已經可以生成這樣壹個表了,而且表的順序是隨機的,所以256字節的隨機數是用二次偽隨機生成的,另外用了兩個16位的密碼。現在,有兩個轉換表,基本的加密和解密工作如下。前壹個字節的密文就是這個256字節表的索引。或者,為了提高加密效果,可以使用額外8位的值,甚至可以使用校驗和或crc算法生成索引字節。假設此表是壹個256*256的數組,它將如下所示:

crypto1 =壹個[crypto 0][值]

變量“crypto1”為加密數據,“crypto0”為之前的加密數據(或之前加密數據的函數值)。自然,第壹個數據需要壹個“種子”,這是我們必須記住的。如果使用256*256的表,這將增加密文的長度。或者,您可以使用您用來生成隨機數序列的密碼,也可以是它的crc校驗和。順帶做了壹個測試:用16字節生成表的索引,用128位的鍵作為這16字節的初始“種子”。然後這些隨機數的表生成後,就可以用它來加密數據,速度是每秒100k字節。加密和解密的時候壹定要用加密的值作為表的索引,而且這兩個時間必須匹配。

加密過程中生成的偽隨機序列非常隨機,可以設計成任何所需的序列。沒有關於這個隨機序列的詳細信息,解密密文是不現實的。比如ascii碼的壹些序列,比如“eeeeeeee”,可能會被轉換成隨機的、無意義的隨機碼,每壹個字節都依賴於其前壹個字節的密文,而不是實際值。對於任何單個字符的這種轉換,加密數據的有效實際長度是隱藏的。

如果妳實在不明白如何生成壹個隨機數序列,可以考慮fibbonacci序列,用兩個雙字(64位)數作為種子生成隨機數,加上第三個雙字做異或運算。該算法產生壹系列隨機數。算法如下:

無符號長整型dw1,dw2,dw3,dwmask

int I 1;

無符號長整型arandom[256];

dw 1 = { seed # 1 };

dw2 = {種子# 2 };

dw mask = { seed # 3 };

//這為您提供了3個32位“種子”,即總共96位

for(I 1 = 0;I 1 & lt;256;i1++)

{

dw3 =(dw 1+dw2)^ dw mask;

arandom[I 1]= dw3;

dw 1 = dw2;

dw2 = dw3

}

如果妳想生成壹系列隨機數,例如,列表中0和所有隨機數之間的壹些數,妳可以使用以下方法:

int _ _ cdecl mysortproc(void * p 1,void *p2)

{

無符號長整型**pp1 =(無符號長整型* *)p 1;

無符號長整型**pp2 =(無符號長整型* *)p2;

if(* * PP 1 & lt;* *第2頁)

return(-1);

else if(* * PP 1 & gt;*第2頁)

返回(1);

return(0);

}

...

int I 1;

無符號long * aprandom[256];

無符號長整型arandom[256];//與之前相同的數組,在這種情況下

int result[256];//此處顯示結果

for(I 1 = 0;I 1 & lt;256;i1++)

{

aprandom[I 1]= arandom+I 1;

}

//現在排序

qsort(aprandom,256,sizeof(*aprandom),mysortproc);

//最後壹步-將指針的偏移量放入輸出數組

for(I 1 = 0;I 1 & lt;256;i1++)

{

a result[I 1]=(int)(aprandom[I 1]-arandom);

}

...

變量“aresult”中的值應該是壹個僅由壹系列整數組成的有序數組,整數值的範圍在0到255之間。這樣的數組非常有用,例如,對於壹個字節到字節的轉換表,可以輕松可靠地生成壹個短密鑰(通常作為壹些隨機數的種子)。這種表還有其他用途,例如:生成壹個隨機字符、計算機遊戲中壹個對象的隨機位置等等。上面的例子本身並不構成加密算法,只是加密算法的壹部分。

作為測試,開發了壹個應用程序來測試上述加密算法。程序本身也經過了多次優化和修改,提高了隨機數的真實隨機性,防止產生壹些短的可重復的隨機數用於加密。用這個程序加密壹個文件,破解這個文件可能要花那麽多時間,現實中是不可能的。

四。結論:

因為在現實生活中,我們需要保證壹些敏感數據只有具有相應權限的人才能看到,還要保證信息在傳輸過程中不會被篡改或截獲,這就需要大量的安全系統廣泛應用於政府、大公司和個人系統中。數據加密當然可以被破解,但是我們要的是特定時期的安全性,也就是說要有足夠的難度去破解密文,這在現實中是不可能的,尤其是短時間內。