资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 编程开发 >
Advertisement
文章正文

Windows下Java如何使用数字证书 _编程

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   
  • Hibernate实践(一)  
  • MIDP v2.0规范简介  
  • 端到端J2ME应用开发实例——介绍Smart Ticket  
  • PicoContainer-Two minute tutorial  
  • "Shale? JSF? Struts is dead?"  
  • Developer.com公布2005年度产品竞赛优胜者名单  
  • 关于在UNIX或LINUX下使用文件数据库  
  • 使用java.util.Timer  
  • log4j的辅助代码,支持合并多个log4j配置文件。  
  • BREW和J2ME的来源  
  • 页面导航:

    正文内容:

    为了用java来使用数字证书,在网上google了一番,最后找到一个程序包jp0207bb.zip,下载的连接已经忘了。
    里面有mscrypto.jar,mscryptofunctions.dll文件以及原代码,我跟着readme文件运行它自带的测试程序,结果总是出错,说我的证书的cdp域有错,我用的是cnca.net的试用型证书,可能有什么地方不兼容吧。实在没办法自己写了个测试的程序,不去验证证书的cdp域,照用就是,结果很正常。测试程序主要部分如下:

    列出所有证书:
     mscryptofunctions msf = new mscryptofunctions();
     string[] aliases = msf.msgetaliases("my");
     for(int i=0;i<aliases.length;i++)
     {
     //string alias = "{6014510d-21ef-4f49-8d93-0f19b821c0a0}";
     string alias =aliases[i];
     // get the cert for this alias
     byte[] certblob = msf.msgetcert("my", alias);
     certificatefactory cf = certificatefactory.getinstance("x.509");
     bytearrayinputstream input = new bytearrayinputstream(certblob);
     x509certificate cert = (x509certificate) cf.generatecertificate(input);
     input.close(); 
     system.out.println(cert.getsubjectdn().getname());
     }
    certificatefactory和x509certificate所在的包是java.security.cert

    加密测试:
      首先安装provider,代码如下:
     import com.boyter.mscrypto.mskeymgrprovider;
     import com.boyter.mscrypto.mstrustmgrprovider;
     import com.boyter.mscrypto.msrsasignprovider;
     import com.boyter.mscrypto.msrsacipherprovider;

     mstrustmgrprovider.install();
     mskeymgrprovider.install();
     msrsacipherprovider.install();
     msrsasignprovider.install();
      取得加密用的证书,代码同列出证书的代码一样,到最后得到一个x509certificate对象cert
      初始化为encrypt_mode:
      cipher rc = cipher.getinstance("rsa/ecb/pkcs1padding","msrsacipher");
      rc.init( cipher.encrypt_mode, cert.getpublickey());
      把要加密的文件(c:盘a.txt)读入到inputdata数组:
     byte[] inputdata=new byte[(new long((new file("c:\\a.txt")).length())).intvalue()];
     fileinputstream fis=new java.io.fileinputstream("c:\\a.txt");
     fis.read(inputdata);
      对inputdata加密,加密结果写入outputdata:
     byte[] outputdata=null;
     outputdata = rc.dofinal(inputdata);
      把加密后的字节流写入另一个文件(c:盘a_enc.txt):
     fileoutputstream fos=new fileoutputstream("c:\\a_enc.txt");
     fos.write(outputdata);
     fos.close();
    运行后可以打开c:\a_enc.txt,看到内容变成了乱码,这些就是加密的结果。

    解密测试:
      首先安装provider,然后取得证书,过程同加密测试。
      初始化为decrypt_mode:
     cipher rc = cipher.getinstance("rsa/ecb/pkcs1padding","msrsacipher");
     rc.init( cipher.decrypt_mode, cert.getpublickey());
      然后的做法根加密一样,把加密过的文件读入到inputdata,然后运行rs.dofinal(inputdata)得到解密后的字节流,再保存为另一个文件c:\\a_dec.txt;
    运行后打开c:\a_dec.txt,内容应该和a.txt一样。


    签名测试:
     import java.security.signature;
     import javax.net.ssl.keymanagerfactory;
     import javax.net.ssl.x509keymanager;
     import java.security.privatekey;
      安装provider,过程同加密测试。
      获得私钥,注意获得私钥的方法和获得公钥方法不同,x509certificate只有getpublickey()方法,而没有getprivatekey()方法,
      要得到私钥必须通过x509keymanager.getprivatekey(alias)得到:
     string[] aliases = msf.msgetaliases("my");
     string alias =aliases[0]; 
     //init
     keymanagerfactory kmf = keymanagerfactory.getinstance("mskmf");
     kmf.init(null, null);
     x509keymanager xkm = (x509keymanager)kmf.getkeymanagers()[0];
     privatekey privkey = xkm.getprivatekey(alias);
      初始化:
     signature rsa = signature.getinstance("md5withrsa");
     rsa.initsign(privkey);
      把要签名的文件读到inputdata,然后按如下过程签名:
     rsa.update(inputdata);
     outputdata = rsa.sign();
      把outputdata保存为文件c:\a_sign.txt,这个文件的内容就是签名。

    验证签名测试:
      首先安装provider,然后取得证书x509certificate对象cert,过程同加密测试。
      初始化:
     signature rsa = signature.getinstance("md5withrsa");
     rsa.initverify(cert.getpublickey());
      把要验证签名的文件读到byte[]对象inputdata,把签名读到另一个byte[]对象sign,然后按如下过程验证签名:
     rsa.update(inputdata);
     rsa.verify(sign);
      rsa.verify(sign)返回一个boolean对象,true表示验证通过,false表示验证不通过。
      随便修改一下原文或者签名,再运行这段程序应该会返回false。

    完整的源代码如下:
    import com.boyter.mscrypto.mscryptofunctions;
    import java.io.bytearrayinputstream;
    import java.security.cert.x509certificate;
    import java.security.cert.certificatefactory;
    import java.io.fileinputstream;
    import java.io.fileoutputstream;
    import java.io.file;
    import javax.crypto.cipher;
    import java.security.signature;
    import javax.net.ssl.keymanagerfactory;
    import javax.net.ssl.x509keymanager;
    import java.security.privatekey;
    import com.boyter.mscrypto.mskeymgrprovider;
    import com.boyter.mscrypto.mstrustmgrprovider;
    import com.boyter.mscrypto.msrsasignprovider;
    import com.boyter.mscrypto.msrsacipherprovider;
    import com.boyter.mscrypto.msvalidcertificate;

    public class xxytest
    {
     static mscryptofunctions msf = new mscryptofunctions();
     public static void main(string[] args){
     if(args[0].equals("list")){
     try{
     string[] aliases = msf.msgetaliases("my");
     system.out.println("下面是windows证书库中所有证书:");
     for(int i=0;i<aliases.length;i++)
     {
     //string alias = "{6014510d-21ef-4f49-8d93-0f19b821c0a0}";
     string alias =aliases[i];
     // get the cert for this alias
     byte[] certblob = msf.msgetcert("my", alias);
     certificatefactory cf = certificatefactory.getinstance("x.509");
     bytearrayinputstream input = new bytearrayinputstream(certblob);
     x509certificate cert = (x509certificate) cf.generatecertificate(input);
     input.close(); 
     system.out.println(cert.getsubjectdn().getname());
     }
     }catch(exception e){
     e.printstacktrace();
     }
     }

     if(args[0].equals("encrypt")){
     try{
     system.out.println("加密测试,对c:\\a.txt加密,加密后生成c:\\a_enc.txt");
     mstrustmgrprovider.install();
     mskeymgrprovider.install();
     msrsacipherprovider.install();
     msrsasignprovider.install();
     //get public key
     string[] aliases = msf.msgetaliases("my");
     string alias =aliases[0];
     byte[] certblob = msf.msgetcert("my", alias);
     certificatefactory cf = certificatefactory.getinstance("x.509");
     bytearrayinputstream input = new bytearrayinputstream(certblob);
     x509certificate cert = (x509certificate) cf.generatecertificate(input);
     input.close(); 
     //init
     cipher rc = cipher.getinstance("rsa/ecb/pkcs1padding","msrsacipher");
     system.out.println("using provider: " + rc.getprovider().getname());

     rc.init( cipher.encrypt_mode, cert.getpublickey());

     string paddingalgorithm = "pkcs1";
     byte[] outputdata=null;
     byte[] inputdata=new byte[(new long((new file("c:\\a.txt")).length())).intvalue()];
     fileinputstream fis=new java.io.fileinputstream("c:\\a.txt");
     fis.read(inputdata);
     fis.close();
     outputdata = rc.dofinal(inputdata);
     fileoutputstream fos=new fileoutputstream("c:\\a_enc.txt");
     fos.write(outputdata);
     fos.close();
     }catch(exception e){
     e.printstacktrace();
     }
     }

     if(args[0].equals("decrypt")){
     try{
     system.out.println("解密测试,对c:\\a_enc.txt解密,解密后生成c:\\a_dec.txt");
     mstrustmgrprovider.install();
     mskeymgrprovider.install();
     msrsacipherprovider.install();
     msrsasignprovider.install();
     //get public key
     string[] aliases = msf.msgetaliases("my");
     string alias =aliases[0];
     byte[] certblob = msf.msgetcert("my", alias);
     certificatefactory cf = certificatefactory.getinstance("x.509");
     bytearrayinputstream input = new bytearrayinputstream(certblob);
     x509certificate cert = (x509certificate) cf.generatecertificate(input);
     input.close(); 
     //init
     cipher rc = cipher.getinstance("rsa/ecb/pkcs1padding","msrsacipher");
     system.out.println("using provider: " + rc.getprovider().getname());

     rc.init( cipher.decrypt_mode, cert.getpublickey());

     string paddingalgorithm = "pkcs1";
     byte[] outputdata=null;
     byte[] inputdata=new byte[(new long((new file("c:\\a_enc.txt")).length())).intvalue()];
     fileinputstream fis=new java.io.fileinputstream("c:\\a_enc.txt");
     fis.read(inputdata);
     fis.close();
     outputdata = rc.dofinal(inputdata);
     fileoutputstream fos=new fileoutputstream("c:\\a_dec.txt");
     fos.write(outputdata);
     fos.close();
     }catch(exception e){
     e.printstacktrace();
     }
     }

     if(args[0].equals("sign")){
     try{
     system.out.println("签名测试,对c:\\a.txt签名,签名后生成c:\\a_sign.txt");
     mstrustmgrprovider.install();
     mskeymgrprovider.install();
     msrsacipherprovider.install();
     msrsasignprovider.install();
     //get public key
     string[] aliases = msf.msgetaliases("my");
     string alias =aliases[0]; 
     //init
     keymanagerfactory kmf = keymanagerfactory.getinstance("mskmf");
     kmf.init(null, null);
     x509keymanager xkm = (x509keymanager)kmf.getkeymanagers()[0];
     privatekey privkey = xkm.getprivatekey(alias);
     signature rsa = signature.getinstance("md5withrsa");
     rsa.initsign(privkey);
     
     byte[] outputdata=null;
     byte[] inputdata=new byte[(new long((new file("c:\\a.txt")).length())).intvalue()];
     fileinputstream fis=new java.io.fileinputstream("c:\\a.txt");
     fis.read(inputdata);
     fis.close();
     rsa.update(inputdata);
     outputdata = rsa.sign();
     fileoutputstream fos=new fileoutputstream("c:\\a_sign.txt");
     fos.write(outputdata);
     fos.close();
     }catch(exception e){
     e.printstacktrace();
     }
     }

     if(args[0].equals("verify")){
     try{
     system.out.println("验证签名测试,对c:\\a.txt验证签名,验证签名后生成c:\\a_verify.txt");
     mstrustmgrprovider.install();
     mskeymgrprovider.install();
     msrsacipherprovider.install();
     msrsasignprovider.install();
     //get public key
     string[] aliases = msf.msgetaliases("my");
     string alias =aliases[0];
     byte[] certblob = msf.msgetcert("my", alias);
     certificatefactory cf = certificatefactory.getinstance("x.509");
     bytearrayinputstream input = new bytearrayinputstream(certblob);
     x509certificate cert = (x509certificate) cf.generatecertificate(input);
     input.close();


     signature rsa = signature.getinstance("md5withrsa");
     rsa.initverify(cert.getpublickey());
     
     
     byte[] inputdata=new byte[(new long((new file("c:\\a.txt")).length())).intvalue()];
     fileinputstream fis=new java.io.fileinputstream("c:\\a.txt");
     fis.read(inputdata);
     fis.close();
     rsa.update(inputdata);
     
     byte[] sign=new byte[(new long((new file("c:\\a_sign.txt")).length())).intvalue()];
     fileinputstream fis2=new java.io.fileinputstream("c:\\a_sign.txt");
     fis2.read(sign);

     if(rsa.verify(sign)){
     system.out.println("验证通过");
     }else{
     system.out.println("验证不通过");
     }
     fis2.close();
     }catch(exception e){
     e.printstacktrace();
     }
     }
     }
    };



     

     
    热门推荐笔记本: 戴尔笔记本
    相关文章:
    webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
    ©2007 popbb.net All Rights Reserved