欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過Java實現(xiàn)RSA加密與驗證的方法詳解

 更新時間:2023年12月01日 11:16:15   作者:共飲一杯無  
RSA是一種非對稱加密算法,是目前廣泛應用于加密和數(shù)字簽名領域的一種加密算法,本文主要講述如何通過Java實現(xiàn)RSA加密與驗證,應用場景為與其他平臺對接接口時,通過RSA加密和解密驗證請求的有效性,在對接時雙方互換公鑰,需要的朋友可以參考下

RSA(Rivest–Shamir–Adleman)是一種非對稱加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,是目前廣泛應用于加密和數(shù)字簽名領域的一種加密算法。RSA的工作原理基于兩個密鑰:公鑰和私鑰,分別用于加密和解密數(shù)據(jù),以及數(shù)字簽名和驗證。
以下是RSA的主要特點和一些常見的使用場景:

  • 非對稱加密: RSA是一種非對稱加密算法,意味著它使用不同的密鑰進行加密和解密。公鑰用于加密數(shù)據(jù),只有擁有相應私鑰的用戶才能解密它。這種非對稱性使得RSA在安全通信中非常有用,因為公鑰可以公開分享,而私鑰必須保密
  • 數(shù)字簽名和驗證: RSA還可以用于數(shù)字簽名和驗證。發(fā)送方可以使用其私鑰對消息進行簽名,接收方可以使用發(fā)送方的公鑰來驗證簽名。這確保了消息的完整性和來源認證。數(shù)字簽名在網絡安全、電子郵件認證和電子商務中廣泛使用。
  • 密鑰交換: RSA可用于安全地交換對稱密鑰。在兩個通信方之間建立安全連接時,可以使用RSA加密傳輸對稱密鑰,然后使用該對稱密鑰進行快速的數(shù)據(jù)加密和解密。這提高了性能并確保了密鑰的安全交換。
  • 安全通信: RSA可用于保護通信的機密性和完整性。通信雙方可以使用對方的公鑰來加密數(shù)據(jù),以確保只有持有私鑰的一方能夠解密它。這在保護敏感信息傳輸時非常重要,例如,網上銀行、電子商務和VPN連接。
  • 數(shù)字證書RSA也與數(shù)字證書一起使用,以驗證網站的身份和安全性。數(shù)字證書中包含了網站的公鑰,通過驗證證書的簽名,用戶可以確保他們正在與合法的網站通信,而不是受到中間人攻擊。
  • 安全存儲 RSA可以用于加密敏感數(shù)據(jù),然后將其存儲在不安全的環(huán)境中,只有持有私鑰的用戶才能解密和訪問數(shù)據(jù)。這對于存儲密碼、加密錢包和數(shù)據(jù)庫等敏感數(shù)據(jù)非常有用。

總的來說,RSA是一種強大且多用途的加密算法,廣泛應用于網絡通信、數(shù)據(jù)安全、數(shù)字簽名、身份驗證和加密存儲等領域。然而,需要注意的是,RSA的性能較低,特別是對于長消息,因此在某些情況下,可能需要與對稱加密算法結合使用,以提高性能。

本文主要講述如何通過Java實現(xiàn)RSA加密與驗證,應用場景為與其他平臺對接接口時,通過RSA加密和解密驗證請求的有效性,在對接時雙方互換公鑰。

生成公私鑰

要實現(xiàn)加密和驗證,首先你需要生成一對RSA密鑰對,包括公鑰和私鑰。你可以使用Java的KeyPairGenerator類來生成密鑰對。實現(xiàn)代碼如下:

package com.zjq.dailyrecord.security;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;

/**
 * RSA公私鑰生成
 * @author 共飲一杯無
 */
public class GenerateRSAKeys {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建一個RSA密鑰對生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        // 設置密鑰長度,通常為2048位
        keyPairGenerator.initialize(2048);

