流密碼與RC4密碼初認識
一、前言
流密碼是對稱密碼算法,是私鑰密碼系統(tǒng)中的一個分組。流密碼的轉(zhuǎn)換是隨”變換”而變換的,像水流一樣源源不斷的產(chǎn)生,是對稱密碼算法,從明文輸入流逐位或逐字節(jié)產(chǎn)生密文輸出。今天我們來初認識一下流密碼和使用最廣泛的流密碼RC4。
二、什么是流密碼
流密碼是私鑰體質(zhì)下的一個對稱加密,類似于簡單算法的”一次一密”,不過”一次一密”是真正的理想密碼只要不能獲得密碼亂碼本,就是完全保密。流密碼使用的是偽隨機數(shù)流,利用密鑰產(chǎn)生一個密鑰流Z=Z1Z2Z3…,然后利用此密鑰流依次對明文X=X0X1X2…進行加密,這樣產(chǎn)生的密碼就是序列密碼,也稱為流密碼。
設(shè)計流密碼的因素
- 加密序列的周期要長,若出現(xiàn)重復(fù)的周期過短,容易被破解
- 密鑰流應(yīng)該盡可能地接近真正隨機數(shù)流的特征
- 密鑰長度要長,以避免瓊窮舉攻擊
流密碼就是使用較短的一串?dāng)?shù)字(叫它密鑰吧),來生成無限長的偽隨機密碼流,當(dāng)然事實上只需要生成和明文長度一樣的密碼流就夠了。
流密碼是將明文劃分成字符(如單個字母),或其編碼的基本單元(如0,1數(shù)字),字符分別與密鑰流作用進行加密,解密時以同步產(chǎn)生的同樣的密鑰流實現(xiàn)。
通俗的講,產(chǎn)生一串序列來作為加密的密鑰流,從密鑰流中按規(guī)則依次選取密鑰,這些不同的密鑰分別來加密每個字符。
流密碼的強度依賴于密鑰序列的隨機性和不可預(yù)測性。
核心在于密鑰流生成器的設(shè)計。
要保證收發(fā)兩端密鑰流的精確同步。
- 種子密鑰
- 信息流(明文流)
- 密文流
- 密鑰流
由此流密碼的基礎(chǔ)上,用較短的密鑰產(chǎn)生無限長的密碼流的方法非常多,其中有一種就叫做RC4。
三、RC4算法基礎(chǔ)介紹
RC4加密算法是大名鼎鼎的RSA三人組中的頭號人物Ron Rivest在1987年設(shè)計的密鑰長度可變的流加密算法簇。RC4算法是一種在電子信息領(lǐng)域加密的技術(shù)手段,用于無線通信網(wǎng)絡(luò),是一種電子密碼。
在介紹RC4前,說說那個“相加”運算怎么實現(xiàn)?,F(xiàn)在我們把明文的信息限制在Ascii碼字符集內(nèi)(它已經(jīng)能表示所有的英文資料了)
每個字符是一個比特,占8位。
假設(shè)明文是abc,
a、b、c的ascii值分別為
- 97、98、99
二進制形式為
- 01100001、01100010、01100011
密鑰流和明文長度一樣,假設(shè)是sdf,同樣可以得到二進制流
- 01110011、01100100、01100110
讓他們在對應(yīng)位做異或運算就可以得到密文了c語言有^運算符來實現(xiàn)“相加”的操作。
我們就直接對字符進行“相加”即
- a^s, b^d, c^f
二進制形式為
- 00010010、00000110、00000101
它們分別表示
ascii碼值為
- 18、6、5
的字符,在文本編輯器里打開是亂碼,沒有關(guān)系,反正是密文嘛
四、RC4
該算法是一個可變密鑰長度、面向字節(jié)操作的流密碼。該算法以隨機置換作為基礎(chǔ),其密碼周期很可能大于10^100,且該算法的運行速度很快。
RC4被用于為網(wǎng)絡(luò)瀏覽器和服務(wù)器間通信而制定的SSL/TLS(安全套接字協(xié)議/傳輸層安全協(xié)議)標(biāo)準(zhǔn)中,以及作為IEEE 801.11無線局域網(wǎng)標(biāo)準(zhǔn)一部分的WEP(Wired Equivalent Privacy)協(xié)議和新的WiFi受保護訪問協(xié)議(WAP)中。
從這些應(yīng)用來看,RC4構(gòu)成了當(dāng)今網(wǎng)絡(luò)通信的非常重要的部分,因此這個算法非常重要。
算法描述
- 首先你指定一個短的密碼,儲存在key[MAX]數(shù)組里,還有一個數(shù)組S[256],令S[i]=i。然后利用數(shù)組key來對數(shù)組S做一個置換,也就是對S數(shù)組里的數(shù)重新排列,排列算法為
- 利用上面重新排列的數(shù)組 S 來產(chǎn)生任意長度的密鑰流
- 用T產(chǎn)生S 的初始置換,置換偽碼如下,因為對S的操作僅是交換,S仍然包含所有值為 0-255的元素。
- 因為對S 的操作僅是交換,S仍然包含所有值為0-255的元素。
算法代碼
- # -*- coding: utf-8 -*-
- #by yuhao
- import random, base64
- from hashlib import sha1
- def crypt(data, key):
- x = 0
- box = range(256)
- for i in range(256):
- x = (x + box[i] + ord(key[i % len(key)])) % 256
- box[i], box[x] = box[x], box[i]
- x = y = 0
- out = []
- for char in data:
- x = (x + 1) % 256
- y = (y + box[x]) % 256
- box[x], box[y] = box[y], box[x]
- out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
- return ''.join(out)
- def tencode(data, key, encode=base64.b64encode, salt_length=16):
- salt = ''
- for n in range(salt_length):
- salt += chr(random.randrange(256))
- data = salt + crypt(data, sha1(key + salt).digest())
- if encode:
- data = encode(data)
- return data
- def tdecode(data, key, decode=base64.b64decode, salt_length=16):
- """RC4 decryption of encoded data"""
- if decode:
- data = decode(data)
- salt = data[:salt_length]
- return crypt(data[salt_length:], sha1(key + salt).digest())
- # 需要加密的數(shù)據(jù)
- data = 'freebuf hello'
- # 密鑰
- key = 'yuhao'
- # 加碼
- encoded_data = tencode(datadata=data, keykey=key)
- print encoded_data
- # 解碼
- decoded_data = tdecode(data=encoded_data, keykey=key)
- print decoded_data
五、總結(jié)
不過這里有一個小問題,當(dāng)RC4的密鑰長度超過128位時,目前沒有任何攻擊方法能夠破解。不過 WEP協(xié)議易受到一種特殊的攻擊方式攻擊,但這個問題本質(zhì)上并不在與RC4本身,而是RC4密鑰的產(chǎn)生途徑有漏洞