📄 certreq.java
字号:
package data;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import java.io.*;
import data.MyWindowListener;
import java.sql.*;
import data.Connect;
import data.BASE64Encoder;
import data.CertReqInfo;
import data.Base64;
import java.math.*;
import sun.security.pkcs.*;
import sun.security.x509.*;
import java.security.cert.*;
//该类从CertReqInfo实例得到用户的信息byte[] myinfo,
//首先用BASE64对用户信息编码。生成证书请求文件CertReq.txt
//用SHA-1算法计算摘要信息digestMD,生成digestMD(数字摘要).dat
//从数据库AdminData读取管理员的密钥,对摘要信息进行数字签名,生成Signature.dat
//生成用户自签发的证书User.cer
public class CertReq
{
X509Key pbkey;
RSAPrivateKey prkey,adminprkey;
RSAPublicKey adminpbkey;
BASE64Encoder BE=new BASE64Encoder();
Base64 DE=new Base64();
String plaintext,query;
byte[] digestMD,b_pbk,b_prk;
byte[] signeddata,myinfo;
String s_pbk,s_prk,cryptotext;
CertAndKeyGen cak;
File file1=new File("temp_pbk.dat");
File file2=new File("temp_prk.dat");
public CertReq(String MyID)
{
//获取用户信息
CertReqInfo cri=new CertReqInfo(MyID);
plaintext="CN="+cri.UN //UserName
+",C="+cri.N //Nation
+",L="+cri.C //City
+",OU="+cri.U //Unit
+",O="+cri.O //Orgnization
+",ST="+cri.ID; //IDCard
System.out.println(plaintext);
//生成用户的公钥和私钥,其中公钥邦定到申请文件中
try{
cak = new CertAndKeyGen("RSA","MD5WithRSA");
//genkeys
cak.generate(1024);
prkey=(RSAPrivateKey)cak.getPrivateKey();
pbkey=cak.getPublicKey();
//密钥存入数据库**********************
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
ObjectOutputStream oos1 = new ObjectOutputStream(baos1);
oos1.writeObject(prkey);
oos1.close();
b_prk=baos1.toByteArray();
baos1.close();
s_prk=BE.encode(b_prk);
System.out.println("您的私钥\n"+s_prk);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos2);
oos2.writeObject(pbkey);
oos2.close();
b_pbk=baos2.toByteArray();
baos2.close();
s_pbk=BE.encode(b_pbk);
System.out.println("您的公钥:\n"+s_pbk);
try{
Connect conn=new Connect();
Statement stmt=conn.con.createStatement();
query = "insert into UserKey(UserID,AlgorithmNumber,UserPublicKey,"
+"UserPrivateKey) values ('"
+MyID+"','RSA','"+s_pbk+"','"+s_prk+"')";
stmt.executeUpdate(query);
System.out.println("Insert Suceed!");
System.out.println("您的密钥对已经进入数据库!");
System.out.println("您的公钥是\n"+s_pbk+"\n您的密钥是\n"+s_prk);
stmt.close();
conn.con.close();
}catch(SQLException se)
{
String mm;
mm="数据库执行错误:"+se.getMessage();
System.out.println(mm);
}
//用户主体信息
X500Name subject = new X500Name(plaintext);
X509Certificate certificate = cak.getSelfCertificate(subject,10);
FileOutputStream fos = new FileOutputStream(new File("User.cer"));
fos.write(certificate.getEncoded());
fos.close();
//对用户信息进行BASE64编码
PKCS10 tmp=cak.getCertRequest(subject);
//tmp转换成为字节流
myinfo=tmp.getEncoded();
cryptotext=BE.encode(myinfo);
System.out.println("cryptotext"+cryptotext);
}catch(Exception e){
System.out.println("不能产生密钥对!");
}
//生成PKCS#10标准的证书请求文件CSR**********
try{
FileWriter fw=new FileWriter("CertReq.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("-----BEGIN CERTIFICATE REQUEST-----");
bw.newLine();
bw.write(cryptotext);
bw.newLine();
bw.write("-----END CERTIFICATE REQUEST-------");
bw.flush();
fw.close();
}catch(IOException i)
{
System.out.println("IOException!");
return;
}
//对用户的信息用SHA-1算法计算摘要信息digestMD
try{
MessageDigest MD=MessageDigest.getInstance("SHA-1");
MD.update(myinfo);//add digested info
digestMD=MD.digest();//compute the message digest
String result="";
for(int i=0;i<digestMD.length;i++)
{
result+=Integer.toHexString((0x000000ff &digestMD[i])|0xffffff00).substring(6);
}
System.out.println(result);
/* try{
FileOutputStream f = new FileOutputStream("digestMD(数字摘要).dat");
f.write(digestMD);
}
catch(IOException i)
{
System.out.println("IOException!");
return;
}
*/
}
catch(NoSuchAlgorithmException e)
{
System.out.println("NoSuchAlgorithmException!");
return;
}
//用RAadmin的私钥加密用户信息摘要byte[] digestMD(数字签名)
String query;
try{
Connect conn=new Connect();
Statement stmt=conn.con.createStatement();
query="select * from AdminData where AdminID=1";
ResultSet rs=stmt.executeQuery(query);
int result=0;
while(rs.next())
{
result++;
try{
s_pbk=rs.getString(3);
byte[] b_pbk =DE.decode(s_pbk.getBytes());
FileOutputStream f_pbk = new FileOutputStream(file1);
f_pbk.write(b_pbk);
System.out.println(b_pbk.toString());
s_prk=rs.getString(4);
byte[] b_prk =DE.decode(s_prk.getBytes());
System.out.println(b_prk.toString());
FileOutputStream f_prk = new FileOutputStream(file2);
f_prk.write(b_prk);
}catch(IOException i){
System.out.println("临时文件创建错误!");
}
}
if(result==0)/*****测试临时文件读入,跳过数据库,==->!=******/
{
System.out.println("管理员还没有密钥对进行签名,请管理员先生成自己密钥对!");
AdminGenKey two=new AdminGenKey();
two.setBounds(400,360,240,130);
}
else
{
//将读出的管理员密钥字符串转换成RSAPublicKey/RSAPrivateKey结构
try{
ObjectInputStream o_pbkey=
new ObjectInputStream(new FileInputStream(file1));
try{
adminpbkey=(RSAPublicKey)o_pbkey.readObject();
System.out.println(adminpbkey+"\n");
}catch(ClassNotFoundException cnfe){
System.out.println("ClassNotFoundException!");
}
ObjectInputStream o_prkey=
new ObjectInputStream(new FileInputStream(file2));
try{adminprkey=(RSAPrivateKey)o_prkey.readObject();
System.out.println(adminprkey+"\n");
}catch(ClassNotFoundException c2){
System.out.println("ClassNotFoundException!");
}
//删除临时文件
try {
if(file1.exists()&&file2.exists()&&file1.delete()&&file2.delete())
{
System.out.println("文件存在,已删除!");
}
else
{
System.out.println("文件不存在!");
}
}catch(Exception g){
System.out.println("删除临时文件错误!");
}
}
catch(IOException o){
System.out.println("临时文件读取错误!");
}
stmt.close();
conn.con.close();
//计算管理员的签名(用管理员的私钥加密数字摘要信息)
try{
Signature s=Signature.getInstance("MD5WithRSA");
s.initSign(adminprkey);
s.update(digestMD);
signeddata=s.sign();
}
catch(Exception ae){
System.out.println("Something wrong!");
}
//打印签名
System.out.println("\n");
try{
ObjectOutputStream o_signed=
new ObjectOutputStream(new FileOutputStream("Signature.dat"));
o_signed.writeObject(signeddata);
o_signed.close();
System.out.println("IO finished!");
}
catch(IOException ie)
{
System.out.println("IO Wrong!");
}
}
}
catch(SQLException ie)
{
String mm;
mm="数据库执行错误:"+ie.getMessage();
System.out.println("SQLException:"+ie.toString());
}
}
/* public static void main(String args[]) throws Exception
{
CertReq cr=new CertReq("31060516");
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -