文章标题

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)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值