des解密不完整,前面幾位是亂碼的解決辦法

在工做中遇到的Des解密問題,第三方發來的數據須要咱們進行des解密,可是解密的結果前幾位始終是亂碼。廢了半天勁,終於找到了問題所在。java

下面先介紹一下des,瞭解des的同窗能夠直接看下面的解決辦法。python

Des加密

DES全稱爲Data EncryptionStandard,即數據加密標準。Des加密算法是一種對稱加密算法,所謂對稱加密算法就是指對明文的加密以及對密文的解密用的是同一個密鑰。算法

Des使用一個56位的密鑰以及附加的8位奇偶校驗位,產生最大64位的分組大小。這是一個迭代的分組密碼,使用稱爲 Feistel 的技術,其中將加密的文本塊分紅兩半。使用子密鑰對其中一半應用循環功能,而後將輸出與另外一半進行「異或」運算;接着交換這兩半,這一過程會繼續下去,但最後一個循環不交換。DES 使用 16 個循環,使用異或,置換,代換,移位操做四種基本運算。加密

特色:數據加密標準,速度較快,適用於加密大量數據的場合。code

Des算法的入口參數有三個:Key、Data、Mode。排序

  • Key: 爲8個字節共64位,Des算法規定,其中第八、1六、2四、......64位是奇偶校驗位,不參與Des運算,因此常說Des的密鑰爲56位。 在Des加密和解密的過程中,密鑰的長度都必須是8字節的倍數。io

  • Data: 8個字節64位,是要被加密後解密的數據。import

  • Mode: Des的工做方式:加密、解密。亂碼

Des加密模式

Des的加密模式主要有CBC模式,ECB模式,它們分別使用不一樣的加密方式加密。循環

ECB模式指的是電子密碼本模式,是一種最古老,最簡單的模式,將加密的數據分紅若干組,每組的大小跟加密密鑰長度相同;而後每組都用相同的密鑰加密, 若是最後一個分組長度不夠64位,要補齊64位。

ECB模式的特色是:

  1. 每次Key、明文、密文的長度都必須是64位;

  2. 數據塊重複排序不須要檢測;

  3. 相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;

  4. 一個錯誤僅僅會對一個密文塊產生影響;

CBC模式指的是加密塊鏈模式,與ECB模式最大的不一樣是加入了初始向量。

CBC模式的特色是:

  1. 每次加密的密文長度爲64位(8個字節);

  2. 當相同的明文使用相同的密鑰和初始向量的時候CBC模式老是產生相同的密文;

  3. 密文塊要依賴之前的操做結果,因此,密文塊不能進行從新排列;

  4. 可使用不一樣的初始化向量來避免相同的明文產生相同的密文,必定程度上抵抗字典攻擊;

  5. 一個錯誤發生之後,當前和之後的密文都會被影響;

填充方式

常見的填充方式PKCS5Padding,PKCS5Padding表示當數據位數不足的時候要採用的數據補齊方式,也能夠叫作數據填充方式。PKCS5Padding這種填充方式,具體來講就是「填充的數字表明所填字節的總數」

好比說,差兩個字節,就是######22,差5個字節就是###55555,這樣根據最後一個本身就能夠知道填充的數字和數量。

保證加密解密的一致性 

在不一樣的平臺上,只要能保證這幾個參數的一致,就能夠實現加密和解密的一致性。

  1. 加密和解密的密鑰一致

  2. 採用CBC模式的時候,要保證初始向量一致

  3. 採用相同的填充模式

python中的des加密

在python中,咱們使用pyDes對數據進行des加密:

# pyDes.des(key, [mode], [IV], [pad], [padmode])
  • key: des的加密解密密鑰。

  • mode: 加密模式:支持CBC,ECB兩種模式

  • IV: 初始化向量,這是CBC模式專有的,長度爲8 bytes。使用不一樣的初始化向量加密避免產生相同的密文,必定程度上抵抗字典攻擊。

  • pad: 當padmode設置爲PAD_NORMAL時,用pad參數來指定填充方式。

  • padmode: 填充方式,默認爲PAD_PKCS5填充模式。

    Example
      -------
      from pyDes import *
    
      data = "Please encrypt my data"
      k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    
      # For Python3, you'll need to use bytes, i.e.:
      # data = b"Please encrypt my data"
      # k = des(b"DESCRYPT", CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    
      d = k.encrypt(data)
      print "Encrypted: %r" % d
      print "Decrypted: %r" % k.decrypt(d)
      assert k.decrypt(d, padmode=PAD_PKCS5) == data

des加密後(CBC模式)使用相同的密鑰,初始向量,填充模式解密,解密後的字符前幾位是亂碼,其餘位正常的解決辦法

des_key = 'ucgtchdp'

IV = '12345678'

k = des(des_key, mode=CBC, IV='12345678', padmode=PAD_PKCS5)

傳遞過來的加密數據: xUjw0iO7uhymZ+h/VB9kvhubiAEv4Kzz

經過k解密出來的數據:@IDX_^\x10Ys powerful

這種狀況一般發生在不一樣語言(java加密、python解密)對初始向量的處理方式不一樣形成的解密不徹底。

解決辦法:檢查初始向量的表現形式。

k1 = des(des_key, mode=CBC, IV='\1\2\3\4\5\6\7\x08', padmode=PAD_PKCS5)

經過k1解密出來的數據:python is powerful

OK!

轉載請註明出處~

相關文章
相關標籤/搜索