des解密不完整,前面几位是乱码的解决办法
在工作中遇到的Des解密問題,第三方發(fā)來的數(shù)據(jù)需要我們進(jìn)行des解密,但是解密的結(jié)果前幾位始終是亂碼。廢了半天勁,終于找到了問題所在。
下面先介紹一下des,了解des的同學(xué)可以直接看下面的解決辦法。
Des加密
DES全稱為Data EncryptionStandard,即數(shù)據(jù)加密標(biāo)準(zhǔn)。Des加密算法是一種對(duì)稱加密算法,所謂對(duì)稱加密算法就是指對(duì)明文的加密以及對(duì)密文的解密用的是同一個(gè)密鑰。
Des使用一個(gè)56位的密鑰以及附加的8位奇偶校驗(yàn)位,產(chǎn)生最大64位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過程會(huì)繼續(xù)下去,但最后一個(gè)循環(huán)不交換。DES 使用 16 個(gè)循環(huán),使用異或,置換,代換,移位操作四種基本運(yùn)算。
特點(diǎn):數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合。
Des算法的入口參數(shù)有三個(gè):Key、Data、Mode。
Key: 為8個(gè)字節(jié)共64位,Des算法規(guī)定,其中第8、16、24、......64位是奇偶校驗(yàn)位,不參與Des運(yùn)算,所以常說Des的密鑰為56位。 在Des加密和解密的過程當(dāng)中,密鑰的長(zhǎng)度都必須是8字節(jié)的倍數(shù)。
Data: 8個(gè)字節(jié)64位,是要被加密后解密的數(shù)據(jù)。
Mode: Des的工作方式:加密、解密。
Des加密模式
Des的加密模式主要有CBC模式,ECB模式,它們分別使用不同的加密方式加密。
ECB模式指的是電子密碼本模式,是一種最古老,最簡(jiǎn)單的模式,將加密的數(shù)據(jù)分成若干組,每組的大小跟加密密鑰長(zhǎng)度相同;然后每組都用相同的密鑰加密, 如果最后一個(gè)分組長(zhǎng)度不夠64位,要補(bǔ)齊64位。
ECB模式的特點(diǎn)是:
每次Key、明文、密文的長(zhǎng)度都必須是64位;
數(shù)據(jù)塊重復(fù)排序不需要檢測(cè);
相同的明文塊(使用相同的密鑰)產(chǎn)生相同的密文塊,容易遭受字典攻擊;
一個(gè)錯(cuò)誤僅僅會(huì)對(duì)一個(gè)密文塊產(chǎn)生影響;
CBC模式指的是加密塊鏈模式,與ECB模式最大的不同是加入了初始向量。
CBC模式的特點(diǎn)是:
每次加密的密文長(zhǎng)度為64位(8個(gè)字節(jié));
當(dāng)相同的明文使用相同的密鑰和初始向量的時(shí)候CBC模式總是產(chǎn)生相同的密文;
密文塊要依賴以前的操作結(jié)果,所以,密文塊不能進(jìn)行重新排列;
可以使用不同的初始化向量來避免相同的明文產(chǎn)生相同的密文,一定程度上抵抗字典攻擊;
一個(gè)錯(cuò)誤發(fā)生以后,當(dāng)前和以后的密文都會(huì)被影響;
填充方式
常見的填充方式PKCS5Padding,PKCS5Padding表示當(dāng)數(shù)據(jù)位數(shù)不足的時(shí)候要采用的數(shù)據(jù)補(bǔ)齊方式,也可以叫做數(shù)據(jù)填充方式。PKCS5Padding這種填充方式,具體來說就是“填充的數(shù)字代表所填字節(jié)的總數(shù)”
比如說,差兩個(gè)字節(jié),就是######22,差5個(gè)字節(jié)就是###55555,這樣根據(jù)最后一個(gè)自己就可以知道填充的數(shù)字和數(shù)量。
保證加密解密的一致性
在不同的平臺(tái)上,只要能保證這幾個(gè)參數(shù)的一致,就可以實(shí)現(xiàn)加密和解密的一致性。
加密和解密的密鑰一致
采用CBC模式的時(shí)候,要保證初始向量一致
采用相同的填充模式
python中的des加密
在python中,我們使用pyDes對(duì)數(shù)據(jù)進(jìn)行des加密:
# pyDes.des(key, [mode], [IV], [pad], [padmode])key: des的加密解密密鑰。
mode: 加密模式:支持CBC,ECB兩種模式
IV: 初始化向量,這是CBC模式專有的,長(zhǎng)度為8 bytes。使用不同的初始化向量加密避免產(chǎn)生相同的密文,一定程度上抵抗字典攻擊。
pad: 當(dāng)padmode設(shè)置為PAD_NORMAL時(shí),用pad參數(shù)來指定填充方式。
padmode: 填充方式,默認(rèn)為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" % dprint "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)傳遞過來的加密數(shù)據(jù): xUjw0iO7uhymZ+h/VB9kvhubiAEv4Kzz
通過k解密出來的數(shù)據(jù):@IDX_^\x10Ys powerful
這種情況通常發(fā)生在不同語言(java加密、python解密)對(duì)初始向量的處理方式不同造成的解密不完全。
解決辦法:檢查初始向量的表現(xiàn)形式。
k1 = des(des_key, mode=CBC, IV='\1\2\3\4\5\6\7\x08', padmode=PAD_PKCS5)通過k1解密出來的數(shù)據(jù):python is powerful
OK!
轉(zhuǎn)載請(qǐng)注明出處~
轉(zhuǎn)載于:https://www.cnblogs.com/Lands-ljk/p/5888765.html
總結(jié)
以上是生活随笔為你收集整理的des解密不完整,前面几位是乱码的解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: implicit assignment
- 下一篇: 服务器类型应用层次