编写一个Java程序,对指定文本进行数字签名(文本随意举例)

作者&投稿:澄屈 (若有异议请与网页底部的电邮联系)
结合密码学的相关知识,用java编写程序开发一个系统实现对文件进行数字签名的功能。~

加密和解密算法可以实现的各种文件格式的文件的内容的加密和解密。整个文档,你可以锁定的全盘加密。许多加密算法,你可以去看看在计算机密码学,对称加密和非对称加密和关键的系统。 Java可以流过的字符,文件流和相应的密钥文件进行加密和解密。具体来说,看看书,我有一个简单的加密算法(对称算法),你可以看一下。
类唯一键加密和解密的类的实现,已发送,注意查收。

public class Demo1 {


public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);
session.setDebug(true);

Message msg = new MimeMessage(session);
msg.setText("邮件测试");
msg.setFrom(new InternetAddress("你的邮箱号"));

Transport transport = session.getTransport();
transport.connect("邮箱驱动", 25, "邮箱账号", "邮箱密码");
transport.sendMessage(msg,
new Address[]{new InternetAddress("对方的邮箱号")});

transport.close();
}

}

一:需要包含的包
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;

二:从文件中读取证书
用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in=new FileInputStream("out.csr");
Certificate c=cf.generateCertificate(in);

String s=c.toString();
三:从密钥库中直接读取证书
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,pass.toCharArray());
java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名

四:JAVA程序中显示证书指定信息
System.out.println("输出证书信息:\n"+c.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程序列出密钥库所有条目
String pass="123456";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,pass.toCharArray());
Enumeration e=ks.aliases();
while(e.hasMoreElements())
java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());

六:JAVA程序修改密钥库口令
String oldpass="123456";
String newpass="654321";
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,oldpass.toCharArray());
in.close();
FileOutputStream output=new FileOutputStream(".keystore");
ks.store(output,newpass.toCharArray());
output.close();

七:JAVA程序修改密钥库条目的口令及添加条目
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
Certificate [] cchain=ks.getCertificate(alias);获取别名对应条目的证书链
PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());获取别名对应条目的私钥
ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密钥库中添加条目
第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链
FileOutputStream output=new FileOutputStream("another");
ks.store(output,storepass.toCharArray())将keystore对象内容写入新文件

八:JAVA程序检验别名和删除条目
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
ks.containsAlias("sage");检验条目是否在密钥库中,存在返回true
ks.deleteEntry("sage");删除别名对应的条目
FileOutputStream output=new FileOutputStream(".keystore");
ks.store(output,storepass.toCharArray())将keystore对象内容写入文件,条目删除成功

九:JAVA程序签发数字证书
(1)从密钥库中读取CA的证书
FileInputStream in=new FileInputStream(".keystore");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in,storepass.toCharArray());
java.security.cert.Certificate c1=ks.getCertificate("caroot");
(2)从密钥库中读取CA的私钥
PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());
(3)从CA的证书中提取签发者的信息
byte[] encod1=c1.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 cf=CertificateFactory.getInstance("X.509");
FileInputStream in2=new FileInputStream("user.csr");
java.security.cert.Certificate c2=cf.generateCertificate(in);
(5)从待签发的证书中提取证书信息
byte [] encod2=c2.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,"MD5WithRSA"); 使用CA私钥对其签名
(11)将新证书写入密钥库
ks.setCertificateEntry("lf_signed",newcert);
FileOutputStream out=new FileOutputStream("newstore");
ks.store(out,"newpass".toCharArray()); 这里是写入了新的密钥库,也可以使用第七条来增加条目