        // 生成RSA密鑰對
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        System.out.println("公鑰: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
        System.out.println("私鑰: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
    }
}

基礎的公鑰加密私鑰解密

具體代碼實現(xiàn)如下:

package com.zjq.dailyrecord.security;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

/**
 * RSA加密和解密
 * @author 共飲一杯無
 */
public class RSAEncryptionDecryption {
    public static void main(String[] args) throws Exception {
        String originalText = "Hello, RSA encryption and decryption!";
        
        // 將公鑰和私鑰的Base64編碼字符串轉換為PublicKey和PrivateKey對象
        String publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhRJqXuMDyyc4b3+LrsZqwh+sZtV3n2pwjkWZ+SIkfW3GlrVPEQmGDbCB2xJ3coSc/IQ5ukkdh1ArTzf69kmn3zNZT34ZJgYjLNnvi9I2dBRZkARV2ERFhPYZsUt8WecSGt29SK22NsctMkSroRmsLRMUArmZ2r3knMrhy54PLvoeXwvDdpXC19EsioK5I7Huh29G+c3Bi8IWySR4/U2kpH+8CU2iZGiChwIZ6qqJgvaVbUuSdksHFnrVbl1LjqGKlb+Vos16UnluPlW4PGJMCfRYZcPqLSm728qT+jQFIUK17yAeznIvx5nccg6ke1GgnwhqeDicPuKnj4FKFm33/wIDAQAB";
        String privateKeyBase64 = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCFEmpe4wPLJzhvf4uuxmrCH6xm1XefanCORZn5IiR9bcaWtU8RCYYNsIHbEndyhJz8hDm6SR2HUCtPN/r2SaffM1lPfhkmBiMs2e+L0jZ0FFmQBFXYREWE9hmxS3xZ5xIa3b1IrbY2xy0yRKuhGawtExQCuZnaveScyuHLng8u+h5fC8N2lcLX0SyKgrkjse6Hb0b5zcGLwhbJJHj9TaSkf7wJTaJkaIKHAhnqqomC9pVtS5J2SwcWetVuXUuOoYqVv5WizXpSeW4+Vbg8YkwJ9Fhlw+otKbvbypP6NAUhQrXvIB7Oci/HmdxyDqR7UaCfCGp4OJw+4qePgUoWbff/AgMBAAECggEAWWJOSuAn6yy0DsjYlZQ3n59Q2V4n1M/VPOtpiluxsQKsswykSGhiQA3Am9timmyTWlaixAtap0plXPfYPdipxxYhtnCYCd9zfywAaKXR59THeCJBW1w4aiA4j8uJgoXgtmUdQJVWYKMXK73Onw60hS5ccZwjyTdmOR9Z3cCUqFNmX9EIAj9jUE9/nASNgnGNH5ULspaBUSH59B0D/2kNUexMrteShtlxKL73iFdptGu68NLk05GvghLG3o0HMJtOIyF+kj6x0BtPcD5xh7YxN6PTdrxnj4tmKsAesc38NBJphFFFmvxY5B9m9gKMOBQcGVW0By6AJLbE5Pj1w5GlMQKBgQDJ7+XQc3Q8VgXQZYpO2CA8Kygkls7GTsXwblB6u0aYT7uhht4Dwk2xCtkRWoUri6rVkcOKKY/SrU4GvVyK8E5AMHfOjTc1M6GQ6UOj760NUMqUwwzR45pUFKLtYq+gOlWqHz0Vu84DCQqU7nhJGqv5cMUoZRkTrqV6zPq/oWLa6QKBgQCosroKI3NfvkaTxYboNF8Bn6j1nzCrNW3VrtZvXXbeTWTxSgH01p45IcPPEfauQqHHzFSzrVP4HL9PNz8SYpwhS61i3PX5S2ftLRKsfOheYKWG7l5clu80SZfAcpXblp4QTZmHdp67dp2XMEFi/3VGDhZU/LCpLMvIUs/8MpmapwKBgBXALD3Gocd58Ihg14PkjZxNfbZrM/xyManTCAIgN9tiAzDDyRgYjqu6ImVXHa7yDUWRvMEd9urXVect8FDaz2LklZL+7OpjFEz6gxmeUEJ16Ewbsj7NSCs0SdRN4+LbRazcToUPxIHZMHWYNgaRw+JLPkE6mnffQN24RG3toSs5AoGBAIgoEI2kRTduXIpiL9t0gYXO9lCgVmio6+g+f+ZMemc78g/pWqDhI70a6m5TolTNhMO8wFRwvcgQc7wc6/QL0NXyvZOAoaq+2LeN3HeJLQcXXCIGe/ShAZmjGC8EjL052INyDktOSxkkyFbBZNThOCb9sbqQZIl2lVcut51mvaEbAoGBALwLpxIjj7N+dxkbScZCTWCgSPZ6t9y5rO9VkLtJ31aDAFqXljh4hphHhnsUq9z2pT3fo5mNRnaYutIixmzxQSQlzmjvnzFe+ZHFXMHm2l1fgOi5ByV9a/prUmyTuLuiwCf1/Q+E+qFPNnl5Actbamqk26zlMbZVTK6lrTM5PN+/";
        
        PublicKey publicKey = KeyFactory.getInstance("RSA")
                .generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyBase64)));
        PrivateKey privateKey = KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyBase64)));

        // 使用公鑰加密數(shù)據(jù)
        Cipher encryptCipher = Cipher.getInstance("RSA");
        encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = encryptCipher.doFinal(originalText.getBytes());

        // 使用私鑰解密數(shù)據(jù)
        Cipher decryptCipher = Cipher.getInstance("RSA");
        decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = decryptCipher.doFinal(encryptedBytes);

        String decryptedText = new String(decryptedBytes);
        System.out.println("加密后的數(shù)據(jù): " + Base64.getEncoder().encodeToString(encryptedBytes));
        System.out.println("解密后的數(shù)據(jù): " + decryptedText);
    }
}

