从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

目录

1. 接下来让小编给您们编写实现代码!请躺好 ☺

1.1 配置application.yml文件

1.2 RSA算法签名工具类

1.3 RSA算法生成签名以及效验签名测试

1.4 RSA算法生成公钥私钥、加密、解密工具类

1.5 RSA算法加解密测试


  • 我们为什么要使用RSA算法来进行加解密?

RSA 加密算法是一种非对称加密算法,也是目前广泛使用的加密技术之一。RSA
算法的安全性基于大素数分解的困难性问题,其主要特点是安全性高、密钥管理简单等。

RSA 算法采用非对称加密的方式,即加密和解密使用不同的密钥进行操作。算法的安全性基于两个大素数相乘难以分解的数学问题,保证了密钥的安全性和机密性。在
RSA 算法中,公钥用于加密,私钥用于解密。

RSA 算法主要优点如下:

  1. 安全性高:RSA 算法基于大素数分解的困难性问题,能够提供非常高的安全性,防止敏感信息被窃取和篡改。

  2. 密钥管理简单:由于 RSA 算法采用非对称加密的方式,公钥和私钥用于不同的加密和解密操作,因此密钥管理相对简单,易于实现和维护。

  3. 数字签名:RSA 算法可以用于生成数字签名,保证数据的机密性、完整性和认证性。

  4. 移植性好:由于 RSA 算法在现代密码学领域得到广泛应用,因此具有很好的兼容性和可移植性,适用于各种不同的应用场景。

RSA 算法主要用于数字签名、加密解密等方面。在数字签名方面,RSA
算法可以用于生成和验证签名,保证数据的机密性、完整性和认证性,防止篡改和伪造;在加密解密方面,RSA 算法可以用于实现各种安全协议和应用程序,例如
SSL/TLS、IPSec、PGP 等,保证数据的机密性和隐私性。值得注意的是,由于 RSA
算法的加密和解密速度较慢,因此在加密大量数据时,可能会影响系统的性能。

  • 我们为什么要使用RSA算法签名?

RSA签名机制是非对称加密技术的一种重要应用,用于数字签名和认证,在计算机网络通信安全、电子商务、数字版权等领域广泛应用。RSA签名可以保证信息传输过程中不被篡改,同时也能够验证消息发送者的身份和数据完整性。

具体来说,使用RSA签名可以实现以下目标:

  1. 防止信息在传输过程中被篡改:RSA签名利用发送者的私钥对信息进行签名,接收者使用发送者的公钥验证签名,如果签名验证通过,则说明信息没有被篡改。
  2. 验证数据来源的真实性:RSA签名可以证明一个信息确实是由某个特定的发送者发送的,因为只有该发送者拥有私钥,能够用私钥对信息进行签名。
  3. 确认数据的完整性:RSA签名可以保证信息在传输过程中没有发生丢失或损坏,因为任何篡改或修改都会导致签名验证失败。
  4. 确认数据的时间戳:RSA签名还可以记录签名的时间戳,以确保信息的时效性。

因此,使用RSA签名是保障信息安全和传输可靠性的重要手段,它可以有效防范数据被篡改、伪造和窃取等风险。

1. 接下来让小编给您们编写实现代码!请躺好 ☺

  • 这篇文章主要是小编带领大家去认识RSA算法的签名认证,以及加解密算法的实现。
