JAVA上加密算法的实现用例(2)

2016-02-19 12:42 3 1 收藏

下面图老师小编跟大家分享一个简单易学的JAVA上加密算法的实现用例(2)教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

  添加要签名的信息
  
  public final byte[] sign()
  throws SignatureException
  返回签名的数组,前提是initSign和update
  
  public final void initVerify(PublicKey publicKey)
  throws InvalidKeyException
  用指定的公钥初始化
  参数:publicKey 验证时用的公钥
  
  public final boolean verify(byte[] signature)
  throws SignatureException
  验证签名是否有效,前提是已经initVerify初始化
  参数: signature 签名数组
   */
  import Java.security.*;
  import java.security.spec.*;
  public class testdsa {
   public static void main(String[] args) throws java.security.NoSUChAlgorithmException,java.lang.Exception {
         testdsa my=new testdsa();
         my.run();
   }
   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 {
   java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
   PrivateKey myprikey=(PrivateKey)in.readObject();
   in.close();
  
  // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);
  
  //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec
   String myinfo="这是我的信息";    //要签名的信息
   //用私钥对信息生成数字签名
   java.security.Signature signet=java.security.Signature.getInstance("DSA");
   signet.initSign(myprikey);
   signet.update(myinfo.getBytes());
   byte[] signed=signet.sign();  //对信息的数字签名
   System.out.println("signed(签名内容)="+byte2hex(signed));
  //把信息和数字签名保存在一个文件中
   java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.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 {
  
    java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
    PublicKey pubkey=(PublicKey)in.readObject();
    in.close();
    System.out.println(pubkey.getFormat());
  
    in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));
    String info=(String)in.readObject();
    byte[] signed=(byte[])in.readObject();
    in.close();
  
   java.security.Signature signetcheck=java.security.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 {
   java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
  // SecureRandom secrand=new SecureRandom();
  // secrand.setSeed("tttt".getBytes()); //初始化随机产生器
  // keygen.initialize(576,secrand);     //初始化密钥生成器
   keygen.initialize(512);
   KeyPair keys=keygen.genKeyPair();
  //  KeyPair keys=keygen.generateKeyPair(); //生成密钥组
   PublicKey pubkey=keys.getPublic();
   PrivateKey prikey=keys.getPrivate();
  
   java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
   out.writeObject(prikey);
   out.close();
   System.out.println("写入对象 prikeys ok");
   out=new java.io.ObjectOutputStream(new java.io.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("生成密钥对失败");

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1601603.html

延伸阅读
标签: ASP
  简介 首先简单介绍一下有关加密的背景。由于美国禁止几种密码算法的对外出口的 加密位数(例如SSL的40位加密限制),本文将介绍一种ASP可以使用的简单字符加密算法, 而不是那些受限制的加密算法。其实,这里介绍的加密算法对于一般的运用来说已经足够 解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法,我...
标签: ASP
  在第一部分,讨论了如何生成密钥,下面将介绍如何使用这个密钥来加密和解密一个 字符串。 下面的代码就是能够同时实现这个功能的函数 Crypt.asp文件 <% Dim g_Key Const g_CryptThis = "Now is the time for all good men to come to the aid of their country." Const g_KeyLocati...
1. MD5加密,常用于加密用户名密码,当用户验证时。 protected byte[] encrypt(byte[] obj) ...{     try ...{         MessageDigest md5 = MessageDigest.getInstance("MD5");             md5.update(obj); ...
标签: ASP
  <% Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) Private Function LShift(lValue, iShiftBits)     If iShiftBits = 0 Then         LShift = lValue &nbs...
代码如下: import java.util.ArrayList;  import java.util.Collections;  import java.util.List;  /**   * Created with IntelliJ IDEA.   * User: dell   * Date: 13-3-5   * Time: 下午8:38   * To change this template use File | Settings | File Templates.   */  public class G...

经验教程

165

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部