12 对称加密AES和非对称加密RSA

文章目录

  • 一、对称加密算法AES
    • 1. AES简介
    • 2. AES代码
  • 二、非对称加密RSA
    • 1. RSA简介
    • 2. 生成公钥私钥
    • 3. RSA代码


一、对称加密算法AES

1. AES简介

对称加密算法AES是目前广泛使用的一种加密技术,它采用相同的密钥来进行数据的加密和解密。

AES的优点

  • 高效性:AES在多种平台上都具有很好的性能,能够快速加密和解密数据。
  • 安全性:AES被认为是一个非常安全的加密标准。
  • 灵活性:支持多种密钥长度,可以根据不同的安全需求选择合适的密钥。

AES的注意事项

  • 密钥管理:由于AES使用的是对称密钥,因此密钥的安全存储和分发至关重要。
  • 填充方式:在加密过程中,需要对数据块进行填充以使其符合块大小要求,常用的填充方式有PKCS、CBC等。
  • 初始化向量:在某些AES模式下,如CBC模式,需要使用IV来增加加密的随机性。

2. AES代码

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * AES 加密和解密
 */
public class AesTest {

    // 秘钥
    private static String KEY = "aaccB1123Mopac31";

    // 向量
    private static String IV = "CdmccsaCCcdsADf";

    /**
     * 加密
     * @param content 待加密内容
     * */
    public static String encrypt(String content) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)));
        return Base64.getEncoder().encodeToString(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)));
    }

    /**
     * 解密
     * @param content 加密内容
     * */
    public static String decrypt(String content) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8)));
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(content));
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }
    
    public static void main(String[] args) throws Exception {
        String text = "加密内容";
        String encryptText = encrypt(text);
        System.out.println("加密后内容:" + encryptText);
        System.out.println("解密后内容:" + decrypt(encryptText));
    }
}
  • 效果
    在这里插入图片描述

二、非对称加密RSA

1. RSA简介

RSA是一种非对称加密算法,使用一对公钥和私钥来进行加密和解密操作,公钥用于加密数据,私钥用于解密数据。

RSA的优点

  • 安全性:RSA基于大数因子分解难题,被认为是一种非常安全的加密算法。
  • 灵活性:RSA支持不同的密钥长度,可以根据需要选择适合的密钥长度来平衡安全性和性能。
  • 数字签名:RSA算法可以用于生成和验证数字签名,提供数据的完整性和身份验证功能。

RSA的注意事项

  • 密钥长度:选择合适的密钥长度非常重要,常见的密钥长度有1024位、2048位等,长度越长安全性越高。
  • 安全存储:私钥需要严格保密,确保私钥不被泄露,否则将导致加密数据的泄露。
  • 性能:RSA加密和解密的性能相对较低,需要注意在大量数据加密时可能会影响性能。

加密场景

  • A生成一对密钥:公钥、私钥
  • B使用公钥对消息进行加密
  • A使用私钥对消息进行解密

验签场景

  • A生成一对密钥:公钥、私钥
  • A使用私钥对消息进行签名
  • B使用私公钥对消息内容和消息签名进行验签

2. 生成公钥私钥

生成1024位的RSA私钥
openssl genrsa -out private.key 1024

使用私钥生成公钥
openssl rsa -in private.key -pubout -out public.key

使用公钥加密
openssl pkeyutl -encrypt -pubin -inkey public.key -in test.txt -out test.encrypt

使用私钥解密
openssl pkeyutl -decrypt -inkey private.key -in test.encrypt -out test.decrypt

使用私钥签名
openssl pkeyutl -sign -inkey private.key -in test.txt -out test.sign

使用公钥恢复签名数据
openssl pkeyutl -verifyrecover -pubin -inkey public.key -in test.sign -out test.verify

使用公钥验签
openssl pkeyutl -verify -in test.txt -sigfile test.sign -pubin -inkey public.key

3. RSA代码

import javax.crypto.Cipher;
import java.util.Base64;
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;

/**
 * RSA 加密解密和签名验签
 */
public class RsaTest {

    // 公钥
    private static String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHDYWXIMltI+zia0lrxm1dJu96" +
            "QkogDVLsaFXxnjCZl72evCU0CAlWGDPc3gzJYFNw1KZvNRuTTiKbGa0enFc8hDoG" +
            "Sjg37Na8OqMzLZZ/N6/DCAUywk1JNhMfYDr0GSYNgV37NXWvKD3rbvfxCkoH3ojn" +
            "B3zUgr31VQfryzXq+QIDAQAB";

    // 私钥
    private static String PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMcNhZcgyW0j7OJr" +
            "SWvGbV0m73pCSiANUuxoVfGeMJmXvZ68JTQICVYYM9zeDMlgU3DUpm81G5NOIpsZ" +
            "rR6cVzyEOgZKODfs1rw6ozMtln83r8MIBTLCTUk2Ex9gOvQZJg2BXfs1da8oPetu" +
            "9/EKSgfeiOcHfNSCvfVVB+vLNer5AgMBAAECgYBNTSADJ9VxkBEPgRC7TQztrxAz" +
            "T4kP13zLmF0//unqy/X0riZYhYJyr+V8MbOPhNwCpmKYL2ytERv5VchYaeiqRBsQ" +
            "vVqVhz5oBGmVxyrHsfiRl4F+3vUA/qeewmNl/rFTxXBH5T3J0SzppSD6Z9+gdPiy" +
            "wl51fut+FqggqbiH/QJBAP9ETAF+qKM5pW2KHhNbeKwxc2e0y3fvxAEfFKD6GakT" +
            "d38QMTULN6kmZl3vhJXSxY/Xt8OjZVOvOTWj4yoqXycCQQDHn+O9viCin1HGtv1W" +
            "LIMxYFIj3m+3CgE2RltgVErmxS5Jo3bh86UFk8t+/JRRhatpxKaPBlOzN4WsmbkW" +
            "b7jfAkAWuTOy5l2Iujb5u1PWEUx6t6Q4VSXPtW5TUzr44YqrPGpky0I2IJuB2UM/" +
            "lXTOCYdAuMlJByCcBHspRT+Rn1f9AkEAibZAqxXtd6KHDJoSXI9qlfaH09zQnqoV" +
            "OfcBdIvR/C9NBlnxWmD1l8pkmR7vxul63gVejc5kkX8dBXwq1lKOawJBAKeVg9VB" +
            "hj7WkjgoIVnuI8CIrO6IpboS+ySV/CZalkyNNVRWq2rOJbpIHe4baXqPomZ8mFEA" +
            "4SGoEW3AiyFiqb8=";

    /**
     * 实例化公钥
     * @param publicKey 公钥
     */
    public static PublicKey getPublicKey(String publicKey) throws Exception {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKey.getBytes());
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(keySpec);
    }

    /**
     * 实例化私钥
     * @param privateKey 私钥
     */
    public static PrivateKey getPrivateKey(String privateKey) throws Exception {
        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKey.getBytes());
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(keySpec);
    }

    /**
     * 公钥加密
     * @param content 待加密内容
     */
    public static String encrypt(String content, String publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));
        return new String(Base64.getEncoder().encode(cipher.doFinal(content.getBytes("UTF-8"))));
    }

    /**
     * 私钥解密
     * @param content 加密内容
     */
    public static String decrypt(String content, String privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
        return new String(cipher.doFinal(Base64.getDecoder().decode(content)));
    }

    /**
     * 私钥签名
     * @param content 待签名内容
     */
    public static String sign(String content, String privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initSign(getPrivateKey(privateKey));
        signature.update(content.getBytes("UTF-8"));
        return new String(Base64.getEncoder().encode(signature.sign()));
    }

    /**
     * 公钥验签
     * @param content 原始内容
     * @param sign 签名内容
     */
    public static boolean verify(String content, String sign, String publicKey) throws Exception {
        Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initVerify(getPublicKey(publicKey));
        signature.update(content.getBytes("UTF-8"));
        return signature.verify(Base64.getDecoder().decode(sign));
    }
    
    public static void main(String[] args) throws Exception {
        String content = "消息内容";

        String encrypt = encrypt(content,PUBLIC_KEY);
        System.out.println(encrypt);
        String decryp = decrypt(encrypt,PRIVATE_KEY);
        System.out.println(decryp);

        String sign = sign(content,PRIVATE_KEY);
        System.out.println(sign);
        boolean verify = verify(content,sign,PUBLIC_KEY);
        System.out.println(verify);
    }
}
  • 效果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/473281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maxwell监听mysql的binlog日志变化写入kafka消费者

一. 环境: maxwell:v1.29.2 (从1.30开始maxwell停止了对java8的使用,改为为11) maxwell1.29.2这个版本对mysql8.0以后的缺少utf8mb3字符的解码问题,需要对原码中加上一个部分内容 :具体也给大家做了总结 : 关于v1.…

UniTask 异步任务

文章目录 前言一、UniTask是什么?二、使用步骤三、常用的UniTask API和示例1.编写异步方法2.处理异常3.延迟执行4.等待多个UniTask或者一个UniTas完成5.异步加载资源示例6.手动控制UniTask的完成状态7.UniTask.Lazy延迟任务的创建8.后台线程切换Unity主线程9.不要返…

小程序跨端组件库 Mpx-cube-ui 开源:助力高效业务开发与主题定制

Mpx-cube-ui 是一款基于 Mpx 小程序框架的移动端基础组件库,一份源码可以跨端输出所有小程序平台及 Web,同时具备良好的拓展能力和可定制化的能力来帮助你快速构建 Mpx 应用项目。 Mpx-cube-ui 提供了灵活配置的主题定制能力,在组件设计开发阶…

​HTTP与HTTPS:网络通信的安全卫士

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…

