One: Message Digest
At first , I show you the code like:
/**
*
*/
package MyMessageDigest;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author daniel
* 演示消息摘要的Java实现,其原理是通过比对摘要信息来判断原始传输信息没有被修改。
* 即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。
*/
public class MessageDigestDemo {
/**
* @param args
*/
public static void main(String[] args) {
MessageDigestDemo my= new MessageDigestDemo();
my.testDigest();
}
public void testDigest()
{
try {
String myinfo= "Daniel的测试信息";
//MessageDigest alg=MessageDigest.getInstance("MD5");
MessageDigest alga=MessageDigest.getInstance( "SHA-1");
alga.update(myinfo.getBytes());
byte[] digesta=alga.digest();
System.out.println( "本信息摘要是:"+byte2hex(digesta));
//通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
MessageDigest algb=MessageDigest.getInstance( "SHA-1");
algb.update(myinfo.getBytes());
if (algb.isEqual(digesta,algb.digest())) {
System.out.println( "信息检查正常");
}
else
{
System.out.println( "摘要不相同");
}
}
catch (NoSuchAlgorithmException ex) {
System.out.println( "非法摘要算法");
}
}
public String byte2hex( byte[] b) //二行制转字符串
{
String hs="";
String stmp="";
for ( int n=0;n<b.length;n++)
{
stmp=(Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+ "0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+ ":";
}
return hs.toUpperCase();
}
/**
* 相关资料:
* 一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印
* (对于SHA1是产生一个20字节的二进制数组)。
* 消息摘要有两个基本属性:
* 两个不同的报文难以生成相同的摘要
* 以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
* 代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5
*/
}
*
*/
package MyMessageDigest;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author daniel
* 演示消息摘要的Java实现,其原理是通过比对摘要信息来判断原始传输信息没有被修改。
* 即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。
*/
public class MessageDigestDemo {
/**
* @param args
*/
public static void main(String[] args) {
MessageDigestDemo my= new MessageDigestDemo();
my.testDigest();
}
public void testDigest()
{
try {
String myinfo= "Daniel的测试信息";
//MessageDigest alg=MessageDigest.getInstance("MD5");
MessageDigest alga=MessageDigest.getInstance( "SHA-1");
alga.update(myinfo.getBytes());
byte[] digesta=alga.digest();
System.out.println( "本信息摘要是:"+byte2hex(digesta));
//通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
MessageDigest algb=MessageDigest.getInstance( "SHA-1");
algb.update(myinfo.getBytes());
if (algb.isEqual(digesta,algb.digest())) {
System.out.println( "信息检查正常");
}
else
{
System.out.println( "摘要不相同");
}
}
catch (NoSuchAlgorithmException ex) {
System.out.println( "非法摘要算法");
}
}
public String byte2hex( byte[] b) //二行制转字符串
{
String hs="";
String stmp="";
for ( int n=0;n<b.length;n++)
{
stmp=(Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+ "0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+ ":";
}
return hs.toUpperCase();
}
/**
* 相关资料:
* 一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印
* (对于SHA1是产生一个20字节的二进制数组)。
* 消息摘要有两个基本属性:
* 两个不同的报文难以生成相同的摘要
* 以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
* 代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5
*/
}
Then, follow me, I will say at api using view, the main steps to implement this simple message digest are:
1.Set the encryption algorithm of MessageDigest class, like "SHA-1","MD5" etc.
2.Add the message for digest.
3.Send this messagedigest to others pepole
4.In his side, he can check in same way like you digest, if they are same, is to say message not be modified by somebody.
Two: Digital Signature
Show code:
/**
*
*/
package MyDSA;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
/**
* @author daniel
* 演示数字签名
* 1.首先要生成一个用户甲某的密钥对,并且分别保存
* 2.取出私钥进行数字签名并写入文件系统
* 3.把甲某的公钥信息及签名发给其它用户
* 4.乙某接受到甲某的信息及公钥后,进行验证操作
*/
public class MyDSA {
/**
* @param args
*/
public static void main(String[] args) {
MyDSA demo = new MyDSA();
// 1.首先要生成一个用户甲某的密钥对,并且分别保存
demo.CreateKeyPairs();
// 2.取出私钥进行数字签名并写入文件系统
demo.SignAnUserMessageByPrikey();
// 3.把甲某的公钥信息及签名发给其它用户
// 4.乙某接受到甲某的信息及公钥后,进行验证操作
demo.CheckMessageWhenOtherPersionReceviced();
}
/**
* 4.乙某接受到甲某的信息及公钥后,进行验证操作
*/
public void CheckMessageWhenOtherPersionReceviced() {
try {
// 4.1 取出公钥
ObjectInputStream in = new ObjectInputStream( new FileInputStream(
"mypubkey.dat"));
PublicKey pubkey = (PublicKey) in.readObject();
in.close();
// 4.2读取签名和信息
in = new ObjectInputStream( new FileInputStream( "myinfo.dat"));
String info = (String) in.readObject();
byte[] signed = ( byte[]) in.readObject();
in.close();
// 4.3开始验证
Signature signetcheck = Signature.getInstance( "DSA");
signetcheck.initVerify(pubkey); // 初始化此用于验证的对象。
signetcheck.update(info.getBytes()); // 使用指定的 byte 数组更新要签名或验证的数据。
// 4.4验证结果(验证传入的签名)
if (signetcheck.verify(signed)) {
System.out.println( "签名正常!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 2.取出私钥进行数字签名并写入文件系统
*/
public void SignAnUserMessageByPrikey() {
String myinfo = "Daniel的测试信息";
try {
// 2.1取出私钥
ObjectInputStream in = new ObjectInputStream( new FileInputStream(
"myprikey.dat"));
PrivateKey myprikey = (PrivateKey) in.readObject();
in.close();
// 2.2对一个信息进行私钥签名
Signature signature = Signature.getInstance( "DSA");
signature.initSign(myprikey);
signature.update(myinfo.getBytes());
byte[] signed = signature.sign();
// 2.3把信息和签名保存到文件myinfo.dat
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream( "myinfo.dat"));
out.writeObject(myinfo);
out.writeObject(signed);
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 1.生成密钥对,并且分别保存
*/
public void CreateKeyPairs() {
try {
// 1.1采用DSA 算法
KeyPairGenerator keygen = KeyPairGenerator.getInstance( "DSA");
// 1.2使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。
SecureRandom srand = new SecureRandom();
// 初始化随机产生器,设置种子
srand.setSeed( "randbean".getBytes());
// 初始化密钥生成器
keygen.initialize(512, srand);
// 1.3生成密钥pubkey和prikey
KeyPair keys = keygen.generateKeyPair(); // 生产密钥租
PublicKey pubkey = keys.getPublic(); // 获取公钥
PrivateKey prikey = keys.getPrivate(); // 私钥
// 1.4保存该密钥对到文件系统
// 1.4.1 私钥
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream( "myprikey.dat"));
out.writeObject(prikey);
out.close();
// 1.4.2 公钥
out = new ObjectOutputStream( new FileOutputStream( "mypubkey.dat"));
out.writeObject(pubkey);
out.close();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
*
*/
package MyDSA;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
/**
* @author daniel
* 演示数字签名
* 1.首先要生成一个用户甲某的密钥对,并且分别保存
* 2.取出私钥进行数字签名并写入文件系统
* 3.把甲某的公钥信息及签名发给其它用户
* 4.乙某接受到甲某的信息及公钥后,进行验证操作
*/
public class MyDSA {
/**
* @param args
*/
public static void main(String[] args) {
MyDSA demo = new MyDSA();
// 1.首先要生成一个用户甲某的密钥对,并且分别保存
demo.CreateKeyPairs();
// 2.取出私钥进行数字签名并写入文件系统
demo.SignAnUserMessageByPrikey();
// 3.把甲某的公钥信息及签名发给其它用户
// 4.乙某接受到甲某的信息及公钥后,进行验证操作
demo.CheckMessageWhenOtherPersionReceviced();
}
/**
* 4.乙某接受到甲某的信息及公钥后,进行验证操作
*/
public void CheckMessageWhenOtherPersionReceviced() {
try {
// 4.1 取出公钥
ObjectInputStream in = new ObjectInputStream( new FileInputStream(
"mypubkey.dat"));
PublicKey pubkey = (PublicKey) in.readObject();
in.close();
// 4.2读取签名和信息
in = new ObjectInputStream( new FileInputStream( "myinfo.dat"));
String info = (String) in.readObject();
byte[] signed = ( byte[]) in.readObject();
in.close();
// 4.3开始验证
Signature signetcheck = Signature.getInstance( "DSA");
signetcheck.initVerify(pubkey); // 初始化此用于验证的对象。
signetcheck.update(info.getBytes()); // 使用指定的 byte 数组更新要签名或验证的数据。
// 4.4验证结果(验证传入的签名)
if (signetcheck.verify(signed)) {
System.out.println( "签名正常!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 2.取出私钥进行数字签名并写入文件系统
*/
public void SignAnUserMessageByPrikey() {
String myinfo = "Daniel的测试信息";
try {
// 2.1取出私钥
ObjectInputStream in = new ObjectInputStream( new FileInputStream(
"myprikey.dat"));
PrivateKey myprikey = (PrivateKey) in.readObject();
in.close();
// 2.2对一个信息进行私钥签名
Signature signature = Signature.getInstance( "DSA");
signature.initSign(myprikey);
signature.update(myinfo.getBytes());
byte[] signed = signature.sign();
// 2.3把信息和签名保存到文件myinfo.dat
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream( "myinfo.dat"));
out.writeObject(myinfo);
out.writeObject(signed);
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 1.生成密钥对,并且分别保存
*/
public void CreateKeyPairs() {
try {
// 1.1采用DSA 算法
KeyPairGenerator keygen = KeyPairGenerator.getInstance( "DSA");
// 1.2使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。
SecureRandom srand = new SecureRandom();
// 初始化随机产生器,设置种子
srand.setSeed( "randbean".getBytes());
// 初始化密钥生成器
keygen.initialize(512, srand);
// 1.3生成密钥pubkey和prikey
KeyPair keys = keygen.generateKeyPair(); // 生产密钥租
PublicKey pubkey = keys.getPublic(); // 获取公钥
PrivateKey prikey = keys.getPrivate(); // 私钥
// 1.4保存该密钥对到文件系统
// 1.4.1 私钥
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream( "myprikey.dat"));
out.writeObject(prikey);
out.close();
// 1.4.2 公钥
out = new ObjectOutputStream( new FileOutputStream( "mypubkey.dat"));
out.writeObject(pubkey);
out.close();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
本文转自danni505 51CTO博客,原文链接:http://blog.51cto.com/danni505/152694,如需转载请自行联系原作者