1.1 配置application.yml文件
crypto:
  #AES消息秘钥
  ASE_SIGN_KEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCFeSnQmMwPfwnvrozctUM8YmkvieWgsxvh2aAl71GVeGcsxCvIO1K9uAPFJdpSwATBRR3v0V6PYsatO9t0n3WF9HvX2LVkF+uKI7g5IdXsTe5e5XORMz4ESYvus2onq2SmMUCTel8Wd0hQNWB90GG9Mc1TT4uwhMyTR37t6DSctZXelyx1f6fOb2RIz+eDD8tI7feibBo17Jkmh3cK96xYUC4wPiSRbVRv96+1jc4lbi4qfwPXRnxbrDWD3NJxh4yt4abrp0BNq4o0vEDqmyjtOytOW1gdmHPvDML7LO10xm4lDYVTvqyow0RH8jKxm/TTIK9KSnKtqvjDoEaUo5WfAgMBAAECggEABkM4Hgx9TqDUU4WqIFT08algbBWZS5/7x+4RIJaJCm1a0fPmZf+6kyJGMwLiqo1N68+VZwI44Jtu3QP4+RDeT8m34dnOMQMaTyH769pVkj/Z1mQHtyFjYIoe4bVTXscg8tdOw1yzh3dTUkge3ehgHaNvkeAimsawXpy1LO5/QXcGFWtZtOW2+Lx8Teylg98vEuGtolGjr/BZHhGJ2BoV9+P6CyH6Y0evqi/Ku9HQdQW3RWD/K/M9oX8wT4crLqa/bGUYCvlXJLt8CAHv1KbqScRaX68LIunJweJxjceElENYTmCGcrJ2PILWag1RhCvnBCe3RIuCowVCVDJK5yx2wQKBgQDbmFj3me5ucUuZIBKbcsWJDfpdW012dkUeT0r21HzA8MF8ufNFEVmGxinDQtSVqPjOCDo2773JaaBKiuLTnqnVG+QEnPILyFgEsraxJbbeLkQ/xlZNyZpzqlhHD/mxQBm++cje9h8sx71I7Un/nXgirE3lWMYlHXOxr+7mrKYO4QKBgQCbmcq5tRHcADFG67hD8e2ajiQYfPYDG3pvkSqxMeg5P0SauaQ+DZmCvz7R7E8icB9vXHCLjlYzLOu3IVBaFTlJv7x+ljB93BsYqBIQGD+KiyDeCpt94rFFJSLBqldA4tgYLEf+mCgfJHOMOMuzaZrbDgld8Z5YgieuMDJS4Uy0fwKBgF0vullgPjkp5N3XKW5D9yWhA+TIEQg7SjuBhJtYMpSh1kn6kwx1P1udDi3pV1MnQGYWQbX8aLpnE3lulLEe/I0N5+Y5P9HWM9vShwqHqaGBWr8BiLA75Eo/OHT3h4s7W3GaiC5tnW8gV+fxolxR06BLJEc2M+eeJvF5alUDYPihAoGAYXU6HIbk4L7eHmWVzDjDcYKF6TCbhea4ERkDfGid4v1VovOTg6pQ9CuE1UcFabSAe+eSNla4duUz3kfnZATXFPIaxc6cILiz4AWlCp+lbMknlOtf6MEL9xsDYfmnHOT4JGvXzAbRWnAiTzljnMQQUhPAmi6z1wvufpOBcZfby1ECgYEAgzuxcHaGeLio0GVoOP/ql+eEBPWrMO6kRcGZq/N+kfFYuk4+evTVcD506oWFrPoX68XPvRz65LxzVkU5Sze6e2aIKA8XrDnRWJ4qVfMGdWve8zRwnEY937BQixjgBfoCIdq/IZBLxp7vCR3E/oirSUJs3siJ9xLajcNURG6szqc=
  #AES秘钥初始向量
  ASE_SIV: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhXkp0JjMD38J766M3LVDPGJpL4nloLMb4dmgJe9RlXhnLMQryDtSvbgDxSXaUsAEwUUd79Fej2LGrTvbdJ91hfR719i1ZBfriiO4OSHV7E3uXuVzkTM+BEmL7rNqJ6tkpjFAk3pfFndIUDVgfdBhvTHNU0+LsITMk0d+7eg0nLWV3pcsdX+nzm9kSM/ngw/LSO33omwaNeyZJod3CvesWFAuMD4kkW1Ub/evtY3OJW4uKn8D10Z8W6w1g9zScYeMreGm66dATauKNLxA6pso7TsrTltYHZhz7wzC+yztdMZuJQ2FU76sqMNER/IysZv00yCvSkpyrar4w6BGlKOVnwIDAQAB
  #RSA私钥
  RSA_PRIVATE_KEY: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCPEG5zZAEqSasGgEr1iHdunBLHip08GGct9EAIzw8zBq5zUwpX0KXLNJJ1d+AgcQWAYk0BrsX9lpR2ffodJci2qgo13kXc97xMRbFBSsZ4wnoK0L/cSy9P6NxdpJ+FuhKY6MnwOFApif7mJY8I4FumThOjC+7s3kW1hMctbFc0YyEc3sND9u001oiX9lDEiTYd4Ouq2IKDFbe2l38KCPgTpkpD4OXUFm3utgLlsrGostU9DQXalg9c8LLLRjBQoHyeCyOXzwWBGsZ2hoAvJNKIlOx66GKu6ebF/EV3Y2BsdjDQF0zCQ/c3xCz7bsv2BGcuA3VuYAtUmBmoSD6AL6aTAgMBAAECggEAKXMtTSlwXPwzHRMWpMUBNX7qwf2bSMoZOutFkkfLs5EAAlHQ8Vh2cMWumXI98ahNW8EfZploq+xw31Pon4FPAf2KL8lSnI76c27NyIkNr/dIvNF2hTETaCejkU4dGfWrZbosp/jo4OAmhi/jnULDyw9cCSVv+Bj+QXVS8AovyfFvv4Yj9j6G0vKvs7npJQEJ6eQjeKayWOMArGnxQeRwQBmdtwL46X9ARBt+vSCrWLcOi83orrgiR3R4eySNJ3nTPtyX6G5Co/GdiRm6h+aJQ3zXeE0DVUDsgOYj6rtwb9KJwLG3AM7Bx7evIyPcOY0iDowGnWdRXQo0TTjpIi3LoQKBgQDDRjxTxDYQX6NIaWtjs45tMtdGzavF4C5+7MSsWkf7SZ5JWu3b8XyE8WO4BGMr3q1meeA/PCQjA94LLKHYGj0UTXUDJzd8gw0wbFr9X+ta4FDuUfsW13rSmE6O4oz9oN7ciHDC4kJQjt3LPexuAKPHIqhIRUu3g1boF6pp9ubONQKBgQC7jcBRq9VlJRoxKDYVlNwq+Z/s2Segi4ip4oqky5y36jObg+50qGjrQ2DQnXnnfU1UaBVBnz4xKqgzPx7CSj90Rxjd4LwOtMKot2YwwwWuGRw1GRC7f11d0hJjJEv2Px7Uv6Y4Fb/uTDsC8wUnJddT5rXedYY93RImTTBuTK7apwKBgBCWY8N91FXZueYJxmyGsR+HhQ/noqLBY1G2zRIS7TBkVYTHq5LWVYx5cM4N2Vq9pJ8i1TCp7CvpRTBPz0OrHusdlUX6S9VQ0Ir/eU8ymaxzh4xm/Fw5W56N/4ZVqkJVKvkywdlcHOP47tA352CEv2TIBeF1uXPSPUyjzf8IURzNAoGAQyKLe/CZUzpDtOLi8Ti20r9GCr70m1g3FDCeVjz4HTE9Reak3adG3yfgKOylrUJCAvu62CGLXogZazal6QAw1It6kDmYt17m6wOzFbNJfjdIzIzrW2JM5n+Cy3A7rKqNe7QaaKsIZ+FrojOhXZEDEepcoYPKCKzwiTtKIcFbObMCgYBEzPX1r/JxDS9Qc+AxfE2v91WvzRQD9tWY0Zd1AYgKZiIXvc63vL9Cnsq4K7YM/YiXQv8lCq7R1CzlwWRC3yLnO3SWTMTORX8C0SX8Sy4BJ1e3veDFYlhfxcR4JmWEGSbnZcZBxAnUln/zUFmOthv02cDTSfOVRCFblRtnAVbhwA==
  #RSA公钥
  RSA_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjxBuc2QBKkmrBoBK9Yh3bpwSx4qdPBhnLfRACM8PMwauc1MKV9ClyzSSdXfgIHEFgGJNAa7F/ZaUdn36HSXItqoKNd5F3Pe8TEWxQUrGeMJ6CtC/3EsvT+jcXaSfhboSmOjJ8DhQKYn+5iWPCOBbpk4Towvu7N5FtYTHLWxXNGMhHN7DQ/btNNaIl/ZQxIk2HeDrqtiCgxW3tpd/Cgj4E6ZKQ+Dl1BZt7rYC5bKxqLLVPQ0F2pYPXPCyy0YwUKB8ngsjl88FgRrGdoaALyTSiJTseuhirunmxfxFd2NgbHYw0BdMwkP3N8Qs+27L9gRnLgN1bmALVJgZqEg+gC+mkwIDAQAB
  #签名私钥
  SIGNATURE_PRIVATE_KEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9Gv5KNtk4chHBx332tLxgOnoJ9zpDiMQ6YcZuLO3GC/INLWM71I/LvyPpU0pwC1NwCG0GMgNPax7O6kiNkp/0f+3f7jPFQf0qP7JsGsk1bdmFIy6cOnkrvH1FyYJGdTxBwJxiwTBr3QUN3nh/djO5QPeRffn+Yh9ZkIsPeZjp3u3HMYeVaVXzhTJAMrVyoBiVS8zIeDsV/SrU2tXBdTR9ULw8G3GerO6SfLjagMQ3SvuMi+srSwqZlJUd+gdWNY+FUv1Fa438Y/ZFXSTSdvznoD1zF52VXbfqVIGk81iBaKCU8ZbFOavA4jroYTU9n8MwkGn5Fo+96HnY0DSYDgmhAgMBAAECggEAFaEoxMRRRCuH7Gos9jLl+Pu3SbyFZYQXLbZRQ/jPmX90SB2Q5B8D84IBUYa9VON2v7G3BqZhyouuEmypr8e9k/Gt+5b7ROyvUE3I0qSdrwbJgnjrs+LcSSxeB8VsqTJvmfW17XW7XBsDoPp5Pdr/P4k2x+Vo2rfObigiP7rgyp8KimHaq1u5RLYLUbPGBdRLRt0NUohO1V9Y0KyFTtxdfvJ2BdDANvhOYyCmp9dI5MXoNDh1w0z03Eq4PM30SVEv37mwSVEav4eKlN7/cuclcLF2pddNX7xScdH/kohDaR2xWh1HqkVKIMP+nBXMPWsSpzw+ktwQBROtMbtNsuIZIQKBgQDtDM1KJqoleKImYDc+S3+tU+z6PiYEQQRAzhCscvCvWNOzI0OB0CSEp3hfiUXL6jyOFOU/qI36EqXuqSAuNM+ZtfIzQhPkDNHjO9RqHZhan8AsP06Bmo2P+u83BGF2VVMfacM98aRpL6CwpBsBpnX0ASlC25WAESviXRRH01Za5wKBgQDMOQMTue9j1EA19VLnHXwuOJ3KoaAIdwyluQPgyjnIyTypMKelOrUJoUhRYJm/4XOekq0oyWhc++GnkMfHZYOzHXalTMoAP9EdRMRqUTHztBrUkqkInVEJrAif/OvXMlSIR15fIC+/fewLxEKjf2rU2AM7XRKVyHplkvCsoB0uNwKBgGpUhL1PLKEURH+8RuttiD7iV3lEaV8dHuBGzpncEPRGfudq2PwgtlC+ojMQazt1vWXqH473d4AF32J3gJTZYYnMYHD3od54lak9DCHxVobIA7aVSwy9m+RKpgTitSkUSu3bThW6D4qTL5wscGTEG0KxRqXTw3KnwSyPneo99Q1fAoGAOpyONoYhn3wWJaZP8cazkixrlPFIFcXdGl78LvK7HNYsk75EDxbHSIlCUSCxX7Gb1kHwcolDa5Ra0hWqUJ7g6nIlUBG209V89bJ70KuW84OYQ7QH0VIdJPJ70zbqlOt7+VTKT/DT41iHe2ULXxM9nPKWEt6Ga/iKsEY4zsJxPYcCgYEAoGW8YlcLiMpaTOyOnS5uH6at71sUc2wLR+ovLqqpQxLtOn597fB96X41fg07x0yh9RJ4MbSjamVOpcWsXJaTL5hf98ppw/ffeoWtRc2IiVVGZFNDYm5xXj+mMke8mFNCeKEo2Igf8jGXUTz6473cdljd4GB0T/JWGFX2HNzvEcs=
  #签名公钥
  SIGNATURE_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRr+SjbZOHIRwcd99rS8YDp6Cfc6Q4jEOmHGbiztxgvyDS1jO9SPy78j6VNKcAtTcAhtBjIDT2sezupIjZKf9H/t3+4zxUH9Kj+ybBrJNW3ZhSMunDp5K7x9RcmCRnU8QcCcYsEwa90FDd54f3YzuUD3kX35/mIfWZCLD3mY6d7txzGHlWlV84UyQDK1cqAYlUvMyHg7Ff0q1NrVwXU0fVC8PBtxnqzukny42oDEN0r7jIvrK0sKmZSVHfoHVjWPhVL9RWuN/GP2RV0k0nb856A9cxedlV236lSBpPNYgWiglPGWxTmrwOI66GE1PZ/DMJBp+RaPveh52NA0mA4JoQIDAQAB
