虽然JDK最新版本已经有了JDK5和JDK6,但是在目前已经成熟的企业级应用中,JDK1.4所占的比例仍然是巨大的。JDK1.4在信息传递的安全性保证方面,主要有以下概念:
1,消息摘要:这是一种与消息认证码结合使用以确保消息完整性的技术;
2,私钥加密:被设计用来确保消息机密性的技术;
3,公钥加密:允许通信双方不必事先协商秘钥即可共享秘密消息的技术;
4,数字签名:证明另一方的消息确定来自正确通信方的位模式;
5,数字证书:通过让第三方认证机构认证消息,向数字签名添加另一级别安全性的技术;
6,代码签名:由可信的实体将签名嵌入被传递的代码中的概念;
7,SSL/TLS:在客户机和服务器之间建立安全通信通道的协议。传输层安全性(Transport Layer Security (TLS))是安全套接字层(Secure Sockets Layer (SSL))的替代品。
2.私钥加密
消息摘要可以确保消息的完整性,但不能用来确保消息的机密性。要确保机密性,我们需要使用私钥密码术来交换私有消息。
Alice 和 Bob 各有一个只有他们两人知道的共享密钥,并且约定使用一种公用密码算法或密码。也就是说,他们保持密钥的私有性。当 Alice 想给 Bob 发送消息时,她加密原始消息(称为明文)以创建密文,然后将密文发送给 Bob。Bob 接收了来自 Alice 的密文并用自己的私钥对它解密,以重新创建原始明文消息。如果窃听者 Eve 侦听该通信,她仅得到密文,因此消息的机密性得以保持。
您可以加密单一位或位块(称为块)。块(称为密码块)通常是 64 位大小。如果消息大小不是 64 位的整数倍,那么必须填充短块。单一位加密在硬件实现中更常见。单一位的密码被称为序列密码。
私钥加密的强度取决于密码算法和密钥的长度。如果算法比较好,那么攻击它的唯一方法就是使用尝试每个可能密钥的蛮力攻击,它平均要尝试 (1/2)*2*n 次,其中 n 是密钥的位数。
在美国出口法规很严时,只允许出口 40 位密钥。这种密钥长度相当弱。美国官方标准(DES 算法)使用 56 位密钥,但随着处理器速度的增加,它变得越来越弱。现在,通常首选 128 位密钥。如果每秒可以尝试一百万个密钥,那么,使用 128 位密钥,找到密钥所需的平均时间是宇宙年龄的许多倍!
什么是填充?
如前所述,如果使用分组密码而消息长度不是块长度的整数倍,那么,必须用字节填充最后一个块以凑成完整的块大小。有许多方法填充块,譬如全用零或一。在本教程中,我们将对私钥加密使用 PKCS5 填充,而对公钥加密使用 PKCS1。
使用 PKCS5 时,由一个其值表示剩余字节数的重复字节来填充短块。我们不深入地讨论填充算法(padding algorithms),但需要了解的信息是,JDK 1.4 支持下列填充技术:
1,无填充
2,PKCS5
3,OAEP
4,SSL3
JDK 1.4 支持下列私钥算法:
1,DES。DES(数据加密标准)是由 IBM 于上世纪 70 年代发明的,美国政府将其采纳为标准。它是一种 56 位分组密码。
2,TripleDES。该算法被用来解决使用 DES 技术的 56 位时密钥日益减弱的强度,其方法是:使用两个密钥对明文运行 DES 算法三次,从而得到 112 位有效密钥强度。TripleDES 有时称为 DESede(表示加密、解密和加密这三个阶段)。
3,AES。AES(高级加密标准)取代 DES 成为美国标准。它是由 Joan Daemen 和 Vincent Rijmen 发明的,也被称为 Rinjdael 算法。它是 128 位分组密码,密钥长度为 128 位、192 位或 256 位。
4,RC2、RC4、和 RC5。这些算法来自领先的加密安全性公司 RSA Security。
5,Blowfish。这种算法是由 Bruce Schneier 开发的,它是一种具有从 32 位到 448 位(都是 8 的整数倍)可变密钥长度的分组密码,被设计用于在软件中有效实现微处理器。
6,PBE。PBE(基于密码的加密)可以与多种消息摘要和私钥算法结合使用。
Cipher 类使用由 KeyGenerator 类产生的密钥操作私钥算法。私钥密码术代码示例中使用了下列方法:
(1)KeyGenerator.getInstance("DES")、.init(56) 和 .generateKey():生成密钥。
(2)Cipher.getInstance("DES/ECB/PKCS5Padding"):创建 Cipher 对象(确定算法、方式和填充)。
(3).init(Cipher.ENCRYPT_MODE, key):初始化 Cipher 对象。
(4).doFinal(plainText):用明文字符串计算密文。
(5).init(Cipher.DECRYPT_MODE, key):解密密文。
(6).doFinal(cipherText):计算密文。
私钥密码术代码示例
import java.security.*;
import javax.crypto.*;
//
// encrypt and decrypt using the DES private key algorithm
public class PrivateExample {
public static void main (String[] args) throws Exception {
//
// check args and get plaintext
if (args.length !=1) {
System.err.println("Usage: java PrivateExample text");
System.exit(1);
}
byte[] plainText = args[0].getBytes("UTF8");
//
// get a DES private key
System.out.println( "\nStart generating DES key" );
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
Key key = keyGen.generateKey();
System.out.println( "Finish generating DES key" );
//
// get a DES cipher object and print the provider
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
System.out.println( "\n" + cipher.getProvider().getInfo() );
//
// encrypt using the key and the plaintext
System.out.println( "\nStart encryption" );
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText);
System.out.println( "Finish encryption: " );
System.out.println( new String(cipherText, "UTF8") );
//
// decrypt the ciphertext using the same key
System.out.println( "\nStart decryption" );
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] newPlainText = cipher.doFinal(cipherText);
System.out.println( "Finish decryption: " );
System.out.println( new String(newPlainText, "UTF8") );
}
}




