java sn_java sn

package com.security;

import java.security.*;

import java.io.*;

import java.util.*;

import java.security.*;

import java.security.cert.*;

import sun.security.x509.*;

import java.security.cert.Certificate;

import java.security.cert.CertificateFactory;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

public class Test

{

/**

* @param args

*/

public static void main(String[] args)

{

// TODO Auto-generated method stub

Test t = new Test();

//t.createCert("qihongce", "qihongce");

//t.show();

t.method1();

}

public void createCert(String username, String password)

{

//默认情况下MyKeyStore.keystore密码为WorldHello 密钥库密码为KeytoolHello123

String name = "e:/qhc/tools/MyKeyStore.keystore";

String certPass = "KeytoolHello123";//WorldHello

String pass = "WorldHello";//KeytoolHello123

// 根证书

String alias = "HelloKeytool";

// String name = "e:/qhc/tools/MyKeyStoreQHCTest.keystore";

// String pass = "qihongce";

// String certPass = "qihongce";

// // 根证书

// String alias = "QHCKeytool";

String newCert = username + password;

System.out.println(newCert);

try

{

// 载入证书库

FileInputStream in = new FileInputStream(name);

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(in, pass.toCharArray());

// 得到签发者

Certificate c = (Certificate) ks.getCertificate(alias);

byte[] encode1 = ((Certificate) c).getEncoded();

X509CertImpl cimp1 = new X509CertImpl(encode1);

X509CertInfo cinfo1 = (X509CertInfo) cimp1.get(X509CertImpl.NAME

+ "." + X509CertImpl.INFO);

X500Name issuer = (X500Name) cinfo1.get(X509CertInfo.SUBJECT + "."

+ CertificateIssuerName.DN_NAME);

PrivateKey pk = (PrivateKey) ks.getKey(alias, certPass

.toCharArray());

// PublicKey pubk = (PublicKey) ks.getKey(alias, certPass.toCharArray());

System.out.println("私钥: " + pk.getEncoded().toString());

Calendar calendar = Calendar.getInstance();

Date begindate = calendar.getTime();

calendar.add(Calendar.YEAR, 1);

Date enddate = calendar.getTime();

System.out.println("证书有效期为: " + begindate + " -- " + enddate);

// 设置新证书的有效期

CertificateValidity cv = new CertificateValidity(begindate, enddate);

cinfo1.set(X509CertInfo.VALIDITY, cv);

// 设置SN号

int sn = (int) (begindate.getTime() / 1000);

CertificateSerialNumber csn = new CertificateSerialNumber(sn);

cinfo1.set(X509CertInfo.SERIAL_NUMBER, csn);

System.out.println("证书SN: " + csn);

// 设置新证书的签发者

cinfo1.set(X509CertInfo.ISSUER + "."

+ CertificateIssuerName.DN_NAME, issuer);

System.out.println("签发者: "

+ issuer

+ " ISSUER: "

+ X509CertInfo.ISSUER

+ "name"

+ cinfo1.getName()

+ cinfo1.get(X509CertInfo.ISSUER + "."

+ CertificateIssuerName.DN_NAME));

// 设置新证书的算法

AlgorithmId algorithm = new AlgorithmId(

AlgorithmId.md5WithRSAEncryption_oid);

cinfo1.set(CertificateAlgorithmId.NAME + "."

+ CertificateAlgorithmId.ALGORITHM, algorithm);

// 创建新证书

X509CertImpl newcert = new X509CertImpl(cinfo1);

newcert.sign(pk, "DSA");//MD5WithRSA

System.out.println(newcert);

ks.setCertificateEntry(newCert, newcert);

FileOutputStream out = new FileOutputStream(name);

ks.store(out, certPass.toCharArray());

System.out.println("成功啦 hello world");

} catch (Exception e)

{

e.printStackTrace();

}

}

// 上面的代码是利用根证书的private key

// 完成证书的签发。所以签发的证书都是trustedCertEntry。而不是keyEntry。

// google了很多文档。都是和此代码类似。大多是利用ssl来完成加密通信的。而不是利用数字证书的公钥和私钥来完成加密和解密的。。。。

// 希望能得到大家的帮助。谢谢、

public String show()

{

try

{

String name = "e:/qhc/tools/MyKeyStore.keystore";

String certpass = "KeytoolHello123";//WorldHello

String pass = "WorldHello";// "KeytoolHello123";

// 根证书

String alias = "HelloKeytool";//

// String pass = "qihongce";

// String certpass = "qihongce";

// String name = "e:/qhc/tools/MyKeyStoreQHCTest.keystore";

// // 根证书

// String alias = "QHCKeytool";

System.out.println("aaaaaaaaaaaaaaaaaaaaaaa");

File file = new File(name);

// ObjectInputStream in = (new ObjectInputStream(new FileInputStream(

// name)));

FileInputStream in = new FileInputStream(

name);

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(in, pass.toCharArray());

// 得到签发者

Certificate c = (Certificate) ks.getCertificate(alias);

byte[] encode1 = ((Certificate) c).getEncoded();

// 现在实现身份验证,通过数字签名来验证了。利用数字证书的私钥来完成签名,引用发出的公钥来验证签名。也是可以完成身份验证的。。。

Signature s = Signature.getInstance("DSA");

// 或得数字证书的私钥

PrivateKey prk = (PrivateKey) ks.getKey(alias, certpass

.toCharArray());

// PublicKey pubk = (PublicKey) ks.getKey(alias, certpass

// .toCharArray());

// 用私钥初始化Signature

s.initSign(prk);

// 传入要签名的数据

s.update(encode1);

// 执行签名

// String sig = (String) in.readObject();

byte[] signaturedata = s.sign();

// 利用公钥验证

PublicKey pbk = c.getPublicKey();

Signature s1 = Signature.getInstance("DSA");//MD5WithRSA

s1.initVerify(pbk);

// 传入要签名的数据

s1.update(signaturedata);

s1.verify(signaturedata);

System.out.println("成功啦 啦 啦 啦 啦 啦 啦");

return "身份验证成功:" + s.toString();

} catch (Exception e)

{

System.out.println("失败啦 啦 啦 啦 啦 啦 啦\n");

e.printStackTrace();

return "身份验证失败";

}

}

// ///

public void method1()

{

// JAVA对数字证书的常用操作

// 阅读提示:本文介绍JAVA对数字证书的常用操作

// 一需要包含的包

// 二 从文件中读取证书

String name = "e:/qhc/tools/MyKeyStore.keystore";

String cer = "e:/qhc/tools/HelloKeytool.cer";

String certpass = "KeytoolHello123";

String pass = "WorldHello";//

// 根证书

String alias = "HelloKeytool";// "HelloWorld";

//

String oldkeypass = "KeytoolHello123";

String newkeypass = "123456";

try

{

// 用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息

/*

CertificateFactory cf = CertificateFactory.getInstance("X.509");

FileInputStream in = new FileInputStream(cer);//HelloKeytool.cer

Certificate c = cf.generateCertificate(in);

String s = c.toString();

System.out.println("s: " + s);

*/

// 三 从密钥库中直接读取证书

/*

FileInputStream in1 = new FileInputStream(name);//

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(in1, pass.toCharArray());

Certificate c1 = ks.getCertificate(alias);// alias为条目的别名

// 四 JAVA程序中显示证书指定信息

X509Certificate t = (X509Certificate) c1;

System.out.println("输出证书信息:\n" + c1.toString());

System.out.println("版本号:" + t.getVersion());

System.out.println("序列号:" + t.getSerialNumber().toString(16));

System.out.println("主体名:" + t.getSubjectDN());

System.out.println("签发者:" + t.getIssuerDN());

System.out.println("有效期:" + t.getNotBefore());

System.out.println("签名算法:" + t.getSigAlgName());

byte[] sig = t.getSignature();// 签名值

PublicKey pk = t.getPublicKey();

byte[] pkenc = pk.getEncoded();

System.out.println("公钥");

for (int i = 0; i < pkenc.length; i++)

{

System.out.print(pkenc[i] + ",");

}

// 五 JAVA程序列出密钥库所有条目

FileInputStream in2 = new FileInputStream(name);//.keystore

KeyStore ks1 = KeyStore.getInstance("JKS");

ks1.load(in2, pass.toCharArray());

Enumeration e = ks1.aliases();

System.out.println("--------------------");

while (e.hasMoreElements())

{

Certificate c2 = ks1.getCertificate((String) e.nextElement());

System.out.println("c2: " + c2.getPublicKey());

}

System.out.println("=====================================");

*/

// 六 JAVA程序修改密钥库口令

/*

String oldpass = "WorldHello";

String newpass = "123456";

FileInputStream in3 = new FileInputStream(name);

KeyStore ks2 = KeyStore.getInstance("JKS");

ks2.load(in3, oldpass.toCharArray());

in3.close();

FileOutputStream output = new FileOutputStream(name);

ks2.store(output, newpass.toCharArray());

output.close();

System.out.println("密码修改成功!!!!!");

*/

// 七 JAVA程序修改密钥库条目的口令及添加条目

/*

FileInputStream in4 = new FileInputStream(name);

KeyStore ks3 = KeyStore.getInstance("JKS");

ks3.load(in4, storepass.toCharArray());

Certificate[] cchain = ks3.getCertificateChain(alias);// 获取别名对应条目的证书链

PrivateKey pk1 = (PrivateKey) ks3.getKey(alias, oldkeypass

.toCharArray());// 获取别名对应条目的私钥

ks3.setKeyEntry(alias, pk1, newkeypass.toCharArray(), cchain);// 向密钥库中添加条目

// 第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,

// 使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链

FileOutputStream output1 = new FileOutputStream("e:/qhc/tools/another.keystore");

ks3.store(output1, storepass.toCharArray());// 将keystore对象内容写入新文件

System.out.println("密钥库条目口令修改成功、添加条目成功!!!!");

*/

// 八 JAVA程序检验别名和删除条目

/*

FileInputStream in8 = new FileInputStream(name);

KeyStore ks8 = KeyStore.getInstance("JKS");

// 检验条目是否在密钥库中,存在返回true

ks8.load(in8, storepass.toCharArray());

if(ks8.containsAlias("sage"))

{

ks8.deleteEntry("sage");// 删除别名对应的条目

}

FileOutputStream output8 = new FileOutputStream(name);

ks8.store(output8, storepass.toCharArray());// 将keystore对象内容写入文件,条目删除成功

System.out.println("程序检测别名、删除条目成功!!!!");

*/

// 九 JAVA程序签发数字证书

/*

// (1)从密钥库中读取CA的证书

String cakeypass = "KeytoolHello123";//

FileInputStream in9 = new FileInputStream(name);

KeyStore ks9 = KeyStore.getInstance("JKS");

ks9.load(in9, pass.toCharArray());

Certificate c9 = ks9.getCertificate(alias);

// (2)从密钥库中读取CA的私钥

PrivateKey caprk = (PrivateKey) ks9.getKey(alias, certpass

.toCharArray());

// (3)从CA的证书中提取签发者的信息

byte[] encod1 = c9.getEncoded(); // 提取CA证书的编码

X509CertImpl cimp1 = new X509CertImpl(encod1); // 用该编码创建X509CertImpl类型对象

X509CertInfo cinfo1 = (X509CertInfo) cimp1.get(X509CertImpl.NAME

+ "." + X509CertImpl.INFO); // 获取X509CertInfo对象

X500Name issuer = (X500Name) cinfo1.get(X509CertInfo.SUBJECT + "."

+ CertificateIssuerName.DN_NAME); // 获取X509Name类型的签发者信息

// (4)获取待签发的证书

CertificateFactory cf9 = CertificateFactory.getInstance("X.509");

FileInputStream in91 = new FileInputStream(cer);

Certificate c29 = cf9.generateCertificate(in91);

// (5)从待签发的证书中提取证书信息

byte[] encod2 = c29.getEncoded();

X509CertImpl cimp2 = new X509CertImpl(encod2); // 用该编码创建X509CertImpl类型对象

X509CertInfo cinfo2 = (X509CertInfo) cimp2.get(X509CertImpl.NAME

+ "." + X509CertImpl.INFO); // 获取X509CertInfo对象

// (6)设置新证书有效期

Date begindate = new Date(); // 获取当前时间

Date enddate = new Date(begindate.getTime() + 3000 * 24 * 60 * 60

* 1000L); // 有效期为3000天

CertificateValidity cv = new CertificateValidity(begindate, enddate); // 创建对象

cinfo2.set(X509CertInfo.VALIDITY, cv); // 设置有效期

// (7)设置新证书序列号

int sn = (int) (begindate.getTime() / 1000);// 以当前时间为序列号

CertificateSerialNumber csn = new CertificateSerialNumber(sn);

cinfo2.set(X509CertInfo.SERIAL_NUMBER, csn);

// (8)设置新证书签发者

cinfo2.set(X509CertInfo.ISSUER + "."

+ CertificateIssuerName.DN_NAME, issuer);// 应用第三步的结果

// (9)设置新证书签名算法信息

AlgorithmId algorithm = new AlgorithmId(

AlgorithmId.md5WithRSAEncryption_oid);

cinfo2.set(CertificateAlgorithmId.NAME + "."

+ CertificateAlgorithmId.ALGORITHM, algorithm);

// (10)创建证书并使用CA的私钥对其签名

X509CertImpl newcert = new X509CertImpl(cinfo2);

newcert.sign(caprk, "DSA"); // 使用CA私钥对其签名

// (11)将新证书写入密钥库

ks9.setCertificateEntry("lf_signed", newcert);

FileOutputStream out = new FileOutputStream("e:/qhc/tools/newstore.keystore");

ks9.store(out, "qihongce".toCharArray()); // 这里是写入了新的密钥库,也可以使用第七条来增加条目

System.out.println("成功啦,这才是一个完整的利用公钥私钥颁发数字证书的过程");

*/

// 十 数字证书的检验

// (1)验证证书的有效期

// (a)获取X509Certificate类型对象

CertificateFactory cf10 = CertificateFactory.getInstance("X.509");

FileInputStream in10 = new FileInputStream(cer);

Certificate c10 = cf10.generateCertificate(in10);

X509Certificate t1 = (X509Certificate) c10;

in10.close();

// (b)获取日期

Date TimeNow = new Date();

// (c)检验有效性

t1.checkValidity(TimeNow);

System.out.println("OK");

} catch (CertificateExpiredException e11)

{ // 过期

System.out.println("Expired");

System.out.println(e11.getMessage());

} catch (CertificateNotYetValidException ex)

{ // 尚未生效

System.out.println("Too early");

System.out.println(ex.getMessage());

} catch (Exception ex)

{

System.out.println(ex.getMessage());

}

boolean pass12 = false;

try

{

// (2)验证证书签名的有效性

// (a)获取CA证书

CertificateFactory cf11 = CertificateFactory.getInstance("X.509");

FileInputStream in20 = new FileInputStream(cer);

Certificate cac = cf11.generateCertificate(in20);

in20.close();

// (c)获取CA的公钥

PublicKey pbk = cac.getPublicKey();

// (b)获取待检验的证书(上步已经获取了,就是C1)

// (c)检验证书

cac.verify(pbk);

pass12 = true;

System.out.println("OK!!!");

} catch (Exception e1)

{

pass12 = false;

System.out.println(e1);

}

}

/*

* public void key() { String before = "asdf"; byte[] plainText =

* before.getBytes("UTF8");

*

* //1步**********************************************************************

* System.out.println("Start generate AES key.");

* //得到一个使用AES算法的KeyGenerator的实例 KeyGenerator keyGen =

* KeyGenerator.getInstance("AES"); //定义密钥长度128位 keyGen.init(128);

* //通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES) Key key = keyGen.generateKey();

* System.out.println("Finish generating AES key."+key);

*

*

* //2步**********************************************************************

* //获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法 Cipher cipher =

* Cipher.getInstance("AES/ECB/PKCS5Padding"); // System.out.println("\n" +

* cipher.getProvider().getInfo());

*

*

* //3步**********************************************************************

* //使用私钥加密 System.out.println("\n用私钥加密...");

* //把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密

* cipher.init(Cipher.ENCRYPT_MODE, key);

*

* //私钥加密类Cipher进行加密,加密后返回一个字节流 byte[] byte[] cipherText =

* cipher.doFinal(plainText);

*

* //以UTF8格式把字节流转化为 String String after1 = new String(cipherText, "UTF8");

* System.out.println("用私钥加密完成:"+after1);

*

*

* //4步**********************************************************************

* //使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥

* System.out.println("\n用私钥解密..."); cipher.init(Cipher.DECRYPT_MODE, key);

*

* //对刚才私钥加密的字节流进行解密,解密后返回一个字节流 byte[] byte[] newPlainText =

* cipher.doFinal(cipherText);

*

* String after2 = new String(newPlainText, "UTF8");

* System.out.println("用私钥解密完成:"+after2); }

*

* public void key1() { String before = "asdf"; byte[] plainText =

* before.getBytes("UTF8");

*

* //产生一个RSA密钥生成器KeyPairGenerator(顾名思义:一对钥匙生成器) KeyPairGenerator keyGen =

* KeyPairGenerator.getInstance("RSA"); //定义密钥长度1024位

* keyGen.initialize(1024); //通过KeyPairGenerator产生密钥,注意:这里的key是一对钥匙!!

* KeyPair key = keyGen.generateKeyPair();

*

* //获得一个RSA的Cipher类,使用公钥加密 Cipher cipher =

* Cipher.getInstance("RSA/ECB/PKCS1Padding"); // System.out.println("\n" +

* cipher.getProvider().getInfo());

*

* System.out.println("\n用公钥加密...");

* //Cipher.ENCRYPT_MODE意思是加密,从一对钥匙中得到公钥key.getPublic()

* cipher.init(Cipher.ENCRYPT_MODE, key.getPublic()); //用公钥进行加密,返回一个字节流

* byte[] cipherText = cipher.doFinal(plainText); //以UTF8格式把字节流转化为 String

* String after1 = new String(cipherText, "UTF8");

* System.out.println("用公钥加密完成:"+after1);

*

*

* //使用私钥解密 System.out.println("\n用私钥解密...");

* //Cipher.DECRYPT_MODE意思是解密,从一对钥匙中得到私钥 key.getPrivate()

* cipher.init(Cipher.DECRYPT_MODE, key.getPrivate()); //用私钥进行解密,返回一个字节流

* byte[] newPlainText = cipher.doFinal(cipherText);

*

* String after2 = new String(newPlainText, "UTF8");

* System.out.println("用私钥解密完成:"+after2); }

*/

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-02-21 14:56

浏览 601

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值