容器中的大模型(三)| 利用大语言模型:容器化高效地部署 PDF 解析器实践...

作者:宋文欣,智领云科技联合创始人兼CTO 01 简介 大语言模型(LLMs)正逐渐成为人工智能领域的一颗璀璨明星,它们的强大之处在于能够理解和生成自然语言,为各种应用提供了无限可能。为了让这些模型更好地服务…

Java柠檬班Java全栈自动化课程

Java柠檬班Java全栈自动化课程旨在教授学员Java编程技能与全栈开发知识,包括自动化测试、前端开发和后端开发。学员将学习如何构建完整的应用程序,并掌握自动化测试框架,为职业发展打下坚实基础。 课程大小:14G 课程下载&#x…

PyTorch 深度学习(GPT 重译)(二)

四、使用张量表示真实世界数据 本章内容包括 将现实世界的数据表示为 PyTorch 张量 处理各种数据类型 从文件加载数据 将数据转换为张量 塑造张量,使其可以作为神经网络模型的输入 在上一章中,我们了解到张量是 PyTorch 中数据的构建块。神经网络…

挖掘网络宝藏:利用Scala和Fetch库下载Facebook网页内容

介绍 在数据驱动的世界里,网络爬虫技术是获取和分析网络信息的重要工具。本文将探讨如何使用Scala语言和Fetch库来下载Facebook网页内容。我们还将讨论如何通过代理IP技术绕过网络限制,以爬虫代理服务为例。 技术分析 Scala是一种多范式编程语言&…

【云原生 • Kubernetes】认识 k8s、k8s 架构、核心实战

文章目录 Kubernetes基础概念1. 是什么2. 架构2.1 工作方式2.2 组件架构 3. k8s组件创建集群步骤一 基础环境步骤二 安装kubelet、kubeadm、kubectl步骤三 主节点使用kubeadm引导集群步骤四 副节点加入主节点步骤五 部署dashboard Kubernetes核心实战1. 资源创建方式2. Namespa…

stable diffusion webui ubuntu 安装

1.git clone 下来 GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UIStable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui development by creating an account on GitHub.https://github.com/AUTOMATIC1111/stable-diffus…

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串(可使用urllib.request的相应方法),将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…

钡铼技术R40工业4G路由器加速推进农田水利设施智能化

钡铼技术R40工业4G路由器作为一种先进的通信设备,正在被广泛应用于各行各业,其中包括农田水利设施的智能化改造。通过结合钡铼技术R40工业4G路由器,农田水利设施可以实现更高效的管理和运营,提升农田灌溉、排水等工作效率&#xf…

Idea 不能创建JDK1.8的spring boot项目

由于https://start.springboot.io/ 不支持JDK1.8,那么我们需要换idea的springboot创建源,需要换成 https://start.aliyun.com,这也是网上大部分教程说的,但是我这边会报这样的错误: Initialization failed for https:…

流畅的 Python 第二版(GPT 重译)(九)

第四部分:控制流 第十七章:迭代器、生成器和经典协程 当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表…

自动化的免下车服务——银行、餐厅、快餐店、杂货店

如果您在20世纪70年代和2020年分别驾车经过免下车服务餐厅(汽车穿梭餐厅),您会发现,唯一的不同是排队的车型。50多年来,免下车技术一直为我们提供着良好的服务,但现在也该对它进行现代化改造了。 乘着AI和自…

QGIS编译(跨平台编译)056:PDAL编译(Windows、Linux、MacOS环境下编译)

点击查看专栏目录 文章目录 1、PDAL介绍2、PDAL下载3、Windows下编译4、linux下编译5、MacOS下编译1、PDAL介绍 PDAL(Point Data Abstraction Library)是一个开源的地理空间数据处理库,它专注于点云数据的获取、处理和分析。PDAL 提供了丰富的工具和库,用于处理激光扫描仪、…

SecureCRT:高效安全的远程连接工具

SecureCRT是一款功能强大的终端仿真工具,主要用于连接和运行包括Windows、UNIX和VMS在内的远程系统。它支持多种协议,如SSH1、SSH2、Telnet、SFTP、Rlogin、Serial、SCP等,确保用户与目标设备之间的通信安全,并防止网络攻击和窥探…

Crypto Gladiator League (CGL)

《加密角斗士》是一款完全链上游戏。所有角斗士、装备、代币等的生成过程都可以透明追溯。不可能被篡改或欺骗,使所有游戏物品都是真实资产。 CGL 现已升级为全链游戏平台和 Web3 游戏流量门户,通过多维度收集用户数据,并将数据应用于游戏中&…

ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助学员掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战…

Kafka生产者相关概念

文章目录 Kafka工作流程Kafka文件存储生产者分区策略生产者ISR生产者ack机制数据一致性问题ExactlyOnce Kafka工作流程 Kafka中消息是以topic进行分类的,Producer生产消息,Consumer消费消息,都是面向topic的。 Topic是逻辑上的概念&#xff…