package com.efuli;
import sun.misc.BASE64Decoder;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class MyTest {
public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
public static final String ENCODE_ALGORITHM = "SHA-256";
public static final String TEXT = "i like china";
public static final String PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDhIRwd8kI7I5DB7DSKEyCM2LRGi71tsmwo7GE0fcK3wNYioHC0LGPJ5lsUM599ij//24ObgZU1lFbxObXNoZTvyYcAThl3n4/EQVS39WL13CMYhFE/Vi5SJnKwOFcFi0MRJzkUxp0mxN9cPSKZEN3UWlqg0qxWj7m6DTbMzQgSP8IQK9L3gS3tK5gCm8r0NMVjjU3zdP8aTucTI1iuEAPaMgiT6kMr9UEBJq96CyhjFrQWlwc/gHEpO8W4UsLVm+VTAQlZVEh16IAVi4yaRWAB13dFRXNjO/UiTZ8Uv91u/POCIBIJSig/7cl673eNy2N2Rhw4dFDCzUYa51M2iMQ1AgMBAAECggEAJnW9k/AbGHdO95Iet6fk26r5wUOGLQNaLvOS96C0byfmbSvzlRQwSAGudZkMGipQHKmnph1RHEInSDaPtH1yMDTBd2/gMet0aBaxHmwxZ8cfx8RzDNrwNuCSn0BAvZW482k7+yyjFEh10BAxpOyYuPpmmSrkfjU3iW1Qe1RbmKIxstva0Vg0W0Q52FhbgzOdXFVjjkAvhz49P1yTNgyB+pKHPeJYgjHNNuZ3yzCIg+X+FLdXdc8qvHpd5bbYwxxekUpmZK1kKKAFJAyZljwjmH5aoEbeabk73KVwpslHR1htzXZ+qNkHdDv8ZreseTYG6vKrT0gcOn5eiEXiFHU9UQKBgQD5hFUZTcDwUIAXs2oi3EI4WhYjGZg3wV0WnMIChO9lCZh1ZTHUyV+xwSfvMKWryLrbTMFv0qW4aHEDFcWJX2NBVOSCrowUVOVAscB26s7ChvCApPzxlE8OdX+MEKu447IZUV2WpxJOPOKwN547rkNJw2lQ6BFQhsC7IT6lxGOX3wKBgQDm+pAULqqd7snusKQrWbphgKsHR+VtRWxFCfT81aE22C35nBJf1JVj4Z1IhqsBB2opNl3F8+HvRaj079HDhgSm+Q8WpfCE19bwo94ppo1Y3qRO6uGkpDiYP++zzLNUXTPeiY/PRMZXYFi8F/aF2Fcqae58bgiOlIYpsQd4Egj2awKBgD2Gg/VZVtnq/6rYcrNl3G5IyGyfQwl8hJeuz6gPX3hqhU1tRnxRq2cJWe+A71kMhgbNRmVsa7CtEDDSjYLyImdZp38Ryzi4Nk9dhTfNbm5JF8Sg6j4nc9b84haHhdBxVNkpVwpu5/SizsLk8/+DWNQ3eyCYGKzijWOXLvtxEZ3BAoGBAL42RYR5UcQxq1XHXcrdX6F/5lhems87xoesRXYZL2QM7v+JyY/lbwkL+QyK6jQ0uPYrcVndF4iF4zeibyoHKbmfjQ9npASiAr21FPVT1T8ESmc7AoslOf4XWPzGbD/jaR2wRx+3UWcPTsPHMBrVKCMjjWQm8SEJqtqWkMIOiBb1AoGBALUpqnJ57f7Y835ze92ZFPmQr88ZFtrHjKHLTL2M8hCARL3Gz4lHvzvELQYnDjGFwLHVNIMO1c3mBYi1lkRmRSoJGHbvW3ysJnMNSM0C+EfZ0b8ZRKMUPJvwXpm8DvSK0nGxjISVPkmUQWhNOjrXQnpZ00CdFvxolK0oidbRzSSw";
public static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4SEcHfJCOyOQwew0ihMgjNi0Rou9bbJsKOxhNH3Ct8DWIqBwtCxjyeZbFDOffYo//9uDm4GVNZRW8Tm1zaGU78mHAE4Zd5+PxEFUt/Vi9dwjGIRRP1YuUiZysDhXBYtDESc5FMadJsTfXD0imRDd1FpaoNKsVo+5ug02zM0IEj/CECvS94Et7SuYApvK9DTFY41N83T/Gk7nEyNYrhAD2jIIk+pDK/VBASavegsoYxa0FpcHP4BxKTvFuFLC1ZvlUwEJWVRIdeiAFYuMmkVgAdd3RUVzYzv1Ik2fFL/dbvzzgiASCUooP+3Jeu93jctjdkYcOHRQws1GGudTNojENQIDAQAB";
public static void main(String[] args) {
try{
MessageDigest messageDigest = MessageDigest.getInstance(ENCODE_ALGORITHM);
messageDigest.update(TEXT.getBytes());
byte [] m = messageDigest.digest();
Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM );
sign.initSign(str2PrivateKey(PRIVATE_KEY));
sign.update(m);
byte[] result = sign.sign();
System.out.println("签名结果为:"+bytesToHexString(result));
//********************************
MessageDigest messageDigest2 = MessageDigest.getInstance(ENCODE_ALGORITHM);
messageDigest.update(TEXT.getBytes());
byte [] m2 = messageDigest.digest();
Signature verifySign = Signature.getInstance(SIGNATURE_ALGORITHM );
verifySign.initVerify(str2PublicKey(PUBLIC_KEY));
verifySign.update(m2);
System.out.println(verifySign.verify(result));
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
} catch (SignatureException e){
e.printStackTrace();
}catch (InvalidKeyException e) {
e.printStackTrace();
}
}
public static RSAPrivateKey str2PrivateKey(String privateKeyPerm) {
try {
// Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec((new BASE64Decoder()).decodeBuffer(privateKeyPerm));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static RSAPublicKey str2PublicKey(String publicKeyPerm) {
try {
//Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys
X509EncodedKeySpec keySpec = new X509EncodedKeySpec ((new BASE64Decoder()).decodeBuffer(publicKeyPerm));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}
简单来说,签名主要包含两个过程:摘要和非对称加密,首先对需要签名的数据做摘要(类似于常见的MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果。