Java加密解密与数字证书的操作

1 keytool命令总结

一、创建数字证书

交互模式

使用默认的密钥库.keystore(目录是c: Documents and Setting用户名)和算法(DSA)

keytool -genkey

默认的别名mykey

密钥库中可以存放多个条目(公钥/私钥对和证书),它们在密钥库中以别名(alias)区分。

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -alias mytest -keyalg RSA -keysize 1024 -keystore mykeystore -validity 4000  

其中,   

-keyalg参数可以指定密钥的算法,如果需要指定密钥的长度,可以再加上-keysize参数。密钥长度默认为1024位,使用DSA算法时,密钥长度必须在5121024之间,并且是64的整数倍。

-keystore参数可以指定密钥库的名称。密钥库其实是存放密钥和证书的文件,密钥库对应的文件如果不存在自动创建。

-validity参数可以指定所创建的证书有效期是多少天。

非交互模式:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -dname "CN=tmp, OU=NC, O=Shanghai University, L=ZB, ST=Shanghai, C=CN" -alias tmp -keyalg RSA -keystore mykeystore -keypass wshr.ut -storepass wshr.ut  -validity 1000  

二、数字证书的显示(从密钥库中)

默认密钥库全部证书信息

keytool -list -v(显示详细信息)

显示指定密钥库指定条目证书信息(包含了发照者(签发者)、序号、有效期、MD5SHA1认证指纹等额外信息)

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -list -v -keystore lfkeystore -alias lf  

三、使用Keytool将数字证书导出到文件

将指定的证书从密钥库导出为没编码过的文件。

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -export -alias lf -file lf.cer  -keystore lfkeystore   

四、使用Keytool从文件中显示证书

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -printcert -file  lf.cer  

五、在Windows中从文件显示证书

只要文件名以.cer为后缀,Windows操作系统就可以直接识别。如在Windows中双击lf.cer图标,将出现证书窗口。其中包含了证书的所有者、颁发者、有效期等信息。

点击详细资料,可以看到证书的版本、序号、签名算法、颁发者、有效期、主题(即全名)、公钥算法、拇印算法、拇印等信息。其中的拇印即认证指纹。

六、密钥库的维护

使用Keytool删除指定条目

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -delete -alias tmp1 -keystore mykeystore  

使用Keytool修改指定条目的口令

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -keypasswd -alias tmp1 -keystore mykeystore  

(非交互模式:keytool -keypasswd -alias tmp1 -keystore mykeystore -storepass wshr.ut -keypass 123456 -new 080302,其中080302为原密码,123456为新密码 )

证书生成应用实例:

执行命令前先保证文件夹存在。例如:在c盘建立keystore文件夹
第一步:为服务器生成证书 

确定域名:本机中域名解析修改文件是C:WINDOWSsystem32driversetchosts
使用keytool 为 Tomcat 生成证书和密钥库,假定目标机器的域名是“ hepengfei ”, keystore 文件存放在“ C:keystoreserver ”,口令为“ 080302 ”,命令如下: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -v -keystore C:keystoreserver -alias serverkey -keyalg RSA -validity 3650 -dname "CN=hepengfei,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass 080302 -keypass 080302   

生成server.cer安装在客户端解决服务器信任问题:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -export -keystore C:keystoreserver -alias serverkey -file c:keystoreserver.cer -storepass 080302   

第二步:为客户端生成证书 

(注意:个人证书的生成和使用比较特别,是分开的。先生成p12文件,然后导出cer文件,再将cer文件导入默认类型的keystore(JKS)文件)
这一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE 和 Firefox ,证书格式应该是 PKCS12 ,因此,使用如下命令生成: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -v -keystore C:keystoreuser.p12 -alias MyPC -keyalg RSA -storetype PKCS12 -validity 3650 -dname "CN=MyPC,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass 080302 -keypass 080302   
服务器要信任客户端证书,就必须把客户端证书添加为服务器的信任认证。由于不能直接将 PKCS12 格式的证书库导入,我们必须先把客户端证书导出为一个单独的 CER 文件,使用如下命令: 
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -export -alias MyPC -keystore C:keystoreuser.p12 -storetype PKCS12 -storepass 080302 -rfc -file C:keystoreuser.cer   
接着,将C:user.cer导入到服务器的证书库,添加为一个信任证书: 
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -import -v -file C:keystoreuser.cer -keystore c:keystoreservertrust -alias user -storepass 080302  

输入“是”确认完成。

通过list 命令查看: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -list -keystore c:keystoreservertrust -storepass 080302   

也可以考虑将服务器证书和服务器信任证书放到一个密钥库中

第四步:配置Tomcat 服务器 

打开Tomcat 根目录下的 /conf/server.xml ,修改如下: 

<="">

clientAuth="true" sslProtocol="TLS"

keystoreFile="C:JavaTomcatconfkeystoreserver" keystorePass="080302"

truststoreFile="C:JavaTomcatconfkeystoreservertrust" truststorePass="080302" 

/>

详细解释见本节最前面介绍。

安装个人证书user.p12(密码:080302)和服务器证书server.cer
到这里启动tomcat,输入 https://hepengfei:8443/Test,就OK了。 

如果数字证书注册名称不是127.0.0.1,而是对应的一个hepengfei,

