java实现SHA256withRSA公、私钥生成以及签名和验签

SHA256withRSA公、私钥生成以及签名和验签
代码:

package com.test.utils;

import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: sai
 * @Date: 2022/6/13 0013 23:04
 * @ClassName: SHA256withRSAUtils
 * @Version: 1.0
 * @Description:
 */
public class SHA256withRSAUtils {

    private static final String KEY_ALGORITHM = "RSA";
    private static final int KEY_SIZE = 1024;//设置长度
    private static final String PUBLIC_KEY = "publicKey";
    private static final String PRIVATE_KEY = "privateKey";
    public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
    public static final String ENCODE_ALGORITHM = "SHA-256";

    /**
     * 生成公、私钥
     * 根据需要返回String或byte[]类型
     *
     * @return
     */
    private static Map<String, String> createRSAKeys() {
        Map<String, String> keyPairMap = new HashMap<String, String>();
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            keyPairGenerator.initialize(KEY_SIZE, new SecureRandom());
            KeyPair keyPair = keyPairGenerator.generateKeyPair();

            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            /*Map<String, byte[]> byteMap = new HashMap<String, byte[]>();
            byteMap.put(PUBLIC_KEY_NAME, publicKey.getEncoded());
            byteMap.put(PRIVATE_KEY_NAME, privateKey.getEncoded());*/

            //获取公、私钥值
            String publicKeyValue = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            String privateKeyValue = Base64.getEncoder().encodeToString(privateKey.getEncoded());

            //存入
            keyPairMap.put(PUBLIC_KEY, publicKeyValue);
            keyPairMap.put(PRIVATE_KEY, privateKeyValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return keyPairMap;
    }

    /**
     * 解码PublicKey
     *
     * @param key
     * @return
     */
    public static PublicKey getPublicKey(String key) {
        try {
            byte[] byteKey = Base64.getDecoder().decode(key);
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(byteKey);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            return keyFactory.generatePublic(x509EncodedKeySpec);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解码PrivateKey
     *
     * @param key
     * @return
     */
    public static PrivateKey getPrivateKey(String key) {
        try {
            byte[] byteKey = Base64.getDecoder().decode(key);
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(byteKey);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

            return keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 签名
     *
     * @param key         私钥
     * @param requestData 请求参数
     * @return
     */
    public static String sign(String key, String requestData) {
        String signature = null;
        byte[] signed = null;
        try {
            PrivateKey privateKey = getPrivateKey(key);

            Signature Sign = Signature.getInstance(SIGNATURE_ALGORITHM);
            Sign.initSign(privateKey);
            Sign.update(requestData.getBytes());
            signed = Sign.sign();

            signature = Base64.getEncoder().encodeToString(signed);
            System.out.println("===签名结果:" + signature);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return signature;
    }

    /**
     * 验签
     *
     * @param key         公钥
     * @param requestData 请求参数
     * @param signature   签名
     * @return
     */
    public static boolean verifySign(String key, String requestData, String signature) {
        boolean verifySignSuccess = false;
        try {
            PublicKey publicKey = getPublicKey(key);

            Signature verifySign = Signature.getInstance(SIGNATURE_ALGORITHM);
            verifySign.initVerify(publicKey);
            verifySign.update(requestData.getBytes());

            verifySignSuccess = verifySign.verify(Base64.getDecoder().decode(signature));
            System.out.println("===验签结果:" + verifySignSuccess);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return verifySignSuccess;
    }

    public static void main(String[] args) {
        Map<String, String> keyPairMap = createRSAKeys();

        String publicKey = keyPairMap.get(PUBLIC_KEY);
        System.out.println("生成公钥: " + publicKey);

        String privateKey = keyPairMap.get(PRIVATE_KEY);
        System.out.println("生成私钥: " + privateKey);

        System.out.println("===开始RSA公、私钥测试===");
        String str = "alpha=001&beta=002&gamma=003";
        String sign = sign(privateKey, str);

        verifySign(publicKey, str, sign);
    }
}

结果

生成公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzKTG9IOXuUmPcqPWiPlKcn0VQLGg0aM2/28wMlqRSCeOcS7+u8Y4IThqknM80ije48NzPM3PghLC4DAaEP8FIXQbWXQaAF05sZ2xTgknpk8cdITjp6h0HxCmHmX660d+UHBuCkC2ABu0cGRlbOeInqlbMSRHO4wwRecvFrasc9QIDAQAB
生成私钥: MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBALMpMb0g5e5SY9yo9aI+UpyfRVAsaDRozb/bzAyWpFIJ45xLv67xjghOGqSczzSKN7jw3M8zc+CEsLgMBoQ/wUhdBtZdBoAXTmxnbFOCSemTxx0hOOnqHQfEKYeZfrrR35QcG4KQLYAG7RwZGVs54ieqVsxJEc7jDBF5y8Wtqxz1AgMBAAECgYEAg9nSQBUBAoZh9dfmhhOFqrxQP3Oe8MsceJEitzT6E2IxvynEFNSyqYwJcZHxsAH0hkfEyTxdkCM3Bwvak+NzszaxEVIGV8+nP4Bz+sffs3fkS6pv1Faclw1xHm4dcT6LTuhLt5lW5WGZbiBJmgJlJvNH2syPLgud/iafqzwv+FUCQQD0xNHe872PRwMkJa6UHpiFKybUVGxkDjWxKoY82LYsHnaW+0Eh0P0Qv53LUsC8JAuYb5YED86u38qvqU4DurC3AkEAu2G11fo0+P6L3ak8NrgE3awzc+xjtwBb0QT2GlQPBNs85CMuRQmgaXQKaOOxo3LDhI1uKIws3rOQDLuAm7PbswJBAI7KIwTFfFgRPSvhL68JCkDlo4lKltDn2Tq5bAYjBmNGgjgh6yUnHfqfThZG+FjJTlpm/kTwU8qAk2VWh0R1rJECQQCmKTA4riY5Qme+yOqXTzkpZSE/Q7jst4mz4SVnFXE4Cj2FxFisaavwtzDf8EE+wm70ZQHxPNQxK6OqVr7l02kXAkEAt0fyXTZZlzzSjxKJsrdDaQG1h8PRdbP0vEDwPCP8K1hdioZMlJsOBxAnOGwKe5QmR9+r+9AJ+t+sysQkno21Fg==
===开始RSA公、私钥测试===
===签名结果:gk9YtS6/j7+j9wTsOpDACiZS0E/2piUXhdUADy/eqEj+krelK0d42g/U48fWaA+A3DQPCPox3ixo8X0ZFABF8Mfo9++F48lZm3M77G8ZtoP08ahzMS++d94WkMu50huEtXYfqrGZyeJ0YSxx6cxjlTnZgwRrX7vp05h9hE+AfyY=
===验签结果:true
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值