1.2 RSA算法签名工具类
package com.jmh.service.base.util;

import org.apache.tomcat.util.codec.binary.Base64;

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

/**
 * 签名工具类
 */
public class DigitalSignatureUtil {

    /**
     * 参数分别代表
     */
    private static final String ALGORITHMS = "RSA";

    private static final String ALGORITHM = "SHA256withRSA";

    /**
     *
     * @param signatureContent 签名内容
     * @param privateKeyEncoded 私钥
     * @return
     * @throws Exception
     */
    public static String generationSignature(String signatureContent, byte[] privateKeyEncoded) throws Exception {
        // 创建key的工厂
        KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
        // 创建 已编码的私钥规格
        PKCS8EncodedKeySpec encPriKeySpec = new PKCS8EncodedKeySpec(privateKeyEncoded);
        // 获取指定算法的密钥工厂, 根据 已编码的私钥规格, 生成私钥对象
        PrivateKey privateKey = keyFactory.generatePrivate(encPriKeySpec);
        Signature signature = Signature.getInstance(ALGORITHM);
        signature.initSign(privateKey);
        signature.update(signatureContent.getBytes());
        byte[] sign = signature.sign();
        // 采用base64算法进行转码,避免出现中文乱码
        return  Base64.encodeBase64String(sign);
    }