使用ip访问(https://127.0.0.1:8443/Test)可以进入选择数字证书界面(仿真格式): 

选择数字证书

    名称     颁发商

    MyPC     MyPC

    详细信息  查看证书

        确定   取消

注意点:

keytool -list -v -keystore user

使用的库要privateKeyEntry

信任的库要trustedCertEntry

ConvertKeystoreType.java用于转换密钥库类型(PKCS12与JKS格式证书库转换工具)

ssl使用其中四个密钥库

https使用server、servertrust、user.p12(安装到本地计算机)、server.cer四个

 

生成证书请求:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore   

PKCS12

使用Keytool列出pkcs12证书的内容

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -rfc -list -keystore tomcat_client.p12 -storetype pkcs12  

使用Keytool导出pkcs12证书的公钥证书

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool  -keystore tomcat_client.p12 -storetype pkcs12 -export -alias mypc -file mypc.cer  

将已经签名的证书导入密钥库(覆盖原来的公钥)

先导入证书链中的相关信任证书,再导入已经签名的证书(别名与私钥证书别名保持一样)。

2 Java程序实现密钥库的维护

2.1 Java程序列出密钥库所有条目

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.util.*;  
  2. import java.io.*;  
  3. import java.security.*;  
  4. public class ShowAlias{  
  5.     public static void main(String args[ ]) throws Exception{  
  6.         String pass="080302";  
  7.         String name=".keystore";  
  8.         FileInputStream in=new FileInputStream(name);  
  9.         KeyStore ks=KeyStore.getInstance("JKS");             
  10.         ks.load(in,pass.toCharArray());  
  11.         Enumeratione=ks.aliases( );  
  12.         while( e.hasMoreElements()) {  
  13.             System.out.println(e.nextElement());  
  14.         }  
  15.     }  
  16. }    

2.2 Java程序修改密钥库口令

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2. import java.security.*;  
  3. public class SetStorePass{  
  4.     public static void main(String args[ ]) throws Exception{  
  5.         char[ ] oldpass="080302".toCharArray();  
  6.         char[ ] newpass="123456".toCharArray();  
  7.         String name=".keystore";  
  8.         FileInputStream in=new FileInputStream(name);  
  9.         KeyStore ks=KeyStore.getInstance("JKS");  
  10.         ks.load(in,oldpass);  
  11.         in.close();  
  12.         FileOutputStream output=new FileOutputStream(name);  
  13.         ks.store(output,newpass);  
  14.         output.close();   
  15.     }  
  16. }    

2.3 Java程序修改密钥库条目的口令及添加条目

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package test;  
  2.   
  3. import java.io.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. import java.security.cert.Certificate;  
  8.   
  9. public class SetKeyPass{  
  10.   
  11.    public static void main(String args[ ]) throws Exception{  
  12.   
  13.         //读取相关参数  
  14.   
  15.         String name=".keystore";  
  16.   
  17.         String alias="mykey";  
  18.   
  19.         char[ ] storepass="123456".toCharArray();  
  20.   
  21.         char[ ] oldkeypass="080302".toCharArray();  
  22.   
  23.         char[ ] newkeypass="123456".toCharArray();  
  24.   
  25.         //获取密钥库.keystore的KeyStore对象,并加载密钥库  
  26.   
  27.         FileInputStream in=new FileInputStream(name);  
  28.   
  29.         KeyStore ks=KeyStore.getInstance("JKS");  
  30.   
  31.         ks.load(in,storepass);  
  32.   
  33.         //获取别名对应的条目的证书链  
  34.   
  35.         Certificate[ ] cchain=ks.getCertificateChain(alias);  
  36.   
  37.         //读取别名对应的条目的私钥  
  38.   
  39.         PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass);  
  40.   
  41.         //向密钥库中添加新的条目  
  42.   
  43.         ks.setKeyEntry(alias,pk,newkeypass,cchain);  
  44.   
  45.         in.close();  
  46.   
  47.         //将KeyStore对象内容写入新文件  
  48.   
  49.         FileOutputStream output=new FileOutputStream("333");  
  50.   
  51.         ks.store(output,storepass);  
  52.   
  53.         output.close();   
  54.   
  55.     }  
  56.   
  57. }  

2.4 Java程序检验别名及删除条目

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package test;  
  2.   
  3. import java.io.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. public class DeleteAlias{  
  8.   
  9.     public static void main(String args[ ]) throws Exception{  
  10.   
  11.         String pass = "123456";  
  12.   
  13.         String name = ".keystore";  
  14.   
  15.         String alias = "mykey";  
  16.   
  17.         FileInputStream in=new FileInputStream(name);  
  18.   
  19.         KeyStore ks=KeyStore.getInstance("JKS");             
  20.   
  21.         ks.load(in,pass.toCharArray());  
  22.   
  23.         if (ks.containsAlias(alias)){  
  24.   
  25.             ks.deleteEntry(alias);  
  26.   
  27.             FileOutputStream output=new FileOutputStream(name);  
  28.   
  29.             ks.store(output,pass.toCharArray());  
  30.   
  31.             System.out.println("Alias "+alias+" deleted");  
  32.   
  33.         }else{  
  34.   
  35.             System.out.println("Alias not exist");  
  36.   
  37.         }  
  38.   
  39.     }  
  40.   
  41. }    

3 Java程序读取证书和显示证书指定信息

3.1 Java程序从证书文件读取证书

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.security.cert.*;  
  4.   
  5. public class PrintCert{  
  6.   
  7. public static void main(String args[ ]) throws Exception{  
  8.   
  9.         CertificateFactory cf=CertificateFactory.getInstance("X.509");  
  10.   
  11.         FileInputStream in=new FileInputStream("my.cer");  
  12.   
  13.         Certificate c=cf.generateCertificate(in);  
  14.   
  15.         in.close();  
  16.   
  17.         String s=c.toString( );  
  18.   
  19.         // 显示证书  
  20.   
  21.         FileOutputStream fout=new FileOutputStream("tmp.txt");  
  22.   
  23.          BufferedWriter out= new BufferedWriter(new OutputStreamWriter(fout));  
  24.   
  25.         out.write(s,0,s.length( ));   
  26.   
  27.         out.close();     
  28.   
  29. }  
  30.   
  31. }    

3.2 Java程序从密钥库直接读取证书

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.security.*;  
  4.   
  5. import java.security.cert.Certificate;  
  6.   
  7. public class PrintCert2{  
  8.   
  9.     public static void main(String args[ ]) throws Exception{  
  10.   
  11.           String pass="080302";  
  12.   
  13.           String alias="mykey";  
  14.   
  15.           String name=".keystore";  
  16.   
  17.           FileInputStream in=new FileInputStream(name);  
  18.   
  19.           KeyStore ks=KeyStore.getInstance("JKS");             
  20.   
  21.           ks.load(in,pass.toCharArray());  
  22.   
  23.           Certificate c=ks.getCertificate(alias);  
  24.   
  25.           in.close();  
  26.   
  27.          System.out.println(c.toString( ));  
  28.   
  29.     }  
  30.   
  31. }    

