天天看點

如何用Java進行3DES加密解

最近一個合作商提出使用3DES交換資料,本來他們有現成的代碼,可惜隻有.net版本,我們的伺服器都是Linux,而且應用都是Java。于是對照他們提供的代碼改了一個Java的版本出來,主要是不熟悉3DES,折騰了一天,終于搞定。

所謂3DES,就是把DES做三次,當然不是簡單地DES DES DES就行了,中途有些特定的排列。這個我可不關心,呵呵,我的目的是使用它。

在網上搜尋了一下3DES,找到很少資料。經過朋友介紹,找到GNU Crypto和Bouncy Castle兩個Java擴充包,裡面應該有3DES的實作吧。

從GNU Crypto入手,找到一個TripleDES的實作類,發現原來3DES還有一個名字叫DESede,在網上搜尋TripleDES和DESede,呵呵,終于發現更多的資料了。

Java的安全API始終那麼難用,先建立一個cipher看看算法在不在吧

如果沒有抛異常的話,就證明這個算法是有效的

突然想看看JDK有沒有内置DESede,于是撇開Crypto,直接測試,發現可以正确運作。在jce.jar裡面找到相關的類,JDK内置了。

于是直接用DES的代碼來改&測試,最後代碼變成這樣

需要留意的是,要使用DESede的Spec、Factory和Cipher才行

事情還沒完結,合作商給過來的除了密鑰之外,還有一個IV向量。搜尋了一下,發現有一個IvParameterSpec類,于是代碼變成這樣

但是,運作報錯了

ECB是什麼呢?我的代碼完全沒有寫ECB什麼的

又上網搜尋,結果把DES的來龍去脈都搞清楚了

<a target="_blank" href="http://www.tropsoft.com/strongenc/des.htm">http://www.tropsoft.com/strongenc/des.htm</a>

ECB是其中一種字串分割方式,除了DES以外,其他加密方式也會使用這種分割方式的,而Java預設産生的DES算法就是用ECB方法,ECB不需要向量,當然也就不支援向量了

除了ECB,DES還支援CBC、CFB、OFB,而3DES隻支援ECB和CBC兩種

<a target="_blank" href="http://www.tropsoft.com/strongenc/des3.htm">http://www.tropsoft.com/strongenc/des3.htm</a>

CBC支援并且必須有向量,具體算法這裡就不說了。合作商給的.net代碼沒有聲明CBC模式,似乎是.net預設的方式就是CBC的

于是把模式改成CBC

成功運作了

後話:

搜尋的過程中,找到一個不錯的讨論

<code>http://www.lslnet.com/linux/dosc1/21/linux-197579.htm 在CBC(不光是DES算法)模式下,iv通過随機數(或僞随機)機制産生是一種比較常見的方法。iv的作用主要是用于産生密文的第一個block,以使最終生成的密文産生差異(明文相同的情況下),使密碼攻擊變得更為困難,除此之外iv并無其它用途。是以iv通過随機方式産生是一種十分簡便、有效的途徑。此外,在IPsec中采用了DES-CBC作為預設的加密方式,其使用的iv是通訊包的時間戳。從原理上來說,這與随機數機制并無二緻。</code>

看來,向量的作用其實就是salt

最大的好處是,可以令到即使相同的明文,相同的密鑰,能産生不同的密文

例如,我們用DES方式在資料儲存使用者密碼的時候,可以另外增加一列,把向量同時儲存下來,并且每次用不同的向量。這樣的好處是,即使兩個使用者的密碼是一樣的,資料庫儲存的密文,也會不一樣,就能降低猜測的可能性

另外一種用法,就是類似IPsec的做法,兩部主機互傳資料,保證兩部機的時鐘同步的前提下(可以取樣到分鐘或更高的機關避免偏差),用時鐘的變化值作為向量,就能增加被sniffer資料的解密難度