    /**
     *  校验签名
     * @param signatureContent 签名内容
     * @param signature 签名
     * @param publicKeyEncoded 公钥
     * @return
     * @throws Exception
     */
    public static boolean verifySignature(String signatureContent,String signature, byte[] publicKeyEncoded) throws Exception {
        // 创建key的工厂
        KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
        // 创建 已编码的公钥规格
        X509EncodedKeySpec encPubKeySpec = new X509EncodedKeySpec(publicKeyEncoded);
        // 获取指定算法的密钥工厂, 根据 已编码的公钥规格, 生成公钥对象
        PublicKey publicKey = keyFactory.generatePublic(encPubKeySpec);
        Signature verifySignature = Signature.getInstance(ALGORITHM);
        verifySignature.initVerify(publicKey);
        verifySignature.update(signatureContent.getBytes());
        boolean verify = verifySignature.verify(Base64.decodeBase64(signature));
        return verify;
    }

}
1.3 RSA算法生成签名以及效验签名测试
  • 生成签名的规则:签名的内容、RSA签名私钥
  • 效验签名的规则:签名的内容、生成好的签名、RSA签名公钥
package com.jmh.service.service.jmhDemo;

import com.fesion.service.base.util.AESEncryptUtil;
import com.fesion.service.base.util.DigitalSignatureUtil;
import com.fesion.service.base.util.MessageDigestUtil;
import com.fesion.service.base.util.RSAEncryptUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author 蒋明辉
 * @data 2023/6/18 23:25
 */
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class Demo02 {


    /**
     * RSA算法私钥
     */
    @Value("${crypto.RSA_PRIVATE_KEY}")
    private String RSA_PRIVATE_KEY;

    /**
     * RSA算法公钥
     */
    @Value("${crypto.RSA_PUBLIC_KEY}")
    private String RSA_PUBLIC_KEY;


    }

    /**
     * 采用RSA算法生成签名、效验签名
     */
    @Test
    @SneakyThrows
    public void demo02(){
        //---------------------------------生成签名
        //要签名的内容
        String conent="蒋明辉是个大帅逼!我好爱。";
        String signature = DigitalSignatureUtil.generationSignature(conent, Base64.decodeBase64(SIGNATURE_PRIVATE_KEY));

        //---------------------------------效验签名
        boolean verifySignature = DigitalSignatureUtil.verifySignature(conent, signature, Base64.decodeBase64(SIGNATURE_PUBLIC_KEY));

        System.out.println("--------------------------生成的签名-----------------");
        System.out.println(signature);
        System.out.println("--------------------------效验签名、正确true、错误false-----------------");
        System.out.println(verifySignature);


    }
}
  • 结果看图