3.3 Java程序显示证书指定信息(全名/公钥/签名等)

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.security.*;  
  4.   
  5. import java.security.cert.*;  
  6.   
  7. import java.math.*;  
  8.   
  9. public class ShowCertInfo{  
  10.   
  11.    public static void main(String args[ ]) throws Exception{  
  12.   
  13.         CertificateFactory cf=CertificateFactory.getInstance("X.509");  
  14.   
  15.         FileInputStream in=new FileInputStream("my.cer");  
  16.   
  17.         java.security.cert.Certificate c=cf.generateCertificate(in);  
  18.   
  19.         in.close();  
  20.   
  21.         X509Certificate t=(X509Certificate) c;  
  22.   
  23.         System.out.println("版本号 "+t.getVersion());  
  24.   
  25.         System.out.println("序列号 "+t.getSerialNumber().toString(16));  
  26.   
  27.         System.out.println("全名 "+t.getSubjectDN());  
  28.   
  29.         System.out.println("签发者全名n"+t.getIssuerDN());  
  30.   
  31.         System.out.println("有效期起始日 "+t.getNotBefore());  
  32.   
  33.         System.out.println("有效期截至日 "+t.getNotAfter());  
  34.   
  35.         System.out.println("签名算法 "+t.getSigAlgName());  
  36.   
  37.         byte[] sig=t.getSignature();  
  38.   
  39.         System.out.println("签名n"+new BigInteger(sig).toString(16));  
  40.   
  41.         PublicKey pk=t.getPublicKey();  
  42.   
  43.         byte[ ] pkenc=pk.getEncoded();  
  44.   
  45.         System.out.println("公钥");  
  46.   
  47.         for(int i=0;i< div="">   
  48.   
  49.         System.out.print(pkenc[i]+",");  
  50.   
  51.         }  
  52.   
  53. }  
  54.   
  55. }  

4 ssl/https双向验证的配置与证书库的生成

1.SSL认证

不需要特别配置,相关证书库生成看https认证中的相关部分

2.HTTPS认证

一、基本概念

1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源 
2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址 
如果只是加密,我感觉单向就行了。 
如果想要用系统的人没有证书就访问不了系统的话,就采用双向

二、服务器配置:

打开Tomcat 根目录下的 /conf/server.xml 修改server.xml

客户端证书注册名称必须与域名一致,否则无法验证。

例如访问https://127.0.0.1:8443/Test必须使用名称为127.0.0.1的证书,

访问https://hepengfei:8443/Test必须使用名称为hepengfei的证书,

本机中域名解析修改文件是C:WINDOWSsystem32driversetchosts

端口号改为8443,为自定义端口    访问https://127.0.0.1:8443/Test

端口号改为443,则为默认端口    访问https://127.0.0.1/Test

clientAuth="true"为双向认证      clientAuth="false"为单向认证 

使用密钥库文件和密码(自己使用的证书)  

信任密钥库文件和密码(含有客户端证书或其根证书)

<="" 1.1? sslenabled="true">maxThreads="150" scheme="https" secure="true"

clientAuth="true" sslProtocol="TLS"

keystoreFile="C:JavaTomcatconfkeystoreserver" keystorePass="080302"

truststoreFile="C:JavaTomcatconfkeystoreservertrust" truststorePass="080302" 

/>

三、证书的生成如下:
执行命令前先保证文件夹存在。例如:在c盘建立keystore文件夹
第一步:为服务器生成证书 

确定域名:本机中域名解析修改文件是C:WINDOWSsystem32driversetchosts
使用keytool 为 Tomcat 生成证书和密钥库,假定目标机器的域名是“ hepengfei ”, keystore 文件存放在“ C:keystoreserver ”,口令为“ 080302 ”,命令如下: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -v -keystore C:keystoreserver -alias serverkey -keyalg RSA -validity 3650 -dname "CN=hepengfei,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass 080302 -keypass 080302   

生成server.cer安装在客户端解决服务器信任问题:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -export -keystore C:keystoreserver -alias serverkey -file c:keystoreserver.cer -storepass 080302   

第二步:为客户端生成证书 

(注意:个人证书的生成和使用比较特别,是分开的。先生成p12文件,然后导出cer文件,再将cer文件导入默认类型的keystore(JKS)文件)
这一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE 和 Firefox ,证书格式应该是 PKCS12 ,因此,使用如下命令生成: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -v -keystore C:keystoreuser.p12 -alias MyPC -keyalg RSA -storetype PKCS12 -validity 3650 -dname "CN=MyPC,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass 080302 -keypass 080302   
服务器要信任客户端证书,就必须把客户端证书添加为服务器的信任认证。由于不能直接将 PKCS12 格式的证书库导入,我们必须先把客户端证书导出为一个单独的 CER 文件,使用如下命令: 
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -export -alias MyPC -keystore C:keystoreuser.p12 -storetype PKCS12 -storepass 080302 -rfc -file C:keystoreuser.cer   
接着,将C:user.cer导入到服务器的证书库,添加为一个信任证书: 
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -import -v -file C:keystoreuser.cer -keystore c:keystoreservertrust -alias user -storepass 080302  

输入“是”确认完成。
通过list 命令查看: 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. keytool -list -keystore c:keystoreservertrust -storepass 080302   

也可以考虑将服务器证书和服务器信任证书放到一个密钥库中

第四步:配置Tomcat 服务器 

打开Tomcat 根目录下的 /conf/server.xml ,修改如下: 

<="" 1.1? sslenabled="true">maxThreads="150" scheme="https" secure="true"

clientAuth="true" sslProtocol="TLS"

keystoreFile="C:JavaTomcatconfkeystoreserver" keystorePass="080302"

truststoreFile="C:JavaTomcatconfkeystoreservertrust" truststorePass="080302" 

/>

详细解释见本节最前面介绍。

安装个人证书user.p12(密码:080302)和服务器证书server.cer
到这里启动tomcat,输入 https://hepengfei:8443/Test,就OK了。 

如果数字证书注册名称不是127.0.0.1,而是对应的一个hepengfei,

