在工作中遇到的Des解密問題,第三方發來的數據需要我們進行des解密,但是解密的結果前幾位始終是亂碼。廢了半天勁,終於找到了問題所在。 下麵先介紹一下des,瞭解des的同學可以直接看下麵的解決辦法。 Des加密 DES全稱為Data EncryptionStandard,即數據加密標準。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模式的特點是:
每次Key、明文、密文的長度都必須是64位;
數據塊重覆排序不需要檢測;
相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;
一個錯誤僅僅會對一個密文塊產生影響;
CBC模式指的是加密塊鏈模式,與ECB模式最大的不同是加入了初始向量。
CBC模式的特點是:
每次加密的密文長度為64位(8個位元組);
當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;
密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;
可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;
一個錯誤發生以後,當前和以後的密文都會被影響;
填充方式
常見的填充方式PKCS5Padding,PKCS5Padding表示當數據位數不足的時候要採用的數據補齊方式,也可以叫做數據填充方式。PKCS5Padding這種填充方式,具體來說就是“填充的數字代表所填位元組的總數”
比如說,差兩個位元組,就是######22,差5個位元組就是###55555,這樣根據最後一個自己就可以知道填充的數字和數量。
保證加密解密的一致性
在不同的平臺上,只要能保證這幾個參數的一致,就可以實現加密和解密的一致性。
加密和解密的密鑰一致
採用CBC模式的時候,要保證初始向量一致
採用相同的填充模式
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!
轉載請註明出處~
更多內容請訪問:http://www.landsblog.com/blog/