1.4 RSA算法生成公钥私钥、加密、解密工具类
  • 我们可以使用以下工具类generatePublicPrivateKeys()方法生成我们实现业务的公钥和私钥喔!!!

    package com.jmh.service.base.util;

    import org.apache.tomcat.util.codec.binary.Base64;

    import javax.crypto.Cipher;
    import java.nio.charset.StandardCharsets;
    import java.security.*;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;

    /**

    • RSA加密算法
      */
      public class RSAEncryptUtil {

      /**

      • 参数分别代表
        */
        private static final String ALGORITHMS = “RSA”;

      /**

      • 生成公钥,私钥
      • @return 返回值
      • @throws NoSuchAlgorithmException
        */
        public static HashMap<String,String> generatePublicPrivateKeys() throws NoSuchAlgorithmException {
        HashMap<String,String> keys=new HashMap<>();
        // KeyPairGenerator:秘钥对生成器对象
        KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(ALGORITHMS);
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 生成私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 生成公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获取私销的字节数组
        byte[] privateKeyEncoded=privateKey.getEncoded();
        // 获取公销字节数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        // 使用base64进行编码
        String privateEncodeString = Base64.encodeBase64String(privateKeyEncoded);
        String publicEncodeString = Base64.encodeBase64String(publicKeyEncoded);
        // 打印公钥和私钥
        System.out.println(“privateEncodeString=”+privateEncodeString);
        System.out.println(“publicEncodeString=”+publicEncodeString);
        keys.put(“privateKey”,privateEncodeString);
        keys.put(“publicKey”,publicEncodeString);
        return keys;
        }

      /**
      *

      • @param content 未加密的字符串
      • @param publicKeyEncoded 公钥
      • @return
      • @throws Exception
        */
        public static String encrypt(String content, byte[] publicKeyEncoded) throws Exception {
        // 创建key的工厂
        KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
        // 创建 已编码的公钥规格
        X509EncodedKeySpec encPubKeySpec = new X509EncodedKeySpec(publicKeyEncoded);
        // 获取指定算法的密钥工厂, 根据 已编码的公钥规格, 生成公钥对象
        PublicKey publicKey = keyFactory.generatePublic(encPubKeySpec);
        // 获取指定算法的密码器
        Cipher cipher = Cipher.getInstance(ALGORITHMS);
        // 初始化密码器(公钥加密模型)
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        // 加密数据, 返回加密后的密文
        byte[] cipherData = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
        // 采用base64算法进行转码,避免出现中文乱码
        return Base64.encodeBase64String(cipherData);
        }

      /**
      *

      • @param encodeEncryptString 未解密的字符串
      • @param privateKeyEncoded 私钥
      • @return
      • @throws Exception
        */
        public static String decrypt(String encodeEncryptString, byte[] privateKeyEncoded) throws Exception {
        // 创建key的工厂
        KeyFactory keyFactory=KeyFactory.getInstance(ALGORITHMS);
        // 创建 已编码的私钥规格
        PKCS8EncodedKeySpec encPriKeySpec = new PKCS8EncodedKeySpec(privateKeyEncoded);
        // 获取指定算法的密钥工厂, 根据 已编码的私钥规格, 生成私钥对象
        PrivateKey privateKey = keyFactory.generatePrivate(encPriKeySpec);
        // 获取指定算法的密码器
        Cipher cipher = Cipher.getInstance(ALGORITHMS);
        // 初始化密码器(私钥解密模型)
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        // 解密数据, 返回解密后的明文
        byte[] plainData = cipher.doFinal(Base64.decodeBase64(encodeEncryptString));
        // 采用base64算法进行转码,避免出现中文乱码
        return new String(plainData, StandardCharsets.UTF_8);
        }

    }