使用ip访问(https://127.0.0.1:8443/Test)可以进入选择数字证书界面(仿真格式): 

选择数字证书

    名称     颁发商

    MyPC     MyPC

    详细信息  查看证书

        确定   取消

注意点:

keytool -list -v -keystore user

使用的库要privateKeyEntry

信任的库要trustedCertEntry

ConvertKeystoreType.java用于转换密钥库类型(PKCS12与JKS格式证书库转换工具)

ssl使用其中四个密钥库

https使用server、servertrust、user.p12(安装到本地计算机)、server.cer四个

5 数字签名-对数字证书的数字签名

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2. import java.security.*;  
  3. import java.security.cert.*;  
  4. import java.util.*;  
  5. import sun.security.x509.*;  
  6. /* 
  7.  * CA密钥库和其密码、CA中要使用的条目和其密码,新密钥库和其密码、新的条目名称 
  8.  
  9.  * 特别注意:java中有些类得到特别保护(比如X509CertImpl),必须设置规则才能访问【项目属性-Java Build Path-JRE   
  10.  
  11.  * System Library-Access Rules-Edit-"sun/**"(Accessible)】 
  12.  */  
  13. public class SignCert{  
  14.     public static void main(String args[ ]) throws Exception{  
  15.         String signerName = "keystore/ibe";   
  16.         String signerAlias = "he";  
  17.         char[] signerStorePass = "080302".toCharArray( );  
  18.         char[] signerKeyPass = "080302".toCharArray( );   
  19.         String CertName = "cert/ibe-mao.cer";  
  20.         String newStore = "keystore/newstore";  
  21.         String newStoreAlias = "mao";  
  22.         char[] newStorePass = "080302".toCharArray();  
  23.         // CA证书  
  24.         FileInputStream in=new FileInputStream(signerName);  
  25.         KeyStore ks=KeyStore.getInstance("JKS");  
  26.         ks.load(in,signerStorePass);  
  27.         java.security.cert.Certificate c1=ks.getCertificate(signerAlias);  
  28.         PrivateKey caprk=(PrivateKey)ks.getKey(signerAlias,signerKeyPass);  
  29.         in.close();  
  30.         //得到签发者  
  31.         byte[] encod1=c1.getEncoded();  
  32.         X509CertImpl cimp1=new X509CertImpl(encod1);  
  33.         X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);  
  34.         X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);  
  35.         //要签名的证书  
  36.         CertificateFactory cf=CertificateFactory.getInstance("X.509");  
  37.         FileInputStream in2=new FileInputStream(CertName);  
  38.         java.security.cert.Certificate c2=cf.generateCertificate(in2);  
  39.         in2.close();  
  40.         byte[] encod2=c2.getEncoded();  
  41.         X509CertImpl cimp2=new X509CertImpl(encod2);      
  42.         X509CertInfo cinfo2=(X509CertInfo)cimp2.get(  
  43.         X509CertImpl.NAME+"."+X509CertImpl.INFO);  
  44.         //设置新证书有效期  
  45.         Date begindate =new Date();  
  46.         //60 day  
  47.         Date enddate =new Date(begindate.getTime()+3000*24*60*60*1000L);             
  48.         CertificateValidity cv=new CertificateValidity(begindate,enddate);  
  49.         cinfo2.set(X509CertInfo.VALIDITY,cv);  
  50.         //设置新证书序列号  
  51.         int sn=(int)(begindate.getTime()/1000);  
  52.         CertificateSerialNumber csn=new CertificateSerialNumber(sn);  
  53.         cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);  
  54.         //设置新证书签发者  
  55.         cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);  
  56.         //设置新证书算法  
  57.         AlgorithmId algorithm = new AlgorithmId(AlgorithmId.sha1WithRSAEncryption_oid);  
  58.         cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM, algorithm);  
  59.         // 创建证书  
  60.         X509CertImpl newcert=new X509CertImpl(cinfo2);  
  61.         // 签名  
  62.         newcert.sign(caprk,"sha1WithRSA");  
  63.         //打印到控制台,验证一下信息  
  64.         System.out.println(newcert);  
  65.         // 存入密钥库  
  66.         ks.setCertificateEntry(newStoreAlias, newcert);  
  67.         FileOutputStream out=new FileOutputStream(newStore);  
  68.         ks.store(out,newStorePass);  
  69.         out.close();  
  70.     }  
  71. }   

