大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> Java加密和数字签名编程

Java加密和数字签名编程

时间: 2021-07-31 作者:daque

  正文重要谈一下暗号学中的加密和数字出面,以及其在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(" "+messagedigest.getprovider().getinfo());   //发端运用算法   messagedigest.update(plaintext);   system.out.println(" digest:");   //输入算法演算截止   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 ");    system.exit(1);   }   byte[] plaintext=args[0].getbytes("utf8");   //经过keygenerator产生一个key   system.out.println(" start 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(" "+cipher.getprovider().getinfo());   //运用私鈅加密   system.out.println(" start 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(" start 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 ");    system.exit(1);   }   byte[] plaintext=args[0].getbytes("utf8");   //形成一个rsa密钥   system.out.println(" start 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(" "+cipher.getprovider().getinfo());   system.out.println(" start 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(" start 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"));   }   }   4)数字出面:   数字出面,它是决定调换动静的通讯方身份的第一个级别。上头a经过运用公钥加密数据后发给b,b运用私钥解密就获得了须要的数据,题目来了,因为都是运用公钥加密,那么怎样检查是a发过来的动静呢?上头也提到了一点,私钥是独一的,那么a就不妨运用a本人的私钥举行加密,而后b再运用a的公钥来解密,就不妨了;数字出面的道理就鉴于此,而常常为了表明发送数据的如实性,经过运用动静纲要赢得简略的动静实质,而后再运用私钥举行加密散列数据和动静一道发送。java中为数字出面供给了杰出的扶助,java.security.signature类供给了动静出面:   /**   *digitalsignature2example.java   *copyright 2005-2-16   */   import java.security.signature;   import java.security.keypairgenerator;   import java.security.keypair;   import java.security.signatureexception;   /**   *数字出面,运用rsa私钥对对动静纲要出面,而后运用公鈅考证 尝试   */   public class digitalsignature2example{   public static void main(string[] args) throws exception{   if(args.length!=1){    system.err.println("usage:java digitalsignature2example ");    system.exit(1);   }   byte[] plaintext=args[0].getbytes("utf8");   //产生rsa公钥对   system.out.println(" start generating rsa key");   keypairgenerator keygen=keypairgenerator.getinstance("rsa");   keygen.initialize(1024);   keypair key=keygen.generatekeypair();   system.out.println("finish generating rsa key");   //运用私鈅出面   signature sig=signature.getinstance("sha1withrsa");   sig.initsign(key.getprivate());   sig.update(plaintext);   byte[] signature=sig.sign();   system.out.println(sig.getprovider().getinfo());   system.out.println(" signature:");   system.out.println(new string(signature,"utf8"));   //运用公鈅考证   system.out.println(" start signature verification");   sig.initverify(key.getpublic());   sig.update(plaintext);   try{    if(sig.verify(signature)){     system.out.println("signature verified");    }else system.out.println("signature failed");    }catch(signatureexception e){     system.out.println("signature failed");    }   }   }   5)数字文凭。   再有个题目,即是公钥题目,a用私钥加密了,那么b接遭到动静后,用a供给的公钥解密;那么此刻有个腻烦的c,他把动静阻挡了,而后用本人的私钥加密,同声把本人的公钥发给b,并报告b,那是a的公钥,截止....,这功夫就须要一个中央组织出来谈话了(断定权势,我是精确的),就展示了certificate authority(也即ca),驰名的ca组织有verisign等,暂时数字认证的产业规范是:ccitt的x.509:   数字文凭:它将一个身份标识偕同公钥一道举行封装,并由称为认证重心或 ca 的第三方举行数字出面。   密钥库:java平台为你供给了密钥库,用作密钥和文凭的资源库。从物理上讲,密钥库是缺省称呼为 .keystore 的文献(有一个选项使它变成加密文献)。密钥和文凭不妨具有称呼(称为别号),每个别号都由独一的暗号养护。密钥库自己也受暗号养护;您不妨采用让每个别号暗号与主密钥库暗号配合。   运用东西keytool,咱们来做一件自我认证的工作吧(断定我的认证):   1、创造密钥库keytool -genkey -v -alias feiuserkey -keyalg rsa 默许在本人的home目次下(windows体例是c:documents and settings<你的用户名> 目次下的.keystore文献),创造咱们用 rsa 算法天生别号为 feiuserkey 的自出面的文凭,即使运用了-keystore mm 就在暂时目次下创造一个密钥库mm文献来生存密钥和文凭。   2、察看文凭:keytool -list 陈列了密钥库的一切的文凭   也不妨在dos下输出keytool -help察看扶助。

   4)数字出面:   数字出面,它是决定调换动静的通讯方身份的第一个级别。上头a经过运用公钥加密数据后发给b,b运用私钥解密就获得了须要的数据,题目来了,因为都是运用公钥加密,那么怎样检查是a发过来的动静呢?上头也提到了一点,私钥是独一的,那么a就不妨运用a本人的私钥举行加密,而后b再运用a的公钥来解密,就不妨了;数字出面的道理就鉴于此,而常常为了表明发送数据的如实性,经过运用动静纲要赢得简略的动静实质,而后再运用私钥举行加密散列数据和动静一道发送。java中为数字出面供给了杰出的扶助,java.security.signature类供给了动静出面:   /**   *digitalsignature2example.java   *copyright 2005-2-16   */   import java.security.signature;   import java.security.keypairgenerator;   import java.security.keypair;   import java.security.signatureexception;   /**   *数字出面,运用rsa私钥对对动静纲要出面,而后运用公鈅考证 尝试   */   public class digitalsignature2example{   public static void main(string[] args) throws exception{   if(args.length!=1){    system.err.println("usage:java digitalsignature2example ");    system.exit(1);   }   byte[] plaintext=args[0].getbytes("utf8");   //产生rsa公钥对   system.out.println(" start generating rsa key");   keypairgenerator keygen=keypairgenerator.getinstance("rsa");   keygen.initialize(1024);   keypair key=keygen.generatekeypair();   system.out.println("finish generating rsa key");   //运用私鈅出面   signature sig=signature.getinstance("sha1withrsa");   sig.initsign(key.getprivate());   sig.update(plaintext);   byte[] signature=sig.sign();   system.out.println(sig.getprovider().getinfo());   system.out.println(" signature:");   system.out.println(new string(signature,"utf8"));   //运用公鈅考证   system.out.println(" start signature verification");   sig.initverify(key.getpublic());   sig.update(plaintext);   try{    if(sig.verify(signature)){     system.out.println("signature verified");    }else system.out.println("signature failed");    }catch(signatureexception e){     system.out.println("signature failed");    }   }   }   5)数字文凭。   再有个题目,即是公钥题目,a用私钥加密了,那么b接遭到动静后,用a供给的公钥解密;那么此刻有个腻烦的c,他把动静阻挡了,而后用本人的私钥加密,同声把本人的公钥发给b,并报告b,那是a的公钥,截止....,这功夫就须要一个中央组织出来谈话了(断定权势,我是精确的),就展示了certificate authority(也即ca),驰名的ca组织有verisign等,暂时数字认证的产业规范是:ccitt的x.509:   数字文凭:它将一个身份标识偕同公钥一道举行封装,并由称为认证重心或 ca 的第三方举行数字出面。   密钥库:java平台为你供给了密钥库,用作密钥和文凭的资源库。从物理上讲,密钥库是缺省称呼为 .keystore 的文献(有一个选项使它变成加密文献)。密钥和文凭不妨具有称呼(称为别号),每个别号都由独一的暗号养护。密钥库自己也受暗号养护;您不妨采用让每个别号暗号与主密钥库暗号配合。   运用东西keytool,咱们来做一件自我认证的工作吧(断定我的认证):   1、创造密钥库keytool -genkey -v -alias feiuserkey -keyalg rsa 默许在本人的home目次下(windows体例是c:documents and settings<你的用户名> 目次下的.keystore文献),创造咱们用 rsa 算法天生别号为 feiuserkey 的自出面的文凭,即使运用了-keystore mm 就在暂时目次下创造一个密钥库mm文献来生存密钥和文凭。   2、察看文凭:keytool -list 陈列了密钥库的一切的文凭   也不妨在dos下输出keytool -help察看扶助。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.