Java中的加密和DSA数字签名

原创 2004年08月03日 15:24:00

 

 Bromon

 一、单向加密(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[i];
    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);
  }
  
 }

 }

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

 Java有非常庞大的加密框架,各种加密和签名种类极多,OReilly - Java Cryptography中有详细介绍。不过一些包在中国无法得到。

Java加密技术(六)——数字签名算法DSA

接下来我们介绍DSA数字签名,非对称加密的另一种实现。  DSA  DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作...
  • daguairen
  • daguairen
  • 2016年08月31日 10:03
  • 1422

数字签名算法DSA

一、概述 1、DSA是以RSA为基础形成的 2、java6提供了DSA的实现,但是java6只提供了SHA1withDSA的实现 3、bouncycastle扩展提供了其他的DSA实...
  • bravegogo
  • bravegogo
  • 2016年12月28日 20:41
  • 1542

DSA数字签名原理及JAVA实现

DSA数字签名          DSA数字签名是Elgamal和Schnorr数字签名的一个变种,DSA数字签名优于Elgamal数字签名的地方在于它的签名长度较短,并且某些可以破解Elgamal方...
  • qq_35612816
  • qq_35612816
  • 2017年12月01日 17:38
  • 89

Crypto++(二)数字签名算法DSA

本文翻译自 https://www.cryptopp.com/wiki/Digital_Signature_Algorithm,本人英文水平有限,如有翻译不当之处请给出修改建议!DSA是数字签名算法,...
  • u013709270
  • u013709270
  • 2016年12月20日 12:50
  • 1210

Java加密算法 DSA 和 数字签名

package com.stone.security; import java.security.Key; import java.security.KeyFactory; import java....
  • jjwwmlp456
  • jjwwmlp456
  • 2014年03月11日 15:04
  • 4885

数字签名算法---加密学习笔记(五)

介绍签名:就有安全性,抗否认性 数字签名:带有密钥(公钥,私钥)的消息摘要算法 作用: 1. 验证数据的完整性 2. 认证数据来源 3. 抗否认数字签名遵循:私钥签名,公钥验证 常用...
  • u013991521
  • u013991521
  • 2015年09月05日 16:39
  • 5895

openssl DSA 数字签名与签名验证

与RSA不同,DSA的主要功能是做数字签名与签名验证。DSA不具备对数据进行加密解密的功能,因此在使用上面请注意。往往有很多使用者误认为非对称加密算法都可以对数据进行加解密处理,其实不然,DSA就是一...
  • tianjian_blog
  • tianjian_blog
  • 2015年02月12日 11:45
  • 1049

加密算法、DES、IDEA、RSA、DSA

加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密)。加密技术的要点是加密算法,加密算法可以分为对称加密、不对称加密和不可逆加密三类...
  • Real_Myth
  • Real_Myth
  • 2016年08月17日 13:21
  • 1766

Java加密技术(六)——数字签名算法DSA

接下来我们介绍DSA数字签名,非对称加密的另一种实现。  DSA  DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作...
  • u010395804
  • u010395804
  • 2015年02月07日 11:42
  • 352

Java加密技术(六)——数字签名算法DSA

接下来我们介绍DSA数字签名,非对称加密的另一种实现。  DSA  DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作...
  • zkn_CS_DN_2013
  • zkn_CS_DN_2013
  • 2013年11月07日 10:40
  • 2912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的加密和DSA数字签名
举报原因:
原因补充:

(最多只允许输入30个字)