金色坐标

关注互联网应用和搜索引擎技术

« JDK1.4信息传递安全性之消息摘要安装Windows XP SP3更新补丁遇到的问题 »

JDK1.4信息传递安全性之私钥加密

虽然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") );
  }
}

 




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/10.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 通过Google订阅本站
  • 通过bloglines订阅本站
  • 通过抓虾订阅本站
  • 通过yahoo订阅本站

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.