十:数字证书的检验
(1)验证证书的有效期
(a)获取X509Certificate类型对象
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in1=new FileInputStream("aa.crt");
java.security.cert.Certificate c1=cf.generateCertificate(in1);
X509Certificate t=(X509Certificate)c1;
in2.close();
(b)获取日期
Date TimeNow=new Date();
(c)检验有效性
try{
t.checkValidity(TimeNow);
System.out.println("OK");
}catch(CertificateExpiredException e){ //过期
System.out.println("Expired");
System.out.println(e.getMessage());
}catch((CertificateNotYetValidException e){ //尚未生效
System.out.println("Too early");
System.out.println(e.getMessage());}
(2)验证证书签名的有效性
(a)获取CA证书
CertificateFactory cf=CertificateFactory.getInstance("X.509");
FileInputStream in2=new FileInputStream("caroot.crt");
java.security.cert.Certificate cac=cf.generateCertificate(in2);
in2.close();
(c)获取CA的公钥
PublicKey pbk=cac.getPublicKey();
(b)获取待检验的证书(上步已经获取了,就是C1)
(c)检验证书
boolean pass=false;
try{
c1.verify(pbk);
pass=true;
}catch(Exception e){
pass=false;
System.out.println(e);
}


用JAVA编写一个程序,要求如下:
}public double getEnglish() {return english;}public void setEnglish(double english) {this.english = english;}} --- StudentTest类:(测试类)import java.util.Scanner;public class StudentTest {public static void main(String[] args) {Student student = new Student();Scanner sc = ne...

写一个JAVA小程序。
package test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;public class TSceen {private static Integer getInt() {Integer i = null;Scanner scanner = new Scanner(System.in);System.out.println("请输入整数长度不多于5位");while (i...

用java编写一个统计投票结果程序
先定义一个学生的对象,里面有名字,和票数两个属性,再定义一个排序函数,返回值为数组,就是取得三个数的数组,打印输出,或者可以自己想一个更加面向对象的结构实现,在简单问题上多用面向对象去思考问题 。import java.util.Scanner;public class Test { public static void main(String args[]) {...

编写一个Java的程序?
通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹出对话框:图1 新建项目 填入项目名称,点击“完成”,创建项目成功,可以看到在 E:\\java\\workspace 目录下多出了一个Demo文件夹。在菜单中选择“文件 --> 新建 --> 类”,弹出对话框:图2 创建类 输入类...

1、 编写一个输出“欢迎来到java编程世界”的程序,用两种方式实现(Applic...
;JLabel label = new JLabel("欢迎来到java编程世界");panel.add(label);JButton okButton = new JButton("OK");panel.add(okButton);con.add(panel);} } 把源文件编译成class文件,再创建一个HTML文件,代码如下:

用java实现一个模拟操作系统内核运行的程序。(1)进程控制:其中包括进程...
在编写Java程序时,有时候需要在Java程序中执行另外一个程序。 1、启动程序Java提供了两种方法用来启动其它程序: (1)使用Runtime的exec()方法 (2)使用ProcessBuilder的start()方法 不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就程序操作系统的一个进程,进程在执行的时候有自己的环境变量、有自己...

用Java编写一个程序
public Map<String,Integer> getCharacterNum(String str){ \/\/封装一个Map,key为String类型,value为字母数,其中key为UpperChar的value存大写字母 数 \/\/ key 为NumberChar的value存放数字 \/\/key为LowerChar的value存放小写字母数,key为OtherChar的value存放非英文字母数 Map<String,Integer> map...

用java语言编写程序,任意输入一个字符串,从最后一个字符开始倒序输出他...
编写程序例题 c语言 汇编语言 机器语言 其他类似问题2014-10-18 用Java写一个程序,输入一个字符串,倒序输出 9 2012-07-28 用java编写一段程序,输入一段字符串,然后输出该字符串的倒... 7 2014-10-18 输入一个字符串,将其倒序输出,用Java编程实现 3 2009-09-23 用java编写程序,使一段字符串输...

编写一个java程序
import java.util.*;class Tester{ public static void main (String[] args) { int[][] arr = new int[5][5]; \/\/ 赋值 for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ arr[i][j] = (int)(Math.random() * 100); } }...

编写一个java应用程序
public class Composit { \/ 插入排序法,把无序数组里的一个数插入有序数组中 即插入前半截有序序列。\/ public void insertSort(int a[]){ for(int i=1;i=0 && insertVal<a[index]){ \/\/将插入位的数后移 a[index+1]=a[index];\/\/坐标迁移 index--;} \/\/插入到合适位置 a[index+1]...

海宁市13848563992: 用java编写一个应用程序,读取一个文本的内容. -
祗泰特普: import java.io.*; public class Input {5261public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("D:/abc.txt"); //把字4102符输入流1653转换成字节流,并且版套上缓权冲流管子 BufferedReader buf = ...

海宁市13848563992: java读取指定的文本文件,加密后写入另一个文件. -
祗泰特普: 按照你的要求编写简单加密(把每个英文字母向后移动3个字母)的Java程序如下:import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public class CA { public static ...

海宁市13848563992: 编写一个Java程序,对指定文本进行数字签名(文本随意举例) -
祗泰特普: 一:需要包含的包 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; 二:从文件中读取...

海宁市13848563992: 用java编写一个打开指定文件的程序 -
祗泰特普: 运行以下代码试试看. public static void main(String[] args) { Frame frame = new Frame("打开文件窗口"); frame.setLayout(new FlowLayout(FlowLayout.CENTER)); frame.setBounds(100, 200, 400, 300); frame.addWindowListener(new ...

海宁市13848563992: 在JAVA中如何①利用字符流读写一个指定文本文件.②利用读写器类实现对指定文本的读写. -
祗泰特普: import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter;public class ReaderAndWriter { /**** @param path ...

海宁市13848563992: 怎么用JAVA程序从一个TXT文件中按指定行读取内容? -
祗泰特普: 基本结构如下,楼主可参考一下:try{ pwd=System.getProperty("user.dir");//获取当前目录 FileReader fr = new FileReader(pwd + "\\1.txt"); BufferedReader br = new BufferedReader(fr); String Line = br.readLine(); while (Line != null) { System.out.println(Line); Line = br.readLine(); } br.close(); fr.close(); }catch(IOException ex){}

海宁市13848563992: 编写一个Java应用程序,该程序读取从键盘输入的一行文本并将其存储到文件aaa.txt中 -
祗泰特普: import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class OutputA { public static void main(String [] args){ 度Scanner sc=new Scanner(System.in); String s=sc.nextLine(); System.out....

海宁市13848563992: java编写:给定一个英文文本文件,进行切词并统计其中单词个数,存入一个文件中. -
祗泰特普: import java.util.arrays; public class test { /** * @param args */ public static void main(string[] args) { // todo auto-generated method stub system.out.println(func("silent", "listen")); system.out.println(func("", "")); } public static boolean func(...

海宁市13848563992: 编写一个Java程序,打开一个文本文件,一次读取其内的一行文本.令每一行形成以String,并将读出的String对 -
祗泰特普: public class Input{public void input(){BufferedReader reader=new BufferedReader(new FileReader(new File('文件路径'))); while(true){String s=reader.readLine();//读一行if(s=null){break; } }} }其中的try/catch我就不写了

海宁市13848563992: java文本文件的读写编程 -
祗泰特普: import java.util.Scanner; import java.io.*; class MyFile { MyFile(String d) { this.d=d; } void write(String path,String datafile) { File f=new File(this.d); StringBuilder sb=new StringBuilder(); String savepath; String[] strs; BufferedOutputStream bos; byte[] ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网