注册 登录
LUPA开源社区 返回首页

盛忠良的个人空间 http://www.lupaworld.com/?928 [收藏] [复制] [分享] [RSS]

我的博客

Java中的加密和DSA数字签名

已有 2344 次阅读2006-8-6 06:21 |个人分类:杭州风景

一、单向加密(MD5和SHA-1)

单向加密通常用于消息摘要,具体算法可以阅读java.security.*的源代码获得。经过封装之后可以使用简单的静态方法来实现,Look:

package org.bromon;
public class MD5Encoder
{
public static void main(String args[])
{
String info=args[0];
try
{
  //选择MD5加密算法
  java.security.MessageDigest alg=
java.security.MessageDigest.getInstance("MD5");

  //选择SHA-1加密算法
  //java.security.MessageDigest alg=
java.security.MessageDigest.getInstance("SHA-1");

  alg.update(info.getBytes());
  byte[] digesta=alg.digest();
  String result="";
  for(int i=0;i<digesta.length;i++)
  {
  int m=digesta;
  if(m<0)
  {
  m+=256;//如果是负数就取模
  }

  result=result+Integer.toString(m,16).toUpperCase()+"";//转换为大写字符
  }
  System.out.println(result);
}catch(Exception e)
{
  System.out.println(e);
}
}
}


编译:javac –d . MD5Encoder.java
运行:java org.bromon.MD5Encoder someData

DES作为单钥加密的代表,目前好象仍然处于五角大楼出口限制的列表中!?

二、非对称加密DSA数字签名

通过使用密钥对来实现。根据非对称加密的原理,分发公钥并用其加密,私钥保密,用于解密。而DSA的数字签名则是利用私钥加密,公钥解密,用以保证不可否认性和完整性。以DSA数字签名为例:

首先需要生成一对密钥:

package org.bromon;
import java.io.*;
import java.security.*;

public class DSAGenerateKeyPair
{
public static void main(String args[])
{
try
{
  java.security.KeyPairGenerator keygen=
java.security.KeyPairGenerator.getInstance("DSA");

  SecureRandom sr=new SecureRandom();
  sr.setSeed("123".getBytes());//密钥种子
  keygen.initialize(512,sr);

  KeyPair keys=keygen.generateKeyPair();
  PublicKey pubkey=keys.getPublic();
  PrivateKey prikey=keys.getPrivate();

  //将生成的密钥对序列化到文件
  ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("prikey.dat"));
  out.writeObject(prikey);
  out.close();

  out=new ObjectOutputStream(new FileOutputStream("pubkey.dat"));
  out.writeObject(pubkey);
  out.close();
}catch(Exception e)
{
  System.out.println(e);
}

}
}

运行之后会在当前目录生成两个.dat文件。

然后可以使用私钥对数据签名:

package org.bromon;
import java.io.*;
import java.security.*;

public class DSASigner
{
public static void main(String args[])
{
String s="需要加密的内容";
try
{
  //导入私钥
  ObjectInputStream in=new ObjectInputStream(new FileInputStream("prikey.dat"));
  PrivateKey prikey=(PrivateKey)in.readObject();
  in.close();

  //对数据签名
  Signature signature=Signature.getInstance("DSA");
  signature.initSign(prikey);
  signature.update(s.getBytes());
  byte[] signed=signature.sign();

  //将签名后的数据写入文件
  ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("info.dat"));
  out.writeObject(s);
  out.writeObject(signed);
  out.close();
}catch(Exception e)
{
  System.out.println(e);
}

}

}

运行之后在当前路径产生一个加密后的文件,将此文件和公钥一起分发给接收者。

下面是使用公钥验证签名是否正常:

package org.bromon;
import java.security.*;
import java.io.*;

public class DSAChecker
{
public static void main(String args[])
{
try
{
  //导入公钥
  ObjectInputStream in=new ObjectInputStream(new FileInputStream("pubkey.dat"));
  PublicKey pubkey=(PublicKey)in.readObject();
  in.close();

  //导入需要读取的文件
  in=new ObjectInputStream(new FileInputStream("info.dat"));
  String s=(String)in.readObject();
  byte[] signed=(byte[])in.readObject();
  in.close();

  //验证密钥对
  Signature signCheck=Signature.getInstance("DSA");
  signCheck.initVerify(pubkey);
  signCheck.update(s.getBytes());
  if(signCheck.verify(signed))
  {
  System.out.println(s);
  }else{
  System.out.println("无阅读权限");
  }
}catch(Exception e)
{
  System.out.println(e);
}

}

}

运行之后如果密钥匹配无误,会显示加密的内容。如果公钥格式被破坏,会抛出异常。

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册
验证问答 换一个 验证码 换一个

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号