流密碼及RC4算法ZZ


一、什么是密碼系統及流密碼?

密碼系統(cryptosystem

是一套用來實現某種形式的加密及解密的算法,他分為兩大類:私鑰密碼系統和公鑰密碼系統。私鑰密碼系統是指是指加密者和解密者(可以都是自己呵呵)在某些私有的信息上預先做了約定,來進行加密解密,如果有第三方知道了這私有信息(私鑰),加密就沒有意義了。公鑰密碼系統是指發送信息的人用對所有人公開的信息(公鑰)來對信息加密后發送,接收方接到信息后用私鑰(只有接收方本人知道的)進行解密;加密的算法是公開的,你可能問:難道就不能根據這個算法進行解密?這是公鑰系統要解決的問題,即是否存在那樣的函數y=f(x),由x計算y很容易,由y計算x非常困難;我還不知道這些函數有哪些,以后學了再說

私鑰密碼系統又分為分組密碼(block cipher)和流密碼(stream cipher)。兩者的區別,形象來說,分組密碼的轉換是固定的,流密碼的轉換是隨“時間”變換而變換的,它像水流一樣源源不斷的產生。流密碼能夠流行主要歸功於香農對於 “一次一密” 的分析,他證明了“一次一密”幾乎“攻不可破”。

一次一密的算法非常簡單,假設你需要加密的信息(明文)有n比特長,然后你隨機選一個長度為n比特的密碼,可以選擇的密碼有2^n個,然后將明文和密碼”相加“,兩者都是一個同長度的二進制數,“相加”是指在相同的位進行異或運算(兩數字相同時“和”為”0“,不同時“和”為”1“).要對密文進行解密,只需要將密文和密碼“相加”就能得到明文了(可以試試)。如果密碼真的是隨機取的,第三方想破譯,他最多可能需要嘗試2^n次,就算信息只有60比特,大家知道的,2^60已經是個天文數字了。所以這方法非常安全。問題是,要記住這個密碼可不是易事。解決這個問題的方法就是使用流密碼嘍。

流密碼就是使用較短的一串數字(叫它密鑰吧),來生成無限長的偽隨機密碼流,當然事實上只需要生成和明文長度一樣的密碼流就夠了。一個非常簡單的流密碼算法是,用6個比特位101100做密鑰,將它不斷重復得到密碼流101100101100101100....直到和明文長度相等,然后將密碼流和明文“相加”就得到密文了,解密就是將這個密碼流和密文“相加”。簡單吧!其實這個流密碼算法有個特殊的名稱——維吉尼亞密碼,當然這里密鑰長度可以不是6。用較短的密鑰產生無限長的密碼流的方法非常多,其中有一種就叫做RC4。

在介紹RC4前,說說那個“相加”運算怎么實現。現在我們把明文的信息限制在ascii碼字符集內(它已經能表示所有的英文資料了哈哈),每個字符是一個比特,占8位。假設明文是abc,a、b、c的ascii值分別為97、98、99。二進制形式為01100001、01100010、01100011。密鑰流和明文長度一樣,假設是sdf,同樣可以得到二進制流01110011、01100100、01100110,讓他們在對應位做異或運算就可以得到密文了,c語言有^運算符來實現“相加”的操作。我們就直接對字符進行“相加”即a^s, b^d, c^f。得到的結果的二進制形式為00010010、00000110、00000101,它們分別表示ascii碼值為18、6、5的字符,在文本編輯器里打開是亂碼,沒有關系,反正是密文嘛:)

二、RC4

RC4用兩步來生成密碼流
首先你指定一個短的密碼,儲存在key[MAX]數組里,還有一個數組S[256],令S[i]=i。然后利用數組key來對數組S做一個置換,也就是對S數組里的數重新排列,排列算法為
for i from 0 to 255
    S[i] := i
endfor
j := 0
for i from 0 to 255
    j := (j + S[i] + key[i mod keylength]) mod 256
    swap values of S[i] and S[j]
endfor
第二步利用上面重新排列的數組 S 來產生任意長度的密鑰流,算法為
i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256
    j := (j + S[i]) mod 256
    swap values of S[i] and S[j]
    K := S[(S[i] + S[j]) mod 256]
    output K
endwhile
output K 一次產生一字符長度(8bit)的密鑰流數據,一直循環直到密碼流和明文長度一樣為止。

產生密鑰流之后,對信息進行加密和解密就只是做個“相加”的運算了。

附件是我的c代碼,編譯得到encrypt可執行文件,在命令行下運行 encrypt 命令(后面必須跟一個純文本文件名FILE作為參數),然后輸入密鑰,可將文件FILE進行加密,再次運行並輸入相同的密鑰可以進行解密,如果前后密鑰不同,就不是解密而是進行二次加密了,哈我可以用自己理解的方式來加密信息了:) 這個程序本是針對純英文文件來加密的,但是文件里有中文時一樣可以加解密。不知道c語言對於中文是如何處理的??

我還沒研究RC4的安全性,不知道破譯密碼難度大不大

附件:https://github.com/abellong/simpleRC4Encryption
參考資料:
http://en.wikipedia.org/wiki/RC4
MJB Robshaw - 1995  Stream Ciphers


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM