消息摘要输出证书

Posted jiminluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息摘要输出证书相关的知识,希望对你有一定的参考价值。

package com.gxnu.study.zip;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import org.junit.Test;

public class MD5Ex {
@Test
public void testMD5() throws NoSuchAlgorithmException, IOException{
MessageDigest md = MessageDigest.getInstance("SHA-256");//MD5,SHA-256,SHA-1 创建信息摘要实例算法SHA-256
byte arr[] = Files.readAllBytes(Paths.get("e:","b.ser"));//读取文件到arr数组中
md.update(arr);//使用特定字节arr更新摘要
byte[] result = md.digest();//通过执行填充等最终操作来完成哈希计算
StringBuilder res = new StringBuilder();//多线程不安全
for(byte by:result){
String str = Integer.toHexString(by);//by转为16进制
res.append(str);//追加到res中
}
System.out.println(res);//输出证书

}

@Test
public void testcomplexMD5(){
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-256");//创建信息摘要实例算法SHA-256
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//MD5,SHA-256,SHA-1
try(
InputStream is = new FileInputStream("e:/b.ser");//文件读到is中
){
byte[] arr = new byte[4];
int len = -1;
while((len=is.read(arr))>0){
md.update(arr, 0, len);//使用特定字节arr更新摘要
System.out.println(new String(arr,0,len));//追加到res中
}
}catch(Exception e){
e.printStackTrace();

}
byte[] result = md.digest();//通过执行填充等最终操作来完成哈希计算
StringBuilder res = new StringBuilder();//多线程不安全
for(byte by:result){
String str = Integer.toHexString(by);//by转为16进制
res.append(str);//追加到res中
}
System.out.println(res);//输出证书

}

@Test
public void testDigestStreamMD5(){
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-256");//创建信息摘要实例算法SHA-256
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(
InputStream fis = Files.newInputStream(Paths.get("e:","b.ser"));//创建文件输入流并读取文件
DigestInputStream dis = new DigestInputStream(fis, md);//使用流fis的位更新关联的消息摘要md
){
byte[] arr = new byte[5];//定义字节数组为5位
int len = -1;
while((len = dis.read(arr))>0){
System.out.println(new String(arr,0,len));
}
byte[] byteArr = md.digest();//使用特定字节arr更新摘要
StringBuilder result = new StringBuilder();//创建一个可变的字符序列
/*for (byte by:byteArr){
String str = Integer.toHexString(by);//by转为16进制
result.append(str);//追加字符到字符序列
}*/
for(int i=0;i<byteArr.length;i+=4){
int temp = (byteArr[i]<<4) | byteArr[i+1];
temp = ((temp<<4) | byteArr[i+2]);
temp = ((temp<<4) | byteArr[i+3]);
result.append(Integer.toHexString(temp));
//<<4 | byteArr[i+2]); <<4 | byteArr[i+3]);
}
System.out.println(result);//输出证书
System.out.println(this.transform(result));//调用transform
// System.out.println(Arrays.toString(byteArr));

}catch(Exception e){
e.printStackTrace();
}
}

private String transform(StringBuilder s){
StringBuilder sb = new StringBuilder();//创建一个可变的字符序列
for(int i =0;i<s.length()-2;i+=2){
sb.append(s.charAt(i)).append(s.charAt(i+1)).append(":");//隔两个字符添加一个冒号

}
sb.append(s.charAt(s.length()-2)).append(s.charAt(s.length()-1));//追加到字符
return sb.toString();//变为字符串
}

}









































































































以上是关于消息摘要输出证书的主要内容,如果未能解决你的问题,请参考以下文章

Hash函数和消息摘要算法

数字摘要

散列函数消息摘要与数字签名

详解摘要认证

密码学DAY2

密码学DAY2