基于JAVA的CBC保密模式应用

时间:2022-03-30 05:49:28

基于JAVA的CBC保密模式应用

摘要:该文分析了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.

上一篇:蓝牙技术在住宅小区中的应用 下一篇:浅谈网站设计的规划