- 论坛徽章:
- 0
|
Java加密扩展基础——转
实现细节
JCE API由很多类和接口组成。它们具有若干种算法和安全特性。本文首先讨论常用的对称算法数据加密标准DES(Data Encryption Standard)。
产生密钥
程序清单D 说明了如何初始化KeyGenerator和产生密钥。
为了生成密钥,我们首先得获得KeyGenerator的一个实例。这可以由调用KeyGenerator类的静态方法getInstance完成。我们用普通的、不带模式或者方案的DES算法。可选地,你可以如下所示传递参数:
DES/ECB/PKCS5Padding
这样就提供了带ECB(电子密码本)模式和PKCS#5补充风格的DES算法。你还可以传递第2个字符串参数指定要使用的供应者实现,不过这并不是必需的:
KeyGenerator kg = KeyGenerator.getInstance("DES";
获得自己的KeyGenerator,之后就可以调用generateKey方法获得我们的密钥:
Key key = kg.generateKey();
产生密码
我们采用生成密钥相同的方式生成一个密码。我们必须调用Cipher类的静态方法getInstance。该方法的参数同KeyGenerator完全一样:
Cipher cipher = Cipher.getInstance(“DES”);
程序清单E 显示了有关的操作程序。
数据加密和解密
加密是在字节级别上进行的,所以数据的各个方面一个不落全都会被加密。一旦获得了密钥和密码,你就可以对数据进行安全操作了。值得注意的是密钥和密码必须采用同类算法。你不能用DESede初始化密钥却用DES初始化密码。Cipher对象采用同样的方法对数据加密和解密,所以你必须首先对其初始化以便它知道对数据进行怎样的操作:
cipher.init(Cipher.ENCRYPT_MODE, key);
以上方法调用对Cipher对象初始化以准备加密数据。加密数据的最简单办法就是调用 Cipher对象的doFinal方法,同时传递字节数组:
byte[] data = “Hello World!”.getBytes();
byte[] result = cipher.doFinal(data);
result现在包含传递数据的加密形式。对同一数据解密也很容易。但在解密之前,我们必须重新初始化Cipher对象以便其准备解密:
cipher.init(Cipher.DECRYPT_MODE, key);
之后即可解密:
byte[] original = cipher.doFinal(result);
现在original应该和data.完全相同。程序清单F所示为全部源代码。
小结
JCE是一种强大的API,它可以实施多种类型的加密和其他涉及安全的任务。我们已经知道了如何以静态和动态方式安装JCE,以及采用对称加密算法对简单消息加密和解密。在本系列的第2部分,我还会利用以上的这些知识运用到真实环境下来,教你如何编写简单的封装类以结合套接字加密应用程序的所有网络流量。
|
|