注意:SignCert.java需要进行下面的处理才能正常导包。(eclipse把默认访问受限的api设成了error

选中项目--右键--进入Properties(属性)视图

选中Java Build Path--点击Libraries--展开JRE System Library[JavaSE-1.6],选中Access rules这一项(如果没有,那就是JDK安装和配置的问题)。   

Edit--点击Add--Rule Pattern(规则式样)编辑你允许导入的类库,如本例中输入(sun/**),允许就是在Resolution选项中选中Accessible(当然,有些项目需要可以选择ForbiddenDiscourage某些类库)。

然后重启就可以了。

6 数字签名与数字签名验证

(对字符串或文件进行签名以及相应数字签名验证)

Sign.java

//对字符串或文件进行签名

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package sign;  
  2.   
  3. import java.io.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. import java.security.interfaces.*;  
  8.   
  9. public class Sign{   
  10.   
  11.     public static void main(String args[ ]) throws Exception{  
  12.   
  13.         //获取要签名的数据,放在data数组  
  14.   
  15.         FileInputStream f=new FileInputStream("1.txt");  
  16.   
  17.         int num=f.available();  
  18.   
  19.         byte[ ] data=new byte[num];  
  20.   
  21.         f.read(data);  
  22.   
  23.         //获取私钥  
  24.   
  25.         FileInputStream f2=new FileInputStream("RSA_priv.dat");  
  26.   
  27.         ObjectInputStream b=new ObjectInputStream(f2);  
  28.   
  29.         RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );  
  30.   
  31.   
  32.   
  33.         //获取Signature对象  
  34.   
  35.         Signature s=Signature.getInstance("MD5WithRSA");  
  36.   
  37.          //初始化  
  38.   
  39.         s.initSign(prk);  
  40.   
  41.          //传入要签名的数据  
  42.   
  43.         s.update(data);  
  44.   
  45.         System.out.println("");  
  46.   
  47.          //签名  
  48.   
  49.         byte[ ] signeddata=s.sign( );  
  50.   
  51.         //保存签名  
  52.   
  53.         FileOutputStream  f3=new FileOutputStream("Sign.dat");  
  54.   
  55.         f3.write(signeddata);   
  56.   
  57. }  
  58.   
  59. }  

CheckSign.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package sign;  
  2.   
  3. import java.io.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. import java.security.interfaces.*;  
  8.   
  9. public class CheckSign{  
  10.   
  11. // 从签名者那儿得到msg.dat和sign.dat和公钥RSA_pub.dat  
  12.   
  13. // 修改msg.dat则数据无法通过验证,因此不怕网络传递过程中被修改,或signer不承认,因为只有signer才能针对msg.dat得到sign.dat,  
  14.   
  15. // 如果checker将内容改为$300,则signer可要求其用签名验证,  
  16.   
  17. // 1.验证完整性  checker担心是否网络传递时将内容修改过了,或者是否确实是signer发来的,不是别人乱传的,经检查签名,正确,于是放心,  
  18.   
  19. // 2. 不可否认性。 signer不承认这个文件是自己发的,或说checker改过内容了,checker展示其签名sign.dat,只有signer有私钥,能根据msg.dat生成这样的内容,别人都不能。     
  20.   
  21. public static void main(String args[ ]) throws Exception{  
  22.   
  23. //获取数据,放在data数组  
  24.   
  25.         FileInputStream f=new FileInputStream("1.txt");  
  26.   
  27.         int num=f.available();  
  28.   
  29.         byte[ ] data=new byte[num];  
  30.   
  31.         f.read(data);  
  32.   
  33.         //读签名  
  34.   
  35.         FileInputStream f2=new FileInputStream("Sign.dat");  
  36.   
  37.         int num2=f2.available();  
  38.   
  39.         byte[ ] signeddata=new byte[num2];  
  40.   
  41.         f2.read(signeddata);  
  42.   
  43.         //读公钥  
  44.   
  45.         FileInputStream f3=new FileInputStream("RSA_pub.dat");  
  46.   
  47.         ObjectInputStream b=new ObjectInputStream(f3);  
  48.   
  49.         RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );  
  50.   
  51.         //获取对象  
  52.   
  53.         Signature s=Signature.getInstance("MD5WithRSA");  
  54.   
  55.         //初始化  
  56.   
  57.         s.initVerify(pbk);  
  58.   
  59.         //传入原始数据  
  60.   
  61.         s.update(data);  
  62.   
  63.         boolean ok=false;  
  64.   
  65.         try{  
  66.   
  67.         //用签名验证原始数据  
  68.   
  69.             ok=  s.verify(signeddata);  
  70.   
  71.             System.out.println(ok);  
  72.   
  73.         }  
  74.   
  75.         catch(SignatureException e){ System.out.println(e);}     
  76.   
  77.         System.out.println("Check Over");  
  78.   
  79. }  
  80.   
  81. }    

生成RSA密钥

生成非对称加密的公钥和私钥-生成RSA密钥

非对称加密将加密的密钥和解密的密钥分开。A事先生成一对密钥,一个用于加密,称为公钥(公钥),一个用于解密,称为私钥。由于产生这一对密钥的一些数学特性,公钥加密的信息只能用私钥解密。这样,A只要将公钥对外公开,不论谁就可以使用这个公钥给A发送秘密信息了。A接收到加密信息后可以用私钥打开。由于只需要传递公钥,而公钥只能加密不能解密,因此即使攻击者知道了公钥也无济于事。

本文介绍的是RSA非对称加密算法。

GenerateRSAKey.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package sign;  
  2.   
  3. import java.io.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. public class GenerateRSAKey {  
  8.   
  9.    public static void main(String args[]) throws Exception{  
  10.   
  11.         KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");  
  12.   
  13.         kpg.initialize(1024);  
  14.   
  15.         KeyPair kp=kpg.genKeyPair();  
  16.   
  17.         PublicKey pbkey=kp.getPublic();  
  18.   
  19.         PrivateKey prkey=kp.getPrivate();  
  20.   
  21.         //  保存公钥          
  22.   
  23.         FileOutputStream  f1=new FileOutputStream("RSA_pub.dat");  
  24.   
  25.         ObjectOutputStream b1=new  ObjectOutputStream(f1);  
  26.   
  27.         b1.writeObject(pbkey);  
  28.   
  29.         //  保存私钥  
  30.   
  31.         FileOutputStream  f2=new FileOutputStream("RSA_priv.dat");  
  32.   
  33.         ObjectOutputStream b2=new  ObjectOutputStream(f2);  
  34.   
  35.         b2.writeObject(prkey);  
  36.   
  37. }  
  38.   
  39. }  

8 使用Java程序将已签名的数字证书导入密钥库

首先读取CA的证书mytest.cer和用户收到的签名后的证书lf_signed.cer(由CA私钥签发),使用这两个证书组成证书链,然后从用户的密钥库读取私钥,最后执行KeyStore对象的setKeyEntry( )方法将私钥和证书一起写入密钥库,并使用store( )方法保存为文件即可。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.security.*;  
  4.   
  5. import java.security.cert.*;  
  6.   
  7. /* 
  8.  
  9.  * CA证书,已经签名的用户数字证书,用户密钥库名和密码以及相应证书的私钥名称,新生成的证书名称和密钥库名以及密码 
  10.  
  11.  */  
  12.   
  13. public class ImportCert{  
  14.   
  15.     public static void main(String args[ ]) throws Exception{  
  16.   
  17.         //参数  
  18.   
  19.         String cacert="new.cer";  
  20.   
  21.         String lfcert="hqy.cer";  
  22.   
  23.         String lfstore="mykeystore";  
  24.   
  25.         char[] lfstorepass="080302".toCharArray( );  
  26.   
  27.         char[] lfkeypass="080302".toCharArray( );  
  28.   
  29.         //CA的证书  
  30.   
  31.         CertificateFactory cf=CertificateFactory.getInstance("X.509");  
  32.   
  33.         FileInputStream in1=new FileInputStream(cacert);  
  34.   
  35.         java.security.cert.Certificate cac=cf.generateCertificate(in1);  
  36.   
  37.         in1.close();  
  38.   
  39.         //用户的签名证书  
  40.   
  41.         FileInputStream in2=new FileInputStream(lfcert);  
  42.   
  43.         java.security.cert.Certificate lfc=cf.generateCertificate(in2);  
  44.   
  45.         in2.close();  
  46.   
  47.         //证书链  
  48.   
  49.         java.security.cert.Certificate[] cchain={lfc,cac};  
  50.   
  51.         //用户的密钥库  
  52.   
  53.         FileInputStream in3=new FileInputStream(lfstore);  
  54.   
  55.         KeyStore ks=KeyStore.getInstance("JKS");  
  56.   
  57.         ks.load(in3,lfstorepass);  
  58.   
  59.         PrivateKey prk=(PrivateKey)ks.getKey("new",lfkeypass);  
  60.   
  61.         //导入证书  
  62.   
  63.         ks.setKeyEntry("new_signed",prk,lfstorepass,cchain);  
  64.   
  65.         //保存密钥库  
  66.   
  67.         FileOutputStream out4=new FileOutputStream("nostore");  
  68.   
  69.         ks.store(out4,"080302".toCharArray());  
  70.   
  71.         out4.close();   
  72.   
  73. }  
  74.   
  75. }    

9 验证CertPath证书链

验证CertPath证书链-CertPathValidator类基于TrustAnchor验证证书链

CertPathValidator类中的validate( )方法可以使用现成的PKIX certification path验证算法直接验证CertPath类型的对象。方法的第一个参数传入要验证的CertPath对象,第二个参数传入PKIXParameters类型的对象,它提供了验证时所使用的参数。

为了得到PKIXParameters类型的对象,必须指定最信任哪些CA。

ValidateCP.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package cert;  
  2. import java.io.*;  
  3. import java.security.cert.*;  
  4. import java.security.cert.Certificate;  
  5. import java.util.*;  
  6. public class ValidateCP{            
  7.     public static void main(String args[ ]) throws Exception{  
  8.         String[] arg=new String[]{"cert/ibe-mao-signed.cer","cert/ibe-he.cer"};  
  9.         String trustAnchor = "cert/ibe-he.cer";  
  10.         CertificateFactory cf = CertificateFactory.getInstance("X.509");  
  11.         int i;  
  12.         Listmylist = new ArrayList();  
  13.         for (i=0;i<arg.length;i++){  
  14.         FileInputStream in=new FileInputStream(arg[i]);  
  15.                 Certificate c=cf.generateCertificate(in);  
  16.                 mylist.add(c);  
  17.         }  
  18.         CertPath cp = cf.generateCertPath(mylist);  
  19.         //以上将证书列表转换成证书链  
  20.         //设置锚点  
  21.         FileInputStream in=new FileInputStream(trustAnchor);  
  22.         Certificate trust=cf.generateCertificate(in);  
  23.         // Create TrustAnchor  
  24.         TrustAnchor anchor = new TrustAnchor( (X509Certificate)trust,null);  
  25.         // Set the PKIX parameters  
  26.         PKIXParameters params = new PKIXParameters(Collections.singleton(anchor));  
  27.         params.setRevocationEnabled(false);  
  28.         CertPathValidator cpv = CertPathValidator.getInstance("PKIX");  
  29.         try {  
  30.          PKIXCertPathValidatorResult result =(PKIXCertPathValidatorResult) cpv.validate(cp, params);  
  31.          System.out.println(result);  
  32.          System.out.println(result.getTrustAnchor());  
  33.         } catch (CertPathValidatorException cpve) {  
  34.          System.out.println("Validation failure, cert[" + cpve.getIndex() + "] :" + cpve.getMessage());  
  35.         }  
  36.  }  
  37. }   

10 使用CBC方式进行加密

对明文分组的不同处理方式形成了不同的加密方式,本章前面各节的程序中没有指定加密方式,默认的加密方式是ECB(Electronic Code Book),它对每个明文分组独立进行处理。所以明文若8个字节一组相同的话(如本节开头的“Hello123Hello123Hello123Hello123”),加密出的结果也是8个字节一组相同的。

另一种加密方式称为CBC(Cipher Block Chaining),它先加密第一个分组,然后使用得到的密文加密第二个分组,加密第二个分组得到的密文再加密第三个分组,……。这样,即使两个分组相同,得到的密文也不同。剩下的问题是如果两个密文的开头8个字节相同,按照这种加密方式,只要使用的密钥相同,则每条密文的开头8个字节也将相同。为此,CBC使用一个8个字节的随机数(称为初始向量,IV)来加密第一个分组,其作用类似于基于口令加密中的盐。

因此,使用CBC方式首先要生成初始向量,然后在获取密码器对象时通过getInstance( )方法的参数设定加密方式,在密码器初始化时传入初始向量。

//必须拥有DES加密密钥文件 DesKey.dat 和需要加密的文件1.txt

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.util.*;  
  4.   
  5. import java.security.*;  
  6.   
  7. import javax.crypto.*;  
  8.   
  9. import javax.crypto.spec.*;  
  10.   
  11. public class CBC{  
  12.   
  13.     public static void main(String args[]) throws Exception{  
  14.   
  15.         FileInputStream fi=new FileInputStream("1.txt");  
  16.   
  17.         int l=fi.available();  
  18.   
  19.         byte[] c=new byte[l];  
  20.   
  21.         fi.read(c);  
  22.   
  23.   
  24.   
  25.         FileInputStream f1=new FileInputStream("DesKey.dat");  
  26.   
  27.         ObjectInputStream b=new ObjectInputStream(f1);  
  28.   
  29.         Key k=(Key)b.readObject( );  
  30.   
  31.         byte[] rand=new byte[8];    
  32.   
  33.         Random r=new Random( );  
  34.   
  35.         r.nextBytes(rand);  
  36.   
  37.         IvParameterSpec iv=new IvParameterSpec(rand);  
  38.   
  39.         Cipher cp=Cipher.getInstance("DESede/CBC/PKCS5Padding");  
  40.   
  41.         cp.init(Cipher.ENCRYPT_MODE, k, iv);  
  42.   
  43.         byte ptext[]=c;  
  44.   
  45.         byte ctext[]=cp.doFinal(ptext);  
  46.   
  47.         for(int i=0;i< div="">   
  48.   
  49.              System.out.print(ctext[i] +",");  
  50.   
  51.         }  
  52.   
  53.         FileOutputStream f2=new FileOutputStream("SEncCBC.dat");  
  54.   
  55.         f2.write(rand);  
  56.   
  57.         f2.write(ctext);  
  58.   
  59.         Cipher cp1=Cipher.getInstance("DESede/CBC/PKCS5Padding");  
  60.   
  61.         cp1.init(Cipher.DECRYPT_MODE, k, iv);  
  62.   
  63.         byte[] jm=cp1.doFinal(ctext);  
  64.   
  65.         FileOutputStream fo=new FileOutputStream("2.txt");  
  66.   
  67.         fo.write(jm);  
  68.   
  69.         fo.close();  
  70.   
  71.    }     
  72.   
  73. }  

11 基于口令的加密解密

基于口令的加密和解密

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.util.*;  
  4.   
  5. import javax.crypto.*;  
  6.   
  7. import javax.crypto.spec.*;  
  8.   
  9. public class PBE{  
  10.   
  11.    public static void main(String args[]) throws Exception{  
  12.   
  13.   FileInputStream fi=new FileInputStream("1.rar");  
  14.   
  15.   int l=fi.available();  
  16.   
  17.   byte[] b=new byte[l];  
  18.   
  19.   fi.read(b);  
  20.   
  21.   //生成密钥  
  22.   
  23.   char[] passwd="123".toCharArray();  
  24.   
  25.        PBEKeySpec pbks=new PBEKeySpec(passwd);  
  26.   
  27.        SecretKeyFactory kf=  
  28.   
  29.        SecretKeyFactory.getInstance("PBEWithMD5AndDES");   
  30.   
  31.        SecretKey k=kf.generateSecret(pbks);  
  32.   
  33.        //生成盐  
  34.   
  35.        byte[] salt=new byte[8];  
  36.   
  37.        Random r=new Random( );  
  38.   
  39.        r.nextBytes(salt);  
  40.   
  41.        //创建并初始化密码器  
  42.   
  43.        Cipher cp=Cipher.getInstance("PBEWithMD5AndDES");  
  44.   
  45.        PBEParameterSpec ps=new PBEParameterSpec(salt,1000);  
  46.   
  47.        cp.init(Cipher.ENCRYPT_MODE, k,ps);  
  48.   
  49.        //获取明文并加密  
  50.   
  51.        byte ctext[]=cp.doFinal(b);  
  52.   
  53.        //生成输出文件  
  54.   
  55.        //准备解密  
  56.   
  57.        Cipher cp1=Cipher.getInstance("PBEWithMD5AndDES");  
  58.   
  59.        cp1.init(Cipher.DECRYPT_MODE, k,ps);  
  60.   
  61.        byte ptext1[]=cp1.doFinal(ctext);  
  62.   
  63.          
  64.   
  65.        FileOutputStream f=new FileOutputStream("2.rar");  
  66.   
  67.        f.write(ptext1);  
  68.   
  69.        f.close();  
  70.   
  71.    }  
  72.   
  73. }  

11 对称密钥的生成和保存-生成DES密钥

对称密钥的生成及以对象序列化方式保存

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import javax.crypto.*;  
  4.   
  5. public class GetDesKey{  
  6.   
  7.     public static void main(String args[]) throws Exception{    
  8.   
  9.         KeyGenerator kg=KeyGenerator.getInstance("DESede");  
  10.   
  11.         kg.init(168);   
  12.   
  13.         SecretKey k=kg.generateKey( );  
  14.   
  15.         FileOutputStream  f=new FileOutputStream("DesKey.dat");  
  16.   
  17.         ObjectOutputStream b=new  ObjectOutputStream(f);  
  18.   
  19.         b.writeObject(k);//要写入对象数据只能使用对象数据流  
  20.   
  21.         byte[] c=k.getEncoded();//生成编码的字节表示展示一下,使用时可以删除  
  22.   
  23.         for(int i=0;i<c.length;i++){  
  24.   
  25.             System.out.print(c[i]);  
  26.   
  27.         }}}  

以字节保存对称密钥

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2.   
  3. import java.security.*;  
  4.   
  5. public class Skey_kb{  
  6.   
  7.     public static void main(String args[]) throws Exception{  
  8.   
  9.         FileInputStream f=new FileInputStream("key1.dat");  
  10.   
  11.         ObjectInputStream b=new ObjectInputStream(f);  
  12.   
  13.         Key k=(Key)b.readObject( );  
  14.   
  15.         byte[ ] kb=k.getEncoded( );  
  16.   
  17.         FileOutputStream  f2=new FileOutputStream("keykb1.dat");  
  18.   
  19.         f2.write(kb);  
  20.   
  21.         // 打印密钥编码中的内容  
  22.   
  23.         for(int i=0;i<kb.length;i++<span style="font-family: Verdana, Arial, Helvetica, sans-serif;"> ){</span>  
  24.   
  25.             System.out.print(kb[i]+",");  
  26.   
  27.         }  
  28.   
  29.     }  
  30.   
  31. }  

11 针对流的加密和解密

针对流的加密和解密

针对输入流的解密和解密

//必须拥有的文件:key1.dat(DES密钥文件),需要加密的文件1.rar

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2. import java.security.*;  
  3. import java.util.Scanner;  
  4. import javax.crypto.*;  
  5. public class StreamInCipher{  
  6.     public static void main(String args[]) throws Exception{  
  7.         Scanner reader=new Scanner(System.in);  
  8.         System.out.println("please choose the type of opration:1.加密  2.解密");  
  9.         int choose=reader.nextInt();  
  10.         String fi="1.zip";  
  11.         String fc="code.txt";  
  12.         String fo="2.zip";  
  13.         String f1=null;  
  14.         String f2=null;  
  15.         if(choose==1){  
  16.             f1=fi;  
  17.             f2=fc;  
  18.         }  
  19.         if(choose==2){  
  20.             f1=fc;  
  21.             f2=fo;  
  22.         }  
  23.         FileInputStream f=new FileInputStream("key1.dat");  
  24.         ObjectInputStream ob=new ObjectInputStream(f);  
  25.         Key k=(Key)ob.readObject( );  
  26.         Cipher cp=Cipher.getInstance("DESede");  
  27.         if(choose==1)  
  28.             cp.init(Cipher.ENCRYPT_MODE, k);  
  29.         else  
  30.             cp.init(Cipher.DECRYPT_MODE, k);  
  31.         FileInputStream in=new FileInputStream(f1);  
  32.         FileOutputStream out=new FileOutputStream(f2);  
  33.         CipherInputStream cin=new CipherInputStream(in, cp);  
  34.         int b=0;  
  35.         while( (b=cin.read())!=-1){  
  36.             out.write(b);  
  37.             System.out.println("ok!");  
  38.             System.out.println(b);  
  39.         }  
  40.         cin.close();  
  41.         out.close();  
  42.         in.close();  
  43.    }  
  44. }  

针对输出流的解密和解密

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.io.*;  
  2. import java.security.*;  
  3. import java.util.Scanner;  
  4. import javax.crypto.*;  
  5. public class StreamOutCipher{  
  6.     public static void main(String args[]) throws Exception{  
  7.         Scanner reader=new Scanner(System.in);  
  8.         System.out.println("please choose the type of opration:1.加密  2.解密");  
  9.         int choose=reader.nextInt();  
  10.         String fi="1.zip";  
  11.         String fc="code.txt";  
  12.         String fo="2.zip";  
  13.         String f1=null;  
  14.         String f2=null;  
  15.         if(choose==1){  
  16.             f1=fi;  
  17.             f2=fc;  
  18.         }  
  19.         if(choose==2){  
  20.             f1=fc;  
  21.             f2=fo;  
  22.         }  
  23.         FileInputStream f=new FileInputStream("key1.dat");  
  24.         ObjectInputStream ob=new ObjectInputStream(f);  
  25.         Key k=(Key)ob.readObject( );  
  26.         Cipher cp=Cipher.getInstance("DESede");  
  27.         if(choose==1)  
  28.             cp.init(Cipher.ENCRYPT_MODE, k);  
  29.         else  
  30.             cp.init(Cipher.DECRYPT_MODE, k);  
  31.         FileInputStream in=new FileInputStream(f1);  
  32.         FileOutputStream out=new FileOutputStream(f2);  
  33.         CipherOutputStream cout=new CipherOutputStream(out, cp);  
  34.         int b=0;  
  35.         while( (b=in.read())!=-1){  
  36.             cout.write(b);  
  37.             //System.out.println(b);  
  38.         }  
  39.         cout.close();  
  40.         out.close();  
  41.         in.close();  
  42.    }  
  43. }  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<br> 系统介绍<br> JavaClass文件加密专家是一款针对Java应用程序Class二进制文件加密的软件,系统核心由纯C语言编写,运行效率极<br>高。传统的Java程序加密的方式多为代码混迹方式,但是无论多么复杂的混迹方式,在使用Java代码反编译程序后还是可以看<br>到代码的逻辑结构,这样并没有彻底的保护好您的代码。<br> JavaClass文件加密专家通过分析Class文件的结构,将Class二进制代码中耗时较多的部份抽出并替换为Native C代码,<br>并且使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件进行破解。<br><br> 系统特点<br> 1.采用纯C语言开发的内核算法,运行速度极快。<br> 2.抽出了JVM虚拟机耗时较多的代码,替换为原生C代码去执行,加密后的Class文件运行效率比加密前还要快。<br> 3.彻底保护您的Class二进制文件,任何通过分析Class文件结构来实现反编译的工具均不能对加密后的文件反编译。<br><br> 使用方法<br> 在要分发您的Java应用程序前,使用JavaClass文件加密专家对所有的Class文件或Jar文件进行加密,在您的系统运行参<br>数中加入以下内容:<br> 1.WEB应用程序<br> 在您使用的Java Web Server的启动参数中,增加以下内容: -agentlib:<brainysoft.dll的存放目录>\brainysoft即<br>可。<br> 举例 :<br> 假设您的Java Web Server为Tomcat,以Windows平台为例,Tomcat的存放目录为C:\Tomcat 5.5 ,brainysoft.dll存<br>放在c:\windows目录中,在Tomcat的bin目录中新建一个文件setenv.bat,setenv.bat中的内容:set JAVA_OPTS= -<br>agentlib:c:\windows\brainysoft %JAVA_OPTS%,保存setenv.bat文件,重新启动Tomcat后就可以正确加载加密类了。<br> 2.独立的Java应用程序<br> 在您的应用程序运行参数中加入以下内容: -agentlib:<brainysoft.dll的存放目录>\brainysoft<br> 举例:<br> Test.class文件的package为com.test, 在运行您的Test.class或Jar时使用以下方式:java -agentlib:<br><brainysoft.dll的存放目录>\brainysoft <-classpath 您的.jar文件> com.test.Test。<br> 3.EJB组件<br> 运行加密后的EJB组件的方式与运行WEB应用程序类似,找到您的EJB容器的启动配置文件,加入-agentlib:<br><brainysoft.dll的存放目录>\brainysoft 即可。<br><br> 应用环境<br> JavaClass文件加密专家只能用在JDK1.5及更新版本的JDK中,您在Windows平台下加密后的Class文件不必再修改就可以应<br>用于Linux、Unix等平台中。<br>
文件加密传输系统的设计与java实现可以通过以下步骤完成。 首先,需要设计一个基于高度安全的加密算法来保护文件的机密性。常用的加密算法有AES(Advanced Encryption Standard)和RSA(Rivest-Shamir-Adleman)等。可以根据需求选择合适的加密算法。 其次,在java中实现加密算法的代码。可以使用java内置的加密库,如Java Cryptography Extension(JCE)来实现AES或RSA加密算法。具体的实现过程包括密钥生成、加密和解密操作。在文件加密传输系统中,可以通过生成对称密钥来对文件进行加密,然后使用公钥加密这个对称密钥,最后将加密后的文件和加密后的对称密钥一起传输。 接下来,需要设计一个安全的传输协议来确保加密后的文件能够在传输过程中不被解密。常用的传输协议有HTTPS和SFTP等。可以使用java中的网络编程库,如Socket类和SSLContext类来实现安全的传输协议。 最后,为了完善文件加密传输系统,可以考虑添加身份验证机制,如用户名和密码、数字证书等,来确保只有合法用户才能访问加密的文件。 综上所述,通过设计一个合适的加密算法、实现加密算法代码、设计安全的传输协议和添加身份验证机制,可以实现一个文件加密传输系统的java实现。这个系统能够在文件传输过程中保护文件的机密性,防止敏感信息泄露。同时,使用java编程语言能够确保系统具有良好的可移植性和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值