執(zhí)行結果如下:

image.png

自定義密鑰加密及校驗

通過對接雙方各自生成對應的公私鑰,然后交換公鑰和jwt用戶key的形式實現(xiàn)加密和驗證。
需要引入如下坐標依賴:

    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.8.3</version>
    </dependency>

具體代碼實現(xiàn)如下:

加密

    /**
     * 加密
     * @param dataJson
     * @param priKey
     * @param pubKey
     * @return
     */
    public static String encodeJwtToken(String dataJson, String priKey, String pubKey) {
        try {
            RSAPublicKey publicKey = defaultRSAPublicKey(pubKey);
            RSAPrivateKey privateKey = defaultRSAPrivateKey(priKey);
            //加密
            Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
            String token = JWT.create()
                    .withIssuer(RSAKeyUtil.USER_KEY)
                    //.withExpiresAt(expiresAt)
                    .withClaim("data", dataJson)
                    .sign(algorithm);
            return token;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static RSAPublicKey defaultRSAPublicKey(String pubKey) throws Exception {
        RSAPublicKey publicKey = getRSAPublicKey(pubKey);
        return publicKey;
    }

    public static RSAPrivateKey defaultRSAPrivateKey(String priKey) throws Exception {
        RSAPrivateKey privateKey = getRSAPrivateKey(priKey);
        return privateKey;
    }

    public static RSAPublicKey getRSAPublicKey(String publicKey) throws Exception {
        byte[] publicBytes = decryptBASE64(publicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
        return pubKey;
    }

    public static RSAPrivateKey getRSAPrivateKey(String privateKey) throws Exception {
        byte[] clear = decryptBASE64(privateKey);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        RSAPrivateKey priKey = (RSAPrivateKey) fact.generatePrivate(keySpec);
        Arrays.fill(clear, (byte) 0);
        return priKey;
    }

    /**
     * 解碼返回byte
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }

校驗

    /**
     * 驗簽校驗
     * @param jwtToken
     * @param priKey
     * @param pubKey
     * @return
     * @throws Exception
     */
    public static Boolean verify(String jwtToken, String priKey, String pubKey) throws Exception {
        RSAPublicKey publicKey = RSAKeyUtil.defaultRSAPublicKey(pubKey);
        RSAPrivateKey privateKey = RSAKeyUtil.defaultRSAPrivateKey(priKey);
        //加密
        Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
        //解密
        JWTVerifier verifier = JWT.require(algorithm)
                .withIssuer(RSAKeyUtil.USER_KEY)
                .build();
        DecodedJWT jwt = null;
        try{
            jwt = verifier.verify(jwtToken);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return !StringUtils.isEmpty(jwt);
    }

測試驗證

測試驗證代碼如下:

package com.zjq.dailyrecord.security;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Decoder;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;


/**
 * 商戶公司驗簽加解密工具類
 * @author 共飲一杯無
 */
public class RSAKeyUtil {
    public final static String USER_KEY = "gongyinyibeiwu";

    /**
     * 驗簽校驗
     * @param jwtToken
     * @param priKey
     * @param pubKey
     * @return
     * @throws Exception
     */
    public static Boolean verify(String jwtToken, String priKey, String pubKey) throws Exception {
        RSAPublicKey publicKey = RSAKeyUtil.defaultRSAPublicKey(pubKey);
        RSAPrivateKey privateKey = RSAKeyUtil.defaultRSAPrivateKey(priKey);
        //加密
        Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
        //解密
        JWTVerifier verifier = JWT.require(algorithm)
                .withIssuer(RSAKeyUtil.USER_KEY)
                .build();
        DecodedJWT jwt = null;
        try{
            jwt = verifier.verify(jwtToken);
            Claim subjectClaim  = verifier.verify(jwtToken).getClaim("data");
            String result = subjectClaim.asString();
            System.out.println("解密結果:"+result);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return !StringUtils.isEmpty(jwt);
    }

    /**
     * 加密
     * @param dataJson
     * @param priKey
     * @param pubKey
     * @return
     */
    public static String encodeJwtToken(String dataJson, String priKey, String pubKey) {
        try {
            RSAPublicKey publicKey = defaultRSAPublicKey(pubKey);
            RSAPrivateKey privateKey = defaultRSAPrivateKey(priKey);
            //加密
            Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
            String token = JWT.create()
                    .withIssuer(RSAKeyUtil.USER_KEY)
                    //.withExpiresAt(expiresAt)
                    .withClaim("data", dataJson)
                    .sign(algorithm);
            return token;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static RSAPublicKey defaultRSAPublicKey(String pubKey) throws Exception {
        RSAPublicKey publicKey = getRSAPublicKey(pubKey);
        return publicKey;
    }

    public static RSAPrivateKey defaultRSAPrivateKey(String priKey) throws Exception {
        RSAPrivateKey privateKey = getRSAPrivateKey(priKey);
        return privateKey;
    }

    public static RSAPublicKey getRSAPublicKey(String publicKey) throws Exception {
        byte[] publicBytes = decryptBASE64(publicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
        return pubKey;
    }

    public static RSAPrivateKey getRSAPrivateKey(String privateKey) throws Exception {
        byte[] clear = decryptBASE64(privateKey);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        RSAPrivateKey priKey = (RSAPrivateKey) fact.generatePrivate(keySpec);
        Arrays.fill(clear, (byte) 0);
        return priKey;
    }

    /**
     * 解碼返回byte
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptBASE64(String key) throws Exception {
        return (new BASE64Decoder()).decodeBuffer(key);
    }

    public static void main(String[] args) {
//        當前平臺的公鑰
        String ownPubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgBu0tGxKBDDUzEW498JYS5ibAtCTxXcw7fEALMek3D6mfbV9JOe10+Ukf9CSRYd4FEhjaq63Vy57mVs/Bmse9RQcv2AxyCBThwKJELA8kH2B8ulYkwlthEyz5/HJ49eLKljak9+b5Ya6uHTo3d5xIhXLc20IzW1O4QsxJVkmkTYS0jruFx3YrZdiiluawCYdmAUQ34JONS4cgsMrjwF8sRNsZ6Vu0trCttY94i2NYWJU1X0XCMWcYoTKLCenMa4XMoP+cgI1Q+6Ni4zZbCLMkwxo7rr+LBD6jpzrfi9/p15PdnzGFvOr+ZCQbKwemex+GuR86Xq/+ZozHK9YIjrcvQIDAQAB";
//        當前平臺的私鑰
        String ownPriKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCAG7S0bEoEMNTMRbj3wlhLmJsC0JPFdzDt8QAsx6TcPqZ9tX0k57XT5SR/0JJFh3gUSGNqrrdXLnuZWz8Gax71FBy/YDHIIFOHAokQsDyQfYHy6ViTCW2ETLPn8cnj14sqWNqT35vlhrq4dOjd3nEiFctzbQjNbU7hCzElWSaRNhLSOu4XHditl2KKW5rAJh2YBRDfgk41LhyCwyuPAXyxE2xnpW7S2sK21j3iLY1hYlTVfRcIxZxihMosJ6cxrhcyg/5yAjVD7o2LjNlsIsyTDGjuuv4sEPqOnOt+L3+nXk92fMYW86v5kJBsrB6Z7H4a5Hzper/5mjMcr1giOty9AgMBAAECggEANjoEEr8n0YBOAy2cLxvPvigZrWZWtqZOStnRxiK38RZ/6QRStbVzLP94pLXHxLCkLom5s2XDa57caLzL/86GKx1ZUdTJHbo5QRPcqvi+mjbWM9l8Sbka536ERLD/UXdijAlSdHeZiN2v2fZ6v7ex0cjB9tj3eeVEF1RieDm1bo+IffHsiDKidfJ3/VaG5rlOzxQvxq22R9BBh5I8C1N3OnDX+A4R4lqy85OTH5+IQcJh4Z4lDP2gMHMqDJDoa6yxOB4UdL9gmfWDx2TBD9Y0XbaILDRGHG/gdPPtUb7ybhuZ3GaRO0JfH6k0oeGo+g7dAOTkyZlkPFa++jgXf/YYrQKBgQC/Ar3E54fZAzdQv0f9uBtEhtgT4Um0OcXZin6WUqBbcYwH1XnATPxPpQG0SNpRDWlKiBVSGH2d9OcE6Rxtal3IbXR/nTtGQumWSFJ8cYIaQGS22Bynb5e5H5XXfgXZ+0qlGgMW3WeqJv7f47g/W14w8rBf4zCbQ44JALd3+CraBwKBgQCrshV+86pjEQfWzuuGGNOaVt4GEyomheGGxWd1vncDm6TwFYixiWEnt/0ZKRXjN7gmljv07u17WZHANRKeHJJ5mYTfge/ZKrrY5LUorWA3lpzTbFEdOof+ea7FUujfZ0VcFmRtEb1yyOwtxTNyUSuwJn9OzmbhsGZngUGtIbuyGwKBgBy4TsxSe8yXfTO47xwpGIB/PfIPR8O/hA4nks0Lc20Mb5+l636MlMts5gqzgY/6UkCQoZQMdqbPcgT8//c7rQo72u5tN8JiwTiFe1GWx5cm433SlMxgLRH6u88A9eRGsnyMorZHaBTfdCc52DQ+irUVaIuiX2aZC7wyzWNOfzL1AoGADEbJfrBRiI/ZLaTR9l6kEq8PZQPNyb9c5tQKl8Kso9dnLbt8cKVQCxT+xePIKtz7D9dCJjtHQ8CdyU6CLEgCuSse8xRJYA/MGGISCfyLmq3sPLnL+vkKbEmrE3TgLckmjnUTbTENiL2RFZy6Fvxy0T+PbsUXWh/Q0qnNVmHJF+0CgYBstz+ESSvKJhSCNpWccnsCNyza9gy1KrgHFQn8RbJ/ss4s21iXEBZYEex2sjwFUZmH2xUxeV45x2zOyCrxJrHqgaA+0og8CmD5mqLDpliiBOpIQr2Du7DLMUAQDZ4oJvkul/ADQ3HJcCcMqQs7xLI0PzIKHjhh/IeWtxbQDDp72g==";

//        對接平臺公鑰
        String otherPubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4A6SXgt/nNh76Hn85pZxvh2mRv2y4VWfrwM8lFv7urzJ3xt5FocujjEoQT3Q5jeByxiZaOmPk6mfpTTCsel5vGZqLtM8mrNKoPrXiKuq0U0sWUpXdlRLaFV+SMujTsuYl76get9kLVjwXRu4qlhtZlLlWcLpNu6wEu1JwY8Kl9BDP46X0J+IoL+f9iB0i8PAw71n6NJmGk4bvYAjwnMd9zMPdY+s9hfbv2OILdGkSAcaZGoan03HK8u5JBikMZOvhXHkNkgBtRX8ATqCbYK4fTAC70RdOwqbyOhcW/qie18KnfZJsINb7cPfN406wIK6rMapCx7RJ7eu7Ey0Hm8GGQIDAQAB";
//        對接平臺私鑰
        String otherPriKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDgDpJeC3+c2HvoefzmlnG+HaZG/bLhVZ+vAzyUW/u6vMnfG3kWhy6OMShBPdDmN4HLGJlo6Y+TqZ+lNMKx6Xm8Zmou0zyas0qg+teIq6rRTSxZSld2VEtoVX5Iy6NOy5iXvqB632QtWPBdG7iqWG1mUuVZwuk27rAS7UnBjwqX0EM/jpfQn4igv5/2IHSLw8DDvWfo0mYaThu9gCPCcx33Mw91j6z2F9u/Y4gt0aRIBxpkahqfTccry7kkGKQxk6+FceQ2SAG1FfwBOoJtgrh9MALvRF07CpvI6Fxb+qJ7Xwqd9kmwg1vtw983jTrAgrqsxqkLHtEnt67sTLQebwYZAgMBAAECggEAHh23TM7M21854HitJq1oIn7Hv9kP9zvUF+kedm6aunHvzH5b20xWVKSE3agacSda2dq3nCNwug9dtw4NcW6Jf2pgsWSRS9X3nQW6fNNeRX3TDTlx4iTYcfCz5cMBc3DoVNU5qupmA7ZlsI4uVy9FnTBdRaBuSoTww8qDVHIOoXMLenXArosyQEytxEL1uBGF8xijBWC5CGQfLjegcqYiVJ7Bl5kGXGwo0q0dzTabx/P4sH1BBRWMkTEUgfBZs4QvFiTfCIB0/X44cIHpokBnaeYGKX7aVVDIRni1ot3gzYDgBnIGM9ZY/CjLn0mrnZciVr8SemTyobGf/GlPoID+xQKBgQD4HLuAQR1SqiNwuB+lDz0hYqFL/r3VvEa4Wety7lznppz9EWeDEnN89bk9+RXxq+cSg7EwGdI+LGNeZpShpCBrb/93VYN/kohywb6vgZJ3gjT50J+8mmvxm0cE61xZ+VGkAKn1QqO6voF17mOcHD4k/h1je0SVj7d40q2QbQwKWwKBgQDnLhCF9JZE23gPP2CCccQlA4QHR89i6YwQpFWyINIJA/p42cdVPErprQqsBDBoV5sk9GX9X08GBsU2tDDvOxCsQjPShe/pVSvdCg8aFnQzi5r8lEhGpirH16N9LHRx2dsFvoN/h+zqbuF4MRdmsPmUb6UFs3CnGfvraWo/OCATmwKBgAsS1TeDMHjZCR3lydvHE1ZjHYnTw8s/TPS7ZqvJgbIBGK6e0TzjXO4t1Wezr0wK/RQxdn4MGPsXZhP3hhi0x5Gj/QXpdiYCdz6P8R/KK6xTzmN78TUsuzacVI4epw+I9iDYur0sjTwvdn259w4noIpsIQmoncYDFRA6bu6sP0ZTAoGBAIra/Em5c1jAigh+hLVVJ/8jcXX+B+7dYKfOTTrEw+NuZE+aX0QvBr/8k+BmU70YgbNcqLXbPVfdUS9eY9YNoCIXUZEtqcB4y/PkStXcjsc3H0x+tDrbK+8E8soInZiUxh1ZJRrAxei52OuccPXZbs9dj70w3oU/8jSgCJUYXQvpAoGBAIv+AsEpjKnSCukCftO4XBdRFgyf4+XXbnqOqThHzUlSd02qk2aijjs9XFMtnoBobqOM/jDhh6uYSX5vWJtrarlgX7cvKD9xDroC54RmDnDfOl0CfN5DaffofsD8+z6MSQU1FN1PYigkqfDHCKCFRL4Hp90PvGuynejhAl8x1OfC";

        String jsonStr = "{\n" +
                "    \"name\":\"共飲一杯無\"\n" +
                "}";

//        1.先加密
        String jwtToken = RSAKeyUtil.encodeJwtToken(jsonStr,ownPriKey,otherPubKey);
        System.out.println(jwtToken);

        try {
//            2.解密
            Boolean verify =  RSAKeyUtil.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJkYXRhIjoie1xuICAgIFwibmFtZVwiOlwi5YWx6aWu5LiA5p2v5pegXCJcbn0iLCJpc3MiOiJnb25neWlueWliZWl3dSJ9.BGat7UWtc75ZyTMoySrtBOLyED9iNBOJOvw198_yg6ZbjCuitFIvl4p7qs9v2oo3BoAPWH8gKLQsLLhsUQ6p9thcCimB0ClTJkxQlxd_2I8J-fli2Jmc09I53mIptNOtfB_zDn5UuXyVtB5-aD_mUs9xLXkEb8DJbMl4__LHDQyr1v3ixh0rq_e5LaY0ZOfSq2l06MaSAssdKQRvN_H0snO0KJkodcPktfRr4hOXI_ZvcbZHgiuv6JUpbp6x7T9BWMvixD7TTd-lqqm2OsqGOCtWJ4URSJmjYdLDswHY89jNzfVHrQ6exuUIeranWJoRf2-smE8KpLAN8kxs1o1Rpg"
                    ,otherPriKey,ownPubKey);
            System.out.println(verify);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

如果用戶key不對會報如下錯誤:

在這里插入圖片描述

如果公私鑰不匹配會報如下錯誤:

在這里插入圖片描述

兩種結果都說明解密失敗。

正常執(zhí)行返回結果:

在這里插入圖片描述

使用RSA進行數(shù)字簽名和驗證

實現(xiàn)邏輯為使用私鑰對數(shù)據(jù)進行簽名,然后使用公鑰進行驗證。具體代碼實現(xiàn)如下:

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

/**
 * RSA數(shù)字簽名實現(xiàn)
 * @author 共飲一杯無
 */
public class RSASignatureVerification {
    public static void main(String[] args) throws Exception {
        String data = "待簽署及核實的資料。";

        // 將公鑰和私鑰的Base64編碼字符串轉換為PublicKey和PrivateKey對象
        String publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhRJqXuMDyyc4b3+LrsZqwh+sZtV3n2pwjkWZ+SIkfW3GlrVPEQmGDbCB2xJ3coSc/IQ5ukkdh1ArTzf69kmn3zNZT34ZJgYjLNnvi9I2dBRZkARV2ERFhPYZsUt8WecSGt29SK22NsctMkSroRmsLRMUArmZ2r3knMrhy54PLvoeXwvDdpXC19EsioK5I7Huh29G+c3Bi8IWySR4/U2kpH+8CU2iZGiChwIZ6qqJgvaVbUuSdksHFnrVbl1LjqGKlb+Vos16UnluPlW4PGJMCfRYZcPqLSm728qT+jQFIUK17yAeznIvx5nccg6ke1GgnwhqeDicPuKnj4FKFm33/wIDAQAB";
        String privateKeyBase64 = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCFEmpe4wPLJzhvf4uuxmrCH6xm1XefanCORZn5IiR9bcaWtU8RCYYNsIHbEndyhJz8hDm6SR2HUCtPN/r2SaffM1lPfhkmBiMs2e+L0jZ0FFmQBFXYREWE9hmxS3xZ5xIa3b1IrbY2xy0yRKuhGawtExQCuZnaveScyuHLng8u+h5fC8N2lcLX0SyKgrkjse6Hb0b5zcGLwhbJJHj9TaSkf7wJTaJkaIKHAhnqqomC9pVtS5J2SwcWetVuXUuOoYqVv5WizXpSeW4+Vbg8YkwJ9Fhlw+otKbvbypP6NAUhQrXvIB7Oci/HmdxyDqR7UaCfCGp4OJw+4qePgUoWbff/AgMBAAECggEAWWJOSuAn6yy0DsjYlZQ3n59Q2V4n1M/VPOtpiluxsQKsswykSGhiQA3Am9timmyTWlaixAtap0plXPfYPdipxxYhtnCYCd9zfywAaKXR59THeCJBW1w4aiA4j8uJgoXgtmUdQJVWYKMXK73Onw60hS5ccZwjyTdmOR9Z3cCUqFNmX9EIAj9jUE9/nASNgnGNH5ULspaBUSH59B0D/2kNUexMrteShtlxKL73iFdptGu68NLk05GvghLG3o0HMJtOIyF+kj6x0BtPcD5xh7YxN6PTdrxnj4tmKsAesc38NBJphFFFmvxY5B9m9gKMOBQcGVW0By6AJLbE5Pj1w5GlMQKBgQDJ7+XQc3Q8VgXQZYpO2CA8Kygkls7GTsXwblB6u0aYT7uhht4Dwk2xCtkRWoUri6rVkcOKKY/SrU4GvVyK8E5AMHfOjTc1M6GQ6UOj760NUMqUwwzR45pUFKLtYq+gOlWqHz0Vu84DCQqU7nhJGqv5cMUoZRkTrqV6zPq/oWLa6QKBgQCosroKI3NfvkaTxYboNF8Bn6j1nzCrNW3VrtZvXXbeTWTxSgH01p45IcPPEfauQqHHzFSzrVP4HL9PNz8SYpwhS61i3PX5S2ftLRKsfOheYKWG7l5clu80SZfAcpXblp4QTZmHdp67dp2XMEFi/3VGDhZU/LCpLMvIUs/8MpmapwKBgBXALD3Gocd58Ihg14PkjZxNfbZrM/xyManTCAIgN9tiAzDDyRgYjqu6ImVXHa7yDUWRvMEd9urXVect8FDaz2LklZL+7OpjFEz6gxmeUEJ16Ewbsj7NSCs0SdRN4+LbRazcToUPxIHZMHWYNgaRw+JLPkE6mnffQN24RG3toSs5AoGBAIgoEI2kRTduXIpiL9t0gYXO9lCgVmio6+g+f+ZMemc78g/pWqDhI70a6m5TolTNhMO8wFRwvcgQc7wc6/QL0NXyvZOAoaq+2LeN3HeJLQcXXCIGe/ShAZmjGC8EjL052INyDktOSxkkyFbBZNThOCb9sbqQZIl2lVcut51mvaEbAoGBALwLpxIjj7N+dxkbScZCTWCgSPZ6t9y5rO9VkLtJ31aDAFqXljh4hphHhnsUq9z2pT3fo5mNRnaYutIixmzxQSQlzmjvnzFe+ZHFXMHm2l1fgOi5ByV9a/prUmyTuLuiwCf1/Q+E+qFPNnl5Actbamqk26zlMbZVTK6lrTM5PN+/";

        PublicKey publicKey = KeyFactory.getInstance("RSA")
                .generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyBase64)));
        PrivateKey privateKey = KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyBase64)));

        // 使用私鑰進行數(shù)字簽名
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data.getBytes());
        byte[] signatureBytes = signature.sign();

        System.out.println("數(shù)字簽名: " + Base64.getEncoder().encodeToString(signatureBytes));

        // 使用公鑰進行驗證
        signature.initVerify(publicKey);
        signature.update(data.getBytes());
        boolean verified = signature.verify(signatureBytes);

        if (verified) {
            System.out.println("數(shù)字簽名驗證成功!");
        } else {
            System.out.println("數(shù)字簽名驗證失?。?);
        }
    }
}

結果輸出如下:

在這里插入圖片描述

以上就是通過Java實現(xiàn)RSA加密與驗證的方法詳解的詳細內容,更多關于Java實現(xiàn)RSA加密與驗證的資料請關注腳本之家其它相關文章!

相關文章

  • Java 遍歷list和map的方法

    Java 遍歷list和map的方法

    這篇文章主要介紹了Java 遍歷list和map的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳細分析Java 泛型的使用

    詳細分析Java 泛型的使用

    這篇文章主要介紹了Java 泛型的使用,文中講解非常詳細,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • spring自定義一個簡單的Starter啟動器

    spring自定義一個簡單的Starter啟動器

    這篇文章主要介紹了spring自定義一個簡單的Starter啟動器,一個 starter其實就是對一個功能的集成封裝,然后對外提供一個依賴,讓業(yè)務去使用,像我們熟悉的 Redis,mongo,mybatis 等均屬于,需要的朋友可以參考下
    2023-07-07
  • 基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    下面小編就為大家?guī)硪黄贘ava并發(fā)容器ConcurrentHashMap#put方法解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • IDEA版使用Java操作Redis數(shù)據(jù)庫的方法

    IDEA版使用Java操作Redis數(shù)據(jù)庫的方法

    這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫的方法,首先需要下載jedis.jar包,然后再工程中設置具體操作步驟跟隨小編一起學習下吧
    2021-08-08
  • Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署

    Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署

    今天小編就為大家分享一篇關于Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • JavaWeb 入門篇:創(chuàng)建Web項目,Idea配置tomcat

    JavaWeb 入門篇:創(chuàng)建Web項目,Idea配置tomcat

    這篇文章主要介紹了IDEA創(chuàng)建web項目配置Tomcat的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • 教你使用IDEA搭建spring源碼閱讀環(huán)境的詳細步驟

    教你使用IDEA搭建spring源碼閱讀環(huán)境的詳細步驟

    這篇文章主要介紹了使用IDEA搭建spring源碼閱讀環(huán)境的詳細步驟,本文分兩步通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • Idea打包springboot項目沒有.original文件解決方案

    Idea打包springboot項目沒有.original文件解決方案

    這篇文章主要介紹了Idea打包springboot項目沒有.original文件解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java用正則表達式實現(xiàn)${name}形式的字符串模板實例

    Java用正則表達式實現(xiàn)${name}形式的字符串模板實例

    這篇文章主要給大家介紹了Java如何用正則表達式實現(xiàn)${name}形式的字符串模板,文章給出詳細的實例代碼,對大家的理解和學習會很有幫助,有需要的朋友們下面來一起看看吧。
    2016-12-12

最新評論