手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> java >> JAVA加密算法实现用例 数字签名

JAVA加密算法实现用例 数字签名

32380 java | 2015-3-6

所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行 RSA 算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。

 

java数字签名算法

 

在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH 函数)生成的,对这些 HASH 函数的特殊要求是:
1:接受的输入报文数据没有长度限制;
2:对任何输入报文数据生成固定长度的摘要(数字指纹)输出
3:从报文能方便地算出摘要;
4:难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要;
5:两个不同的报文难以生成相同的摘要

代表:DSA

package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
public class DSA {
 public static void main(String[] args) {
  try {
   DSA my = new DSA();
   my.run();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public void run() {
  // 数字签名生成密钥
  // 第一步生成密钥对,如果已经生成过 , 本过程就可以跳过
  // 对用户来讲 myprikey.dat 要保存在本地,而 mypubkey.dat 给发布给其它用户
  if ((new java.io.File("myprikey.dat")).exists() == false) {
   if (generatekey() == false) {
    System.out.println("生成密钥对败");
    return;
   }
  }
  // 第二步 , 此用户
  // 从文件中读入私钥 , 对一个字符串进行签名后保存在一个文件 (myinfo.dat) 中
  // 并且再把 myinfo.dat 发送出去,为了方便数字签名也放进了 myifno.dat 文件中 , 当然也可分别发送
  try {
   ObjectInputStream in = new ObjectInputStream(new FileInputStream("myprikey.dat"));
   PrivateKey myprikey = (PrivateKey) in.readObject();
   in.close();
   String myinfo = "这是我的信息"; // 要签名的信息
   // 用私钥对信息生成数字签名
   Signature signet = Signature.getInstance("DSA");
   signet.initSign(myprikey);
   signet.update(myinfo.getBytes());
   byte[] signed = signet.sign(); // 对信息的数字签名
   System.out.println("signed( 签名内容 )=" + byte2hex(signed));
   // 把信息和数字签名保存在一个文件中
   ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myinfo.dat"));
   out.writeObject(myinfo);
   out.writeObject(signed);
   out.close();
   System.out.println("签名并生成文件成功");
  } catch (java.lang.Exception e) {
   e.printStackTrace();
   System.out.println("签名并生成文件失败");
  }
  // 第三步 获得信息检查
  // 其他人通过公共方式得到此户的公钥和文件
  // 其他人用此户的公钥 , 对文件进行检查 , 如果成功说明是此用户发布的信息 .
  try {
   ObjectInputStream in = new ObjectInputStream(new FileInputStream("mypubkey.dat"));
   PublicKey pubkey = (PublicKey) in.readObject();
   in.close();
   System.out.println(pubkey.getFormat());
   in = new ObjectInputStream(new FileInputStream("myinfo.dat"));
   String info = (String) in.readObject();
   byte[] signed = (byte[]) in.readObject();
   in.close();
   Signature signetcheck = Signature.getInstance("DSA");
   signetcheck.initVerify(pubkey);
   signetcheck.update(info.getBytes());
   if (signetcheck.verify(signed)) {
    System.out.println("info=" + info);
    System.out.println("签名正常");
   } else
    System.out.println("非签名正常");
  } catch (java.lang.Exception e) {
   e.printStackTrace();
  }
  ;
 }
 // 生成一对文件 myprikey.dat 和 mypubkey.dat 私钥和公钥
 // 公钥要用户发送 ( 文件 , 网络等方法 ) 给其它用户 , 私钥保存在本地
 public boolean generatekey() {
  try {
   KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
   keygen.initialize(512);
   KeyPair keys = keygen.genKeyPair();
   PublicKey pubkey = keys.getPublic();
   PrivateKey prikey = keys.getPrivate();
   ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myprikey.dat"));
   out.writeObject(prikey);
   out.close();
   System.out.println("写入对象 prikeys ok");
   out = new ObjectOutputStream(new FileOutputStream("mypubkey.dat"));
   out.writeObject(pubkey);
   out.close();
   System.out.println("写入对象 pubkeys ok");
   System.out.println("生成密钥对成功");
   return true;
  } catch (java.lang.Exception e) {
   e.printStackTrace();
   System.out.println("生成密钥对失败");
   return false;
  }
 }
 public String byte2hex(byte[] b) {
  String hs = "";
  String stmp = "";
  for (int n = 0; n < b.length; n++) {
   stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
   if (stmp.length() == 1)
    hs = hs + "0" + stmp;
   else
    hs = hs + stmp;
   if (n < b.length - 1)
    hs = hs + ":";
  }
  return hs.toUpperCase();
 }
}


推荐您阅读更多有关于“ 加密 java 算法 数字签名 RSA ”的文章

上一篇:Apache Commons Jar包下载 下一篇:IIS 添加 Rewrite 组件

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 车也学了,年也过了,生日也过了,村里的会也赶了,这次,是真的,年过去了。不过我没回京,也没有在家找工作,我在等什么吗?反正现在正合了我这个懒人的要求,不过,我歇不住,思考下人生。

    2018-03-20 00:11

  • 8月1日,我已离开奋斗多年的北京。不知道是暂时的离开,还是永久的离别,反正已经离职在家,告别每日上班,每天苦累的煎熬,过一段属于自己的生活。以前是专职工作,现在专职生活。

    2017-08-18 12:47

  • 又弄完一个项目,累成狗,但是感觉又进步不少,除了很多坑已经踩过,做起来也是轻车熟路。同时也认识到,程序不在于你多牛逼,而是在乎你的细节把控度,而细节的关注,是一个优秀程序员必须要注意的。另外,要相信自己,勇敢向前,没人生下来就是成功的,而且,成功的路,比成功本身更重要。

    2017-06-30 09:46

  • 今日北京再次沙尘暴来袭,吃了几年细粮,终于能来口粗粮了,不过大早上看见这场景,还是吓我一跳,不过随后就平静了,毕竟是老朋友了。进公司又发现一股烤糊的味道,真是祸不单行啊,例外都是污染。发了两个口罩,开启保护模式。

    2017-05-04 10:16

  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 更多»

最新文章
热门文章
随机文章