1.5 RSA算法加解密测试
  • 加密规则:RSA加密内容、RSA公钥
  • 解密的规则:RSA加密的加密、RSA私钥
package com.jmh.service.service.jmhDemo;

import cn.hutool.crypto.asymmetric.RSA;
import com.fesion.service.base.util.AESEncryptUtil;
import com.fesion.service.base.util.DigitalSignatureUtil;
import com.fesion.service.base.util.MessageDigestUtil;
import com.fesion.service.base.util.RSAEncryptUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author 蒋明辉
 * @data 2023/6/18 23:25
 */
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class Demo02 {

    /**
     * RSA签名私钥
     */
    @Value("${crypto.SIGNATURE_PRIVATE_KEY}")
    private String SIGNATURE_PRIVATE_KEY;

    /**
     * RSA签名公钥
     */
    @Value("${crypto.SIGNATURE_PUBLIC_KEY}")
    private String SIGNATURE_PUBLIC_KEY;


    /**
     * 采用RSA算法加解密
     */
    @Test
    @SneakyThrows
    public void demo03(){
        //------------------------RSA算法加密
        //要加密的内容
        String conent="蒋明辉好帅!我好爱。";
        String encrypt = RSAEncryptUtil.encrypt(conent, Base64.decodeBase64(RSA_PUBLIC_KEY));

        //------------------------RSA算法解密
        String decrypt = RSAEncryptUtil.decrypt(encrypt, Base64.decodeBase64(RSA_PRIVATE_KEY));

        System.out.println("-----------------加密------------------");
        System.out.println(encrypt);
        System.out.println("-----------------解密------------------");
        System.out.println(decrypt);
    }

}
  • 结果看图

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~

