JAVA数字签名
一、网数据安全包括数据的本身的安全性、数据的完络络络络络络络络络络络络络络络络络络络络络
整性,防止改,、数据来源的不可否性等要素。数据络络络络络络络络络络络络络络络络络络络络络采用加密算法加密可以保数据本身的安全性,利用消息摘要络络络络络络络络络络络络络络络络可以保数据的完整性,但是有一点就是数据来源的不络络络络络络络络络络络络络络络络络络络络络络
可否性,也就是数据来自哪里接收者是清楚的,而且送数据者不可抵,。络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络
有些方案曾使用消息,络络络络络络络络络MAC络络络络络络络络络络络,来保数据来源于合法的送着,但是利用消息会来一个,就是通双方必事先定络络络络络络络络络络络络络络络络络络络络络络络两者之的通用共享密。在我的互网如此大的今天,络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络然是不合适的,而数字名可以解决我的个。数字名
,通常的数字名,的基是公密体系,例如:络络络络络络络络络络络络络络络络络RSA络络络络络络络,。送者有独一无二的公和私,公是公的,私秘密保留。送者利用络络络络络络络络络络络络络络络络络络络络络络络络私数据的消息摘要行数字名,接收者利用送者络络络络络络络络络络络络络络络络络络络络络络络络
的公来数字名,其就是把加密程倒来使用。由络络络络络络络络络络络络络络络络络络络络络络络络络络于送者的私是独一无二的,而且是秘密的,因此当络络络络络络络络络络络络络络络络络络络络络络络
能解数字名的数字摘要是正确的后,那我就可络络络络络络络络络络络络络络络络络络络络络络络络络络
以肯定送者的身份了,就是数字名的基本原理。络络络络络络络络络络络络络络络络络络络络络
络络络络络络络络络络络络络络络络络络络络络络络什要用消息摘要呢,原因是的,由于公加密
算法加解密的速度慢,整个数据行加密肯定是行不通的,络络络络络络络络络络络络络络络络络络络而消息摘要有个好就是短而且度固定,就象数据的指一,所以摘要行名。络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络 二、数字字的原理:签签签签签签
络络络络络络络络络络络络络络络络络络络络络络在数字名用中,首先由送者身份生成它的私和公
络络络络络络络络络络络络络络络络络络络络络络,然后由送者通私把数据加密后,并将加密后的数
据送接收者,接收者把送者加密的数据通送者的共行名。络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络三、例子明:签签签
络络络络络络络络络在我就入正了。JAVA络络络络络络的数字名封装在Signature络
,java.security.Signature络络络络络络络络络络,中。接下来,写三个功能,即三个Java络,:
a络络络络络络络络络络络络络络络络络络络络络络、生成一密,即私和公,于密的保存可以使用
络络络络络络络络象流的方式行保存和送, 络络络络络络络络络络络络络也可以使用的方式保存,在里基于方便,我是使用方式行保存的,络络络络络络络络络络
签名是:GenerateKeyPair.java
b络络络络络络络络络络络络络络络络络络络络络络、写送者的功能:首先通私加密待出数据Data络络,并出Data络络络络和名后的Data ,
签名是:SignatureData.java
c络络络络络络络络络络络络络络络络络络络络络络络络络络络、写接收者的功能:使用送者的公来送来的加密Data络络络,判断名的合法性,
签名是:VerifySignature.java
四、生成一密,即私和公,于密的保存可以使用签签签签签签签签签签签签签签签签签签签签签签签
象流的方式行保存和送签签签签签签签,签签签签签签签签签签签签签也可以使用的方式保存,在里基于
方便,我是使用方式行保存的,名是:签签签签签签签签签签签签签签GenerateKeyPair.java:import java.security.KeyPair;
import java.security.PrivateKey;import java.security.PublicKey;
import java.security.SecureRandom;public class GenerateKeyPair {
private String priKey;
private String pubKey;
public void run() {
try {
java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator
.getInstance("RSA");
SecureRandom secrand = new SecureRandom();secrand.setSeed("21cn".getBytes()); // 初始化随机生器络络络
keygen.initialize(1024, secrand);KeyPair keys = keygen.genKeyPair();PublicKey pubkey = keys.getPublic();PrivateKey prikey = keys.getPrivate();pubKey = bytesToHexStr(pubkey.getEncoded()); priKey = bytesToHexStr(prikey.getEncoded());System.out.println("pubKey=" + pubKey);System.out.println("priKey=" + priKey);System.out.println("写入象络络 pubkeys ok");
System.out.println("生成密成功络络络络");
} catch (java.lang.Exception e) {e.printStackTrace();
System.out.println("生成密失络络络络");
}
;
}
/**
* Transform the specified byte into a Hex String form.
*/
public static final String bytesToHexStr(byte[] bcd) {
StringBuffer s = new StringBuffer(bcd.length * 2);
for (int i = 0; i < bcd.length; i++) {s.append(bcdLookup[(bcd[i] >>> 4) & 0x0f]);s.append(bcdLookup[bcd[i] & 0x0f]);}
return s.toString();
}
/**
* Transform the specified Hex String into a byte array.*/
public static final byte[] hexStrToBytes(String s) {byte[] bytes;
bytes = new byte[s.length() / 2];
for (int i = 0; i < bytes.length; i++) {bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),
16);
}
return bytes;
}
private static final char[] bcdLookup = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/**
* @param args
*/
public static void main(String[] args) {// TODO Auto-generated method stub
GenerateKeyPair n = new GenerateKeyPair();n.run();
}
五、写送者的功能:首先通私加密待出数据签签签签签签签签签签签签签签签签签签签签签签Data签签,并出Data签签签签和名后的
Data签签签签,名是:SignatureData.java
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;public class SignatureData {
public void run() {
try {
String prikeyvalue = "30820277020100300d";//络是GenerateKeyPair络络络络出的私
PKCS8EncodedKeySpec priPKCS8=new
PKCS8EncodedKeySpec(hexStrToBytes(prikeyvalue)); KeyFactory keyf=KeyFactory.getInstance("RSA");PrivateKey myprikey=keyf.generatePrivate(priPKCS8);String myinfo = "orderId=10dkfadsfksdkssdkd&amount=80&orderTime=20060509"; // 要络名的信息
// 用私信息生成数字名络络络络络络络络络络
java.security.Signature signet = java.security.Signature
.getInstance("MD5withRSA");
signet.initSign(myprikey);
signet.update(myinfo.getBytes("ISO-8859-1"));byte[] signed = signet.sign(); // 络络络信息的数字名
System.out.println("signed(络名内容)原络=" + bytesToHexStr(signed));System.out.println("info,原,络络=" + myinfo);
System.out.println("络名并生成文件成功");
} catch (java.lang.Exception e) {
e.printStackTrace();
System.out.println("络络名并生成文件失");
}
;
}
/**
* Transform the specified byte into a Hex String form.*/
public static final String bytesToHexStr(byte[] bcd) {StringBuffer s = new StringBuffer(bcd.length * 2);for (int i = 0; i < bcd.length; i++) {
s.append(bcdLookup[(bcd[i] >>> 4) & 0x0f]);
s.append(bcdLookup[bcd[i] & 0x0f]);
}
return s.toString();
}
/**
* Transform the specified Hex String into a byte array.*/
public static final byte[] hexStrToBytes(String s) {byte[] bytes;
bytes = new byte[s.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),16);
}
return bytes;
}
private static final char[] bcdLookup = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SignatureData s = new SignatureData();
s.run();
}
六、写接收者的功能:使用送者的公来送来的加密签签签签签签签签签签签签签签签签签签签签签签签签签签签Data签签签,判断名的
合法性,名是:签签签签VerifySignature.java
package com._21cn.cryptto;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;public class VerifySignature {
public void run1() {
try {
String pubkeyvalue = "30819f300d06092a864886f70d01010105";X509EncodedKeySpec bobPubKeySpec =
new X509EncodedKeySpec(hexStrToBytes(pubkeyvalue));KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);String info = "orderId=10dkfadsfksdkssdkd&amount=80&orderTime=20060519";
byte[] signed = hexStrToBytes("2292e02ba6bf6f1b1688a6fa2"); java.security.Signature signetcheck=java.security.Signature.getInstance("MD5withRSA");
signetcheck.initVerify(pubKey);
signetcheck.update(info.getBytes());
if (signetcheck.verify(signed)) {
System.out.println("info=" + info);System.out.println("络名正常");
}
else System.out.println("非名正常络络络络");
}
catch (java.lang.Exception e) {e.printStackTrace();}
}
其他,字签名和字加密的#工作
#比签数数与
数字名签签是使用了公加密技并用于数字信息的
。络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络地,数字名是附加在数据元上的一些数据,或
是数据元所作的密。数据或允数据元的络络络络络络络络络络络络络络络络络络络络络络络络络络络接收者用以确数据元的来源和数据元的完整性并保络络络络络络络络络络络络络络络络络络络络数据,防止被他人行造。它是子形式的消息行名的络络络络络络络络络络络络络络络络络络络络一方法,一个名消息能在一个通信网中。络络络络络络络络络络络络络络络络络络络络络络
数字名签签主要以下几个程:络络络络络络络络络
1、信息送者使用一向散列
,络络络络络络络络络络络络络HASH 函数,信息生成信息摘要,络络络络络络络络络络2、信息送者使用自己的私名信息摘要,络络络络络络络络络络络络络络络络络
3、信息送者把信息本身和已名的信息摘要一起送出去,络络络络络络络络络络络络络络络络络络络络络络络络4、信息接收者通使用与信息送者使用的同一个向散列函数,络络络络络络络络络络络络络络络络络络络络络络HASH 函数,络接收的信息本身生成新的信息摘要,再使用信息送者的公信息摘要络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络行,以确信息送者的身份和信息是否被修改。
数字加密是利用数学算法将明文不可能理解的密文或反来络络络络络络络络络络络络络络络将密文可理解形式的明文的方法、手段和理的一络络络络络络络络络络络络络络络络络络络络络络
络络络络络络络络络络络络络科学。利用数字加密可以将敏感信息加密并通一并不安全的途径,只有指定的收件人才能解原始信息。络络络络络络
要完成数字加密需要一加密算法和一个密。加密算法其就是一络络络络络络络络络络络络络络络络络络络络络数学函数,用来完成加密和解密运算。而密由数字、字母成,用它来络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络密文的加密或密文的解密。相同的明文用不同的密加密得到不同的密文。数字加密的安全性取决于加密算法的度和密的保密性。强络络络络络络数字加密主要以下几个程:络络络络络络络络络
1、当信息送者需要送信息,首先生成一个称密,络络络络络络络络络络络络络络络络络络络络络用称密加密要送的文,络络络络络络络络络络络络络络
2、信息送者用信息接收者的公加密上述称密,络络络络络络络络络络络络络络络络络络络络络
3、信息送者将第一络络络络络络络络络络络络络络络络络络络络络络络络络络络络和第二的果合在一起信息接收者,称数字信封,步步4、信息接收者使用自己的私解密被加密的称密,再用此络络络络络络络络络络络络络络络络称密解密被送方加密的密文,得到真正的原文。络络络络络络络络络络络络络络络络络络络络络
数字名和数字加密签签签签签签签的程然都使用公密体系,但的络络络络络络络络络络络络络络络络络络络程正好相反,使用的密也不同。数字名使用的是送方的络络络络络络络络络络络络络络络络络络密,送方用自己的私有密行加密,接收方用络络络络络络络络络络络络络络络络络络络络络络络络
送方的公密行解密,是一个一多的系,任何有络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络送方公密的人都可以数字名的正确性。数字加
密使用的是接收方的密,是多一的系,任何络络络络络络络络络络络络络络络络络络络络络络络络
知道接收方公密的人都可以向接收方送加密信息,络络络络络络络络络络络络络络络络络络络只有唯一有接收方私有密的人才能信息解密。另外络络络络络络络络络络络络络络络络络络络络络数字名只采用了非称密加密算法,它能保送信络络络络络络络络络络络络络络络络络络络络络络络
息的完整性、身份和不可否性,而数字加密采用了称络络络络络络络络络络络络络络络络络络络密加密算法和非称密加密算法相合的方法,它能保送信息保密性络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络络
数字加密
x