package signtest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class RSAEncryptor {
public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
public static void main(String[] args){
// String privateKeyPath = "/Users/Isaacs/Desktop/RSA_KEYS/rsa_public_key.pem"; // replace your public key path here
String privateKeyPath = "/Users/wu/Desktop/pkcs8_private_key.pem"; // replace your private path here
RSAEncryptor rsaEncryptor=new RSAEncryptor();
try {
//加载私钥
String private_key = rsaEncryptor.getKeyFromFile(privateKeyPath);
rsaEncryptor.loadPrivateKey(private_key);
String dirstr="/Users/wu/Desktop";
//计算文件的sha256
byte[] sha256bytes=rsaEncryptor.fileSHA256_1(dirstr + "/" + "testimg.jpg" );
String signstr=rsaEncryptor.signByPrivateKey_1(sha256bytes);
System.out.println("签名值为:" + signstr);
//加载公钥
String publicKeyPath = "/Users/wu/Desktop/public_key.pem";
String public_key=rsaEncryptor.getKeyFromFile(publicKeyPath);
rsaEncryptor.loadPublicKey(public_key);
boolean b=rsaEncryptor.doCheckWithPublicKey_1(sha256bytes, signstr);
System.out.print("检查结果为:" + b);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 计算文件的sha256的值
* by wuchangkai163@163.com
* @param input
* @return
*/
public static String fileSHA256(String input) {
try {
// 拿到一个MD5转换器(®如果想要SHA1参数换成”SHA1”)
MessageDigest messageDigest =MessageDigest.getInstance("SHA-256");
// 输入的字符串转换成字节数组
File file =new File(input);
FileInputStream in = new FileInputStream(input);
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
// byte[] inputByteArray = input.getBytes();
// inputByteArray是输入字符串转换得到的字节数组
messageDigest.update(byteBuffer);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 字符数组转换成字符串返回
BigInteger bi=new BigInteger(1,messageDigest.digest());
return bi.toString(16);
} catch (Exception e) {
return null;
}
}
/**
* 计算文件的sha256的值
* by wuchangkai163@163.com
* @param input
* @return
*/
public static byte[] fileSHA256_1(String input) {
try {
// 拿到一个MD5转换器(®如果想要SHA1参数换成”SHA1”)
MessageDigest messageDigest =MessageDigest.getInstance("SHA-256");
// 输入的字符串转换成字节数组
File file =new File(input);
FileInputStream in = new FileInputStream(input);
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
// byte[] inputByteArray = input.getBytes();
// inputByteArray是输入字符串转换得到的字节数组
messageDigest.update(byteBuffer);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 字符数组转换成字符串返回
return resultByteArray;
} catch (Exception e) {
return null;
}
}
/**
* 使用私钥签名
* by wuchangkai163@163.com
* @param content
* @return
*/
public String signByPrivateKey(String content)
{
try
{
PrivateKey priKey = privateKey;
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update( content.getBytes());
byte[] signed = signature.sign();
return new BASE64Encoder().encode(signed);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/**
* 使用私钥签名
* by wuchangkai163@163.com
* @param content
* @return
*/
public String signByPrivateKey_1(byte[] content)
{
try
{
PrivateKey priKey = privateKey;
java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update( content);
byte[] signed = signature.sign();
return new BASE64Encoder().encode(signed);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/**
* RSA验签名检查
* @param content 待签名数据
* @param sign 签名值
* @param encode 字符集编码
* @return 布尔值
*/
public boolean doCheckWithPublicKey(String content, String sign,String encode)
{
try
{
RSAPublicKey pubKey = publicKey;
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update( content.getBytes(encode) );
boolean bverify = signature.verify( new BASE64Decoder().decodeBuffer(sign) );
return bverify;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
public boolean doCheckWithPublicKey(String content, String sign)
{
try
{
RSAPublicKey pubKey = publicKey ;
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update( content.getBytes() );
boolean bverify = signature.verify( new BASE64Decoder().decodeBuffer(sign) );
return bverify;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
public boolean doCheckWithPublicKey_1(byte[] content, String sign)
{
try
{
RSAPublicKey pubKey = publicKey ;
java.security.Signature signature =