RSA初期化鍵ペアと署名検証操作Java版フロントエンドjs署名


package com.zz.util;

import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * @Author: zz
 * @Description:
 * @Date: 11:24 PM 3/24/20
 * @Modified By
 */
public class RSACoder {


    /**
     *      
     * @return
     * @throws Exception
     */
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(1024, new SecureRandom());
        KeyPair pair = generator.generateKeyPair();

        return pair;
    }

    /**
     *   
     * @param plainText
     * @param privateKey
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws SignatureException
     * @throws InvalidKeyException
     */
    public static String sign(String plainText, PrivateKey privateKey) throws NoSuchAlgorithmException, UnsupportedEncodingException, SignatureException, InvalidKeyException {
        Signature privateSignature = Signature.getInstance("SHA256withRSA");
        privateSignature.initSign(privateKey);
        privateSignature.update(plainText.getBytes("UTF-8"));
        byte[] signature = privateSignature.sign();
        return CryptoUtils.encryptBASE64(signature);
    }

    /**
     *   
     * @param plainText
     * @param signature
     * @param publicKey
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws UnsupportedEncodingException
     * @throws SignatureException
     */
    public static boolean verify(String plainText, String signature, PublicKey publicKey) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, SignatureException {
        Signature publicSignature = Signature.getInstance("SHA256withRSA");
        publicSignature.initVerify(publicKey);
        publicSignature.update(plainText.getBytes("UTF-8"));
        byte[] signatureBytes = CryptoUtils.decryptBASE64(signature);
        return publicSignature.verify(signatureBytes);
    }

    /**
     *   PrivateKey
     * @param privateKey
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static PrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] keyBytes;
        keyBytes = CryptoUtils.decryptBASE64(privateKey);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     *   PublicKey
     * @param publicKey
     * @return
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    public static PublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(CryptoUtils.decryptBASE64(publicKey));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(keySpec);
    }



    public static void main(String[] args) throws Exception {


        KeyPair pair = generateKeyPair();
        byte[] pribyte = pair.getPrivate().getEncoded();
        String pri = CryptoUtils.encryptBASE64(pribyte);
        String pub = CryptoUtils.encryptBASE64(pair.getPublic().getEncoded());

//        PrivateKey priKey = getPrivateKeyByStr(pair.getPrivate().ge);
//        PublicKey pubKey = getPublicKeyByStr(pub);

        String signature = sign("foobar", getPrivateKey(pri));
        System.out.println(signature);

        //Let's check the signature
        boolean isCorrect = verify("foobar", signature, getPublicKey(pub));
        System.out.println("Signature correct: " + isCorrect);

        System.out.println(CryptoUtils.encryptBASE64(pair.getPrivate().getEncoded()));
        System.out.println();
        System.out.println(CryptoUtils.encryptBASE64(pair.getPublic().getEncoded()));



    }
}
  1
   import jsrsasign from 'jsrsasign'
   function signatureRsaPck8Test1(privateKey, signValue) {
      const key = KEYUTIL.getKey(privateKey)
      //    Signature   ,         SHA256withRSA
      const signature = new KJUR.crypto.Signature({ alg: 'SHA256withRSA' })
      //      
      signature.init(key)
      //         
      signature.updateString(signValue)
      //   base64    
      const originSign = signature.sign()
      const sign64 = hextob64u(originSign)
      return sign64
    }


  2
    import { KEYUTIL, KJUR, hextob64, hextob64u } from 'jsrsasign';
    function signatureRsaPck8Test2(privateKey, signValue) {
      let rsa = new jsrsasign.RSAKey()
      rsa = jsrsasign.KEYUTIL.getKey(privateKey)
      //   Signature  ,         SHA256withRSA
      const sig = new jsrsasign.KJUR.crypto.Signature({ 'alg': 'SHA256withRSA' })
      //    
      sig.init(rsa)
      //         
      sig.updateString(signValue)
      //        
      return jsrsasign.hextob64(sig.sign())
    }

秘密鍵:
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK8o82Xumm8lwhjwjZ1HCYuczvzaqD0gIWxyT6WsCWGbIiIk3F02VO2mj5jH5L2oDzCK5GoKSwpFQuMl0XcDh7j48YTnwmdR5u8puLC72mtxJuwt0rm8nBwPwqKby9t+hMGL8lmSUqqzr0LhZIsxqv9BXM7s894q76VhJVSezXH9AgMBAAECgYAYUvqCBEGD/91Vc0pnNe84aR1Bdef5HRYnJjSzUBG5cT6rOS008I+YtRGp6NB2GfmKBy+zHhzPn1CrlJvjCCV3qm7Nm124P89UQLcYjcVvkxH3prQ8HVGg3AVYoWGHBFIyAi60MzXS3Ye0ea8cMUSPkaRjD0wE3hiES+AEaYfv4QJBAOX/HnjP8fCvbO0DSPkQ2NtcMsB+YveaebLab0TKlq35vhqRwlT2/SqIkzINZMYIx3FOusNoBL6ft+i6hIYkOkUCQQDC9qyxvmco6jWHWkKw3qGeqlPrZ+S/gBigTDx9SKYA+YzelNCuWcqGzOYoz+kPmm5SEUQEqtCAx3bBg94Wy3BZAkEAzJeGyb1g4NOMN8HmVfiQj4GSe/1xmARIIbuBo1X7d8NjQktK7T3QstdO6QVVEXyZvcdlB5IuNkvp0xKn9JOhaQJAavPHaPp6vQc+tjHdxAldwBzQTKOB6UvsNoOb616fMomzracVk4/OeoSM/naP8+9T9dFi7uyF1R+XFjGw8/BGgQJAVTMtgBs9uj6b4P2jZkBNOAVcesJgya1+/gmTTNUZw4JKxa1lf/il+usSH+uA+kVxDAeA29ep/CDHVorIXV9gIw==
-----END PRIVATE KEY-----

公開鍵:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvKPNl7ppvJcIY8I2dRwmLnM782qg9ICFsck+lrAlhmyIiJNxdNlTtpo+Yx+S9qA8wiuRqCksKRULjJdF3A4e4+PGE58JnUebvKbiwu9prcSbsLdK5vJwcD8Kim8vbfoTBi/JZklKqs69C4WSLMar/QVzO7PPeKu+lYSVUns1x/QIDAQAB
-----END PUBLIC KEY-----

交流を歓迎します:(qq群)786937587
gitアドレス:https://github.com/zhang0135789/java-util.git