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


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

下面先介紹一下des,了解des的同學可以直接看下面的解決辦法。

Des加密

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

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

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

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

  • Key: 為8個字節共64位,Des算法規定,其中第8、16、24、......64位是奇偶校驗位,不參與Des運算,所以常說Des的密鑰為56位。 在Des加密和解密的過程當中,密鑰的長度都必須是8字節的倍數。

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

  • 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!

轉載請注明出處~


免責聲明!

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



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