![](https://img-
blog.csdnimg.cn/img_convert/3cc49faf6da269169b6f55bb3180daa6.png)

1️⃣零基础入门

学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的 学习成长路线图 。可以说是 最科学最系统的学习路线
,大家跟着这个大的方向学习准没问题。

![image](https://img-
blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)

需要详细路线图的,下面获取

![](https://img-
blog.csdnimg.cn/img_convert/3cc49faf6da269169b6f55bb3180daa6.png)

路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

![image-20231025112050764](https://img-
blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)

2️⃣视频配套工具&国内外网安书籍、文档

工具

![](https://img-
blog.csdnimg.cn/img_convert/d3f08d9a26927e48b1332a38401b3369.png#pic_center)

######视频

![image1](https://img-
blog.csdnimg.cn/img_convert/f18acc028dc224b7ace77f2e260ba222.png#pic_center)

######书籍

![image2](https://img-
blog.csdnimg.cn/img_convert/769b7e13b39771b3a6e4397753dab12e.png#pic_center)

资源较为敏感,未展示全面,需要的下面获取

![](https://img-
blog.csdnimg.cn/img_convert/3cc49faf6da269169b6f55bb3180daa6.png) ###
3️⃣Python面试集锦

面试资料

![在这里插入图片描述](https://img-
blog.csdnimg.cn/e4f9ac066e8c485f8407a99619f9c5b5.png#pic_center)![在这里插入图片描述](https://img-
blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png#pic_center)

简历模板

![在这里插入图片描述](https://img-
blog.csdnimg.cn/504b8be96bfa4dfb8befc2af49aabfa2.png#pic_center)

![](https://img-
blog.csdnimg.cn/img_convert/3cc49faf6da269169b6f55bb3180daa6.png)

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

------ 🙇‍♂️ 本文转自网络,如有侵权,请联系删除 🙇‍♂️ ------

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值