金色坐标

关注互联网和IT科技的个人博客

« 安装Windows XP SP3更新补丁遇到的问题JDK1.4信息传递安全性之数字签名 »

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))的替代品。

3.公钥加密

私钥密码术受到一个主要缺点的困扰:一开始怎样将私钥交给 Alice 和 Bob 呢?如果 Alice 生成了私钥,则必须将它发送给 Bob,但私钥是敏感信息,所以应该加密。但是,还没有交换密钥来执行加密。

公钥密码术是上世纪 70 年代发明的,它解决在没有事先约定密钥的通信双方之间加密消息的问题。

在公钥密码术中,Alice 和 Bob 不仅有不同的密钥,而且每人有两个密钥。一个是私有的,不应与任何人共享。另一个是公共的,可以与任何人共享。

当 Alice 想给 Bob 发送安全消息时,她用 Bob 的公钥加密消息并将结果发送给 Bob。Bob 使用他的私钥解密消息。当 Bob 想给 Alice 发送安全消息时,他用 Alice 的公钥加密消息并将结果发送给 Alice。Alice 使用她的私钥解密消息。Eve 可以窃听公钥和已加密的消息,但她不能解密消息,因为她没有任何一个私钥。

公钥和私钥是成对生成的,并需要比同等强度的私钥加密密钥更长。RSA 算法的典型密钥长度是 1,024 位。从该密钥对的一个成员派生出另一个是不可行的。

公钥加密比较慢(比私钥加密慢 100 到 1,000 倍),因此实际上通常使用混合技术。公钥加密被用于向对方分发称为会话密钥的私钥,使用该私有会话密钥的私钥加密被用于进行大量的消息加密。

公钥加密中使用下列两种算法:

1,RSA。这个算法是最流行的公钥密码,但 JDK 1.4 中不支持它。您必须使用类似于 BouncyCastle 的第三方库来获得这种支持。

2,Diffie-Hellman。技术上将这种算法称为密钥协定算法。它不能用于加密,但可以用来允许双方通过在公用通道上共享信息来派生出秘钥。然后这个密钥可以用于私钥加密。

Cipher 类使用由 KeyPairGenerator 类产生的密钥来操作公钥算法。公钥密码术代码示例示例中使用了下列方法:
(1)KeyPairGenerator.getInstance("RSA")、.initialize(1024) 和 .generateKeyPair():生成密钥对。
(2)Cipher.getInstance("RSA/ECB/PKCS1Padding") 创建 Cipher 对象(确定算法、方式和填充)。
(3).init(Cipher.ENCRYPT_MODE, key.getPublic()):初始化 Cipher 对象。
(4).doFinal(plainText):用明文字符串计算密文。
(5).init(Cipher.DECRYPT_MODE, key.getPrivate()) 和 .doFinal(cipherText):解密密文。

公钥密码术代码示例:

import java.security.*;
import javax.crypto.*;
//
// Public Key cryptography using the RSA algorithm.
public class PublicExample {

  public static void main (String[] args) throws Exception {
    //
    // check args and get plaintext
    if (args.length !=1) {
      System.err.println("Usage: java PublicExample text");
      System.exit(1);
    }
    byte[] plainText = args[0].getBytes("UTF8");
    //
    // generate an RSA key,用程序生成密鈅
    System.out.println( "\nStart generating RSA key" );
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(1024);
    KeyPair key = keyGen.generateKeyPair();
    System.out.println( "Finish generating RSA key" );
    //
    // get an RSA cipher object and print the provider  
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    System.out.println( "\n" + cipher.getProvider().getInfo() );
    //
    // encrypt the plaintext using the public key
    System.out.println( "\nStart encryption" );
    cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
    byte[] cipherText = cipher.doFinal(plainText);
    System.out.println( "Finish encryption: " );
    System.out.println( new String(cipherText, "UTF8") );
    //
    // decrypt the ciphertext using the private key
    System.out.println( "\nStart decryption" );
    cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
    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/12.html

发表评论:

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

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 通过Google订阅本站
  • 通过鲜果订阅本站
  • 通过电子邮件订阅
  • 本站支持WAP访问

Search

Google

最新评论及回复

最近发表

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

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