选择显示字体大小

java加密和数字签名编程快速入门


  本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。对密码学有兴趣的伙伴,推荐看bruce schneier的著作:applied crypotography。在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对rsa算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍):

  一、密码学上常用的概念 

  1)消息摘要:

  这是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有md4、md5、sha-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security.messagedigest提供了一个简易的操作方法:

/**
*messagedigestexample.java
*copyright 2005-2-16
*/
import java.security.messagedigest;
/**
*单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存
*/
public class messagedigestexample{
 public static void main(string[] args) throws exception{
  if(args.length!=1){
   system.err.println("usage:java messagedigestexample text");
   system.exit(1);
  }

  byte[] plaintext=args[0].getbytes("utf8");

  //使用getinstance("算法")来获得消息摘要,这里使用sha-1的160位算法
  messagedigest messagedigest=messagedigest.getinstance("sha-1");

  system.out.println("\n"+messagedigest.getprovider().getinfo());
  //开始使用算法
  messagedigest.update(plaintext);
  system.out.println("\ndigest:");
  //输出算法运算结果
  system.out.println(new string(messagedigest.digest(),"utf8"));
 }
}

  还可以通过消息认证码来进行加密实现,javax.crypto.mac提供了一个解决方案,有兴趣者可以参考相关api文档,本文只是简单介绍什么是摘要算法。

  2)私钥加密

  消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。

  这种最好理解,使用对称算法。比如:a用一个密钥对一个文件加密,而b读取这个文件的话,则需要和a一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):

  使用私钥加密的话,首先需要一个密钥,可用javax.crypto.keygenerator产生一个密钥(java.security.key),然后传递给一个加密工具(javax.crypto.cipher),该工具再使用相应的算法来进行加密,主要对称算法有:des(实际密钥只用到56位),aes(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有desede等,jdk1.5种也提供了对对称算法的支持,以下例子使用aes算法来加密

/**
*privateexmaple.java
*copyright 2005-2-16
*/
import javax.crypto.cipher;
import javax.crypto.keygenerator;
import java.security.key;

/**
*私鈅加密,保证消息机密性
*/
public class privateexample{
 public static void main(string[] args) throws exception{
  if(args.length!=1){
   system.err.println("usage:java privateexample <text>");
   system.exit(1);
  }
  byte[] plaintext=args[0].getbytes("utf8");

  //通过keygenerator形成一个key
  system.out.println("\nstart generate aes key");
  keygenerator keygen=keygenerator.getinstance("aes");
  keygen.init(128);
  key key=keygen.generatekey();
  system.out.println("finish generating des key");

  //获得一个私鈅加密类cipher,ecb是加密方式,pkcs5padding是填充方法
  cipher cipher=cipher.getinstance("aes/ecb/pkcs5padding");
  system.out.println("\n"+cipher.getprovider().getinfo());

  //使用私鈅加密
  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"));

  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"));

 }
}

  3)公钥加密

  上面提到,私钥加密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有rsa,还包括blowfish,diffie-helman等,jdk1.5种提供了对rsa的支持,是一个改进的地方:

/**
*publicexample.java
*copyright 2005-2-16
*/
import java.security.key;
import javax.crypto.cipher;
import java.security.keypairgenerator;
import java.security.keypair;
/**
*一个简单的公鈅加密例子,cipher类使用keypairgenerator生成的公鈅和私鈅
*/
public class publicexample{
 public static void main(string[] args) throws exception{
  if(args.length!=1){
   system.err.println("usage:java publicexample <text>");
   system.exit(1);
  }

  byte[] plaintext=args[0].getbytes("utf8");
  //构成一个rsa密钥
  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");

  //获得一个rsa的cipher类,使用公鈅加密
  cipher cipher=cipher.getinstance("rsa/ecb/pkcs1padding");
  system.out.println("\n"+cipher.getprovider().getinfo());

  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"));

  //使用私鈅解密
  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"));
 }
}


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons