摘要:該文分析了CBC保密模式的原理并基于Java語言完成了相應實現,該模式的優點是引入隨機初始向,避免了ECB的缺點,隱蔽了明文的數據模式,在很大程度上能防止數據篡改。
關鍵詞:CBC;加密;解密;java
中圖分類號:TP309文獻標識碼:A 文章編號:1009-3044(2009)33-9274-02
Implementation of CBC Secrecy Based on Java
CAI Wei
(School of Computer Engineering, Nanjing Institute of Technology, Nanjing 211167, China)
Abstract: In this paper the CBC mode is presented.And then,a experiment based on Java is taked,the result shows the CBC mode can hide data pattern and avoid data juggle.
Key words:CBC; encryption; decryption; java
隨著全球信息化進程的不斷加快,用戶對信息的安全需求日益迫切,解決這一問題的有效的手段是使用現代密碼技術。實用密碼本制的研究基本上沿兩個方向進行,即以RSA為代表的公開密鑰密碼體制和以DES為代表的秘密鑰分組密碼體制。由于Java 在網絡編程中的適用性,以及Java 安全體系結構的日益完善,用Java 來實現信息的加密、解密會具有更好的安全性和應用性。
1 數據加密技術
數據加密技術[2]是實現信息保密性的一種重要手段。最常用的加密算法是“置換表”算法,本文研究的是一種改進的算法,即字/字節循環移位和XOR操作。把一個字或字節在一個數據流內做循環移位,使用多個或變化的方向(左移或右移) ,就可以迅速的產生一個加密的數據流。如果再使用XOR操作,按位做異或操作,那么破譯密碼就相當困難。CBC(Cipher Block Chaining)使用的就是這種思想。
2 CBC工作模式分析與應用
2.1 CBC工作模式
CBC是1980年NBS為DES推出的保密模式[3],NIST也將這個模式列為AES的模式標準。下面是CBC保密模式的加密解密變換公式。
EK(X):基于密鑰K加密明文塊X
E-1K(Y):基于密鑰K解密密文塊Y
P1,…,Pi,明文, 每個Pi是n比特塊, n是密碼的分組長度
C1,…,Ci,密文
加密變換:Ci = EK ( Pi⊕ Ci - 1 )
解密變換:Pi = E-1K (Ci) ⊕ Ci - 1, C0是初始向量
2.2 對稱密鑰的生成
使用CBC模式[4]進行加密解密,首先需要生成密鑰。如果加密和解密的密鑰相同,即為對稱密鑰加密。對稱密鑰加密的經典算法是DES算法。DES主要采用替換和移位的方法加密。其運算速度快,安全性好,適合加密大量數據。
java中對稱密鑰的生成如下:
//使用DESede算法獲取密鑰生成器
KeyGenerator kg = KeyGenerator.getInstance(\"DESede\");
//初始化密鑰生成器,密鑰長度為168
kg.init(168);
//生成密鑰
SecretKey k = kg.generateKey();
//以序列化方式保存密鑰
OutputStream os = new FileOutputStream(\"key.dat\");
ObjectOutputStream bos = new ObjectOutputStream(os);
bos.writeObject(k);
2.3 使用CBC保密模式進行加密、解密
對密文分組的不同形成了不同的加密方式,EBC模式對每個明文分組獨立進行處理。所以,如果明文字節分組相同的話,加密后的密文也是相同的分組。
CBC模式在塊加密法中增加反饋機制,保證即使輸入的明文塊重復出現,這些明文塊也會在加密后得到不同的密文塊。在CBC中,上一次的加密結果反饋到當前塊的加密中,用每個塊修改下一個塊的加密。這樣,每塊密文與相應的當前輸入明文塊相關,與前面的所有明文塊有關。所以,即使明文字節分組相同,加密后的密文也毫無規律。
加密過程如下:
1) 接受兩個輸入:第一個明文塊和初始向量,稱為初始化向量
2) 第一個明文塊和初始化向量用異或運算組合,然后用一個密鑰加密,產生第一個密文塊,第一個密文塊作為下一個明文塊的反饋
3) 將第三個明文塊與第二個密文塊用異或運算組合,然后用相同的密鑰加密,產生第三個密文塊
4) 依此類推,直至加密結束
初始向量作用如下,因為如果兩個密文的頭8個字節相同,并且使用的密鑰相同,則每條密文的開頭8個字節也將相同。對此,CBC使用一個8個字節的隨機數作為初始向量來加密第一個分組,由于初始向量的隨機性,這個問題迎刃而解。
以下是CBC加密方式的java實現:
//需加密的明文
String s = \"Hello123Hello123\";
//從文件key.dat中讀取密鑰
InputStream f1 = new FileInputStream(\"key.dat\");
ObjectInputStream ois=new ObjectInputStream(f1);
Key k=(Key)ois.readObject( );
//生成初始向量
byte[] rand = new byte[8]; Random r = new Random(); r.nextBytes(rand);
//使用隨機數得到初始向量
IvParameterSpec iv = new IvParameterSpec(rand);
//獲取密碼器,DESede為加密算法
// CBC為加密模式,PKCS5Padding為填充模式
Cipher cp = Cipher.getInstance(\"DESede/CBC/PKCS5Padding\");
//初始化密碼器,并執行加密
cp.init(Cipher.ENCRYPT_MODE, k, iv);
byte[] ptext = s.getBytes(\"UTF-8\");
byte[] ctext = cp.doFinal(ptext);
//將初始向量和密文輸入到SEncCBC.dat中
OutputStream f2 = new FileOutputStream(\"SEncCBC.dat\");
f2.write(rand); f2.write(ctext);
基于CBC模式的解密過程如下:
1) 通過文件輸入流InputStream讀取文件SEncCBC.dat的開始8個字節,獲取加密時所用的初始向量;
2) 通過對象輸入流ObjectInputStream讀取加密時使用的密鑰,該密鑰被序列化后保存在key.dat中;
3) 讀取密文,首先判斷文件SEncCBC.dat的剩余字節數,并創建相應的字節數組,然后使用文件輸入流讀取;
4) 使用Cipher.DECRYPTMODE模式初始化密碼器,調用doFinal進行解密;
5) 將解密后的明文通過文件輸出流OutputStream保存到文件中。
3 實驗結果與分析
以下是實驗結果,以字符串作為明文,該明文可分為4個相同單元,每個單元由8個字節組成。加密結果如表1所示:
通過實驗,可以清楚的看到ECB模式加密后的密文和明文一樣,具有明顯的規律性,而CBC模式加密的密文卻無規律可循,完全隱蔽了明文的數據模式,從而使得破解難度大大增加。
4 結論
該文研究的基于CBC保密模式的加密解密應用引入了隨機的初始向量,隱蔽了明文的數據模式,增強了實際信息安全保護系統中密文的加密效果,具有較廣泛的應用前景。
參考文獻:
[1] 潘曉中.數據加密技術分析[J].系統工程與電子技術,2003(2).
[2] 王勇.RSA公開密鑰密碼體制的密鑰生成研究[J].計算機應用研究,1998(3).
[3] 盧開澄.計算機密碼學——計算機網絡中的數據保密和安全[M].北京:清華大學出版社,1998.
[4] Schneier B.應用密碼學[M].吳世忠,譯.北京:機械工業出版社,2000.