自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

流密碼與RC4密碼初認識

安全 數(shù)據(jù)安全
流密碼是對稱密碼算法,是私鑰密碼系統(tǒng)中的一個分組。流密碼的轉(zhuǎn)換是隨"變換"而變換的,像水流一樣源源不斷的產(chǎn)生,是對稱密碼算法,從明文輸入流逐位或逐字節(jié)產(chǎn)生密文輸出。

一、前言

流密碼是對稱密碼算法,是私鑰密碼系統(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值分別為

  1. 97、98、99 

二進制形式為

  1. 01100001、01100010、01100011 

密鑰流和明文長度一樣,假設(shè)是sdf,同樣可以得到二進制流

  1. 01110011、01100100、01100110 

讓他們在對應(yīng)位做異或運算就可以得到密文了c語言有^運算符來實現(xiàn)“相加”的操作。

我們就直接對字符進行“相加”即

  1. a^s, b^d, c^f 

二進制形式為

  1. 00010010、00000110、00000101 

它們分別表示

ascii碼值為

  1. 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ò)通信的非常重要的部分,因此這個算法非常重要。

TIM圖片20180120153949.png

算法描述

  • 首先你指定一個短的密碼,儲存在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的元素。

算法代碼

  1. # -*- coding: utf-8 -*-   
  2.  #by yuhao   
  3.  import random, base64   
  4.  from hashlib import sha1   
  5.  def crypt(data, key):   
  6.      x = 0   
  7.      box = range(256)   
  8.      for i in range(256):  
  9.          x = (x + box[i] + ord(key[i % len(key)])) % 256  
  10.          box[i], box[x] = box[x], box[i]   
  11.      x = y = 0   
  12.      out = []   
  13.      for char in data:   
  14.          x = (x + 1) % 256  
  15.          y = (y + box[x]) % 256   
  16.          box[x], box[y] = box[y], box[x]   
  17.          out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))   
  18.      return ''.join(out)      
  19.  def tencode(data, key, encode=base64.b64encode, salt_length=16):    
  20.      salt = ''  
  21.      for n in range(salt_length):  
  22.          salt += chr(random.randrange(256))  
  23.      data = salt + crypt(data, sha1(key + salt).digest())   
  24.      if encode:   
  25.          data = encode(data)  
  26.      return data   
  27.  def tdecode(data, key, decode=base64.b64decode, salt_length=16):   
  28.      """RC4 decryption of encoded data"""   
  29.      if decode:   
  30.          data = decode(data)  
  31.      salt = data[:salt_length]  
  32.      return crypt(data[salt_length:], sha1(key + salt).digest())  
  33.  # 需要加密的數(shù)據(jù)   
  34.  data = 'freebuf hello'   
  35.  # 密鑰   
  36.  key = 'yuhao'  
  37.  # 加碼  
  38.  encoded_data = tencode(datadata=data, keykey=key)  
  39.  print encoded_data  
  40.  # 解碼  
  41.  decoded_data = tdecode(data=encoded_datakeykey=key)  
  42.  print decoded_data  

五、總結(jié)

不過這里有一個小問題,當(dāng)RC4的密鑰長度超過128位時,目前沒有任何攻擊方法能夠破解。不過 WEP協(xié)議易受到一種特殊的攻擊方式攻擊,但這個問題本質(zhì)上并不在與RC4本身,而是RC4密鑰的產(chǎn)生途徑有漏洞

責(zé)任編輯:趙寧寧 來源: FreeBuf
相關(guān)推薦

2015-09-22 09:21:46

2013-09-27 13:27:18

2012-05-16 14:58:20

JavaJFile

2012-06-13 01:47:42

EclipseEquinox

2009-04-18 06:33:33

LinuxNetBSD 5.0 發(fā)行版

2015-07-20 11:38:36

2016-01-12 10:33:24

2015-09-07 10:12:46

2015-09-23 13:24:17

2010-07-06 09:36:52

Linux內(nèi)核

2009-03-02 17:35:27

2012-04-12 09:56:05

JActorJava

2010-06-10 10:48:50

Tomcat 7

2017-11-07 11:58:33

2021-08-02 14:41:04

Linux Kerne開發(fā)工作應(yīng)用程序

2016-10-09 11:55:09

JavascriptjointJSWeb

2011-08-10 10:30:46

2013-10-08 10:07:58

2017-06-01 09:03:51

2013-11-04 10:25:04

破解密碼密碼個人密碼
點贊
收藏

51CTO技術(shù)棧公眾號