密码学【java】初探究加密方式之非对称加密

news2024/9/27 17:29:40

文章目录

  • 非对称加密
    • 1 常见算法
    • 2 生成公钥和私钥
    • 3 私钥加密
    • 4 私钥加密 公钥解密
    • 5 公钥和私钥的保存和读取
      • 5.1 **保存公钥和私钥**
      • 5.2 读取公钥和私钥

非对称加密

  1. 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。
  2. 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey) 和私有密(privatekey)
  3. 公开密钥和私有密钥是一对。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。
  4. 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

  • 特点
    • 加密和解密使用不同的密钥
    • 如果使用私钥加密, 只能使用公钥解密
    • 如果使用公钥加密, 只能使用私钥解密
    • 处理数据的速度较慢, 因为安全级别高

  • 示例
    1. 首先生成密钥对, 公钥为(5,14), 私钥为(11,14),A希望将原文2发送给B
    2. A使用公钥加密数据. 2的5次方mod 14 = 4 , 将密文4发送给B
    3. B使用私钥解密数据. 4的11次方mod14 = 2, 得到原文2

1 常见算法

  • RSA
    • RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
    • RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥。
    • RSA能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。只有短的RSA钥匙才可能被强力方式解破。世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
    • RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
    • RSA在线工具
    • 希望深入学习RSA的小伙伴,请移步公开密钥加密之RSA算法
  • ECC(Elliptic curve cryptography)
    • 椭圆曲线密码学(ECC),一种建立公开密钥加密的演算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
    • 希望深入学习ECC的小伙伴,请移步ECC椭圆曲线加解密原理详解(配图)

2 生成公钥和私钥

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 加密算法
        String algorithm = "RSA";
        //  创建密钥对生成器对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 生成私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 生成公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获取私钥字节数组
        byte[] privateKeyEncoded = privateKey.getEncoded();
        // 获取公钥字节数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        // 对公私钥进行base64编码
        String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
        String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
        // 打印私钥
        System.out.println("私钥:"+privateKeyString);
        // 打印公钥
        System.out.println("共钥:"+publicKeyString);
    }
私钥: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

共钥:MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAuoaZDELPg9F3n0zREqKM9wmrs/E6ZezWhypt1/Ga6izv0HwqltmaKM5ZFxYu58zcD0AXxL9VY
F4Yk+VTsvq9uC3HN6GpDbUll2LgaF62iV3aROxKlSnT0mW8c09zoUkNEKl9xdmNfXrs+UQfIw/RgRCflR05wSiKboF+Iqwlo9U2CmwfFxmx/OcHFhuLh9pJ+
NQ6jPCD8PU0w6TKMluwRB0obpTkvuxtTXe667Wn9LQspPW1XZrPTrvicylkXwkBcbhB9bFr4o1uEfNzkGH6RmtpLyYIlED9DvU0ApqdPiJlok4Vn2G4qqxci
VcpyA5KPJhV11qJZnX6tZsrjYNdurFHtcD5mYbSAufeYafeuSvG8E4koPMHrklzpAFyewq+DiwjopkqweKnS7nqowITHEFrh12xmQqp627ThZs8cUTR/E1o4
cj77V5XX+2ytAkGkrhNpHwIu2CsAcMyPIgG1aJmIexHVbzB6v2JcBD4PA6nLgCTg2qnJ2bMu6JirmVnAgMBAAE=

3 私钥加密

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        String input = "国泰民安";
        // 加密算法
        String algorithm = "RSA";
        //  创建密钥对生成器对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 生成私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 生成公钥
        PublicKey publicKey = keyPair.getPublic();

        // 创建加密对象
        // 参数表示加密算法
        Cipher cipher = Cipher.getInstance(algorithm);
        // 初始化加密
        // 第一个参数:加密的模式
        // 第二个参数:使用私钥进行加密
        cipher.init(Cipher.ENCRYPT_MODE,privateKey);
        // 私钥加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        System.out.println(Base64.encodeBase64String(bytes));
    }
gjfiD1F+DOFk2IHqrTWSKe+8qGLCihNuu+RrZY6CKji0H56RUhSL3P5fW2X3FXpCrY+CMsGg16HfmR3boeX1qY4e0NJU0JtE1Ch4uERigH1eM/MUCUaFaVI4
9roDAcqbz0v+lnsX41mOCQ4YSd742XoIg7cJX1GcsHhkXDF3JCM/fDxdHYR63ApmSpzr+qfoelntnc+Xah90i3UR/PPiEZ6/6JWz7mU5DK/X5IVnqgGObNCl
syH7tWcwl34IcrszFvK4ovtxeYVQken7IHgW8LMCxWGXWyDThC+9A/d9AV9vlLLuzZcYEvRYMS5BzZqr9gzdrgYE1hsRouFQ0yyuOUoVAbaqAjqhPRTTIj0E
QUl2PpB7hi561x/j/58w9dsoI3gKp/G6SBl40yyuxbm5z/RGYxjeZhyIC4Lm/ddpCQpJ5qzZ/WX6N9fSqjwQLaHSQpgmsy5zdZRkZchxknw8LgONSzObwA5/
F561oXgtHWD44+SzZHoOGY3hDSU3oKMT

4 私钥加密 公钥解密

  • 私钥加密,只能公钥解密
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        String input = "国泰民安";
        System.out.println(input);
        // 加密算法
        String algorithm = "RSA";
        //  创建密钥对生成器对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 生成密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 生成私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 生成公钥
        PublicKey publicKey = keyPair.getPublic();

        // 创建加密对象
        // 参数表示加密算法
        Cipher cipher = Cipher.getInstance(algorithm);
        // 初始化加密
        // 第一个参数:加密的模式
        // 第二个参数:使用私钥进行加密
        cipher.init(Cipher.ENCRYPT_MODE,privateKey);
        // 私钥加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        System.out.println(Base64.encodeBase64String(bytes));

        // 私钥进行解密
        cipher.init(Cipher.DECRYPT_MODE,publicKey);
        // 对密文进行解密,不需要使用base64,因为原文不会乱码
        byte[] bytes1 = cipher.doFinal(bytes);
        System.out.println(new String(bytes1));
    }
国泰民安
VfUXV9TiXxeRx5/gq13GtsNm76BSw/63e1SaOI1szLnb9DjE4hfCmim0qqqOQYSp5fyE45694Dlj37p7/+eu7gMAuJN5PYZfN7bYQZ+ZIJeXCiEO/IWXFzQW
yIgoyqUjZ1i6ja0yfHhY0FXkBBJCr2SNwBiMW1lEQav0UE/i05Dj3+OOKDTKNbIgMLcsZfM3WPSNJWJq7bthnjO0KTPSdG5Dl+/eJictaSGTk0it5+D1l4G6
N8CfTfshG9c3vWbfmqgmU8GaA5Iqo1eHINPpS9SZOoAAokGEzmDkx2VJQiQO3GELIdcCGvyWvZIm7PlAV8EYzxTQiHRSuwiCJyGGABC+I9iEFwDaZwYCTAh7
roSwtpt1ax/KgQfbhv8vNE+/3ADnnvFgzDX6LfWuSl0vhclh9kl0ECnIICJd6dxKwCAZkctiwdOoPrbGnK4lWXbeTbdkxBpdw9LcnWMkCuCVy53k47OjB3S+
t+Uktr2snJAjJDYG4ZZmrQpEIj17zLKZ
国泰民安

5 公钥和私钥的保存和读取

5.1 保存公钥和私钥

public static void main(String[] args) throws Exception {
        String input = "硅谷";
        // 加密算法
        String algorithm = "RSA";

        //生成密钥对并保存在本地文件中
        generateKeyToFile(algorithm, "a.pub", "a.pri");


    }

    /**
     * 生成密钥对并保存在本地文件中
     *
     * @param algorithm : 算法
     * @param pubPath   : 公钥保存路径
     * @param priPath   : 私钥保存路径
     * @throws Exception
     */
    private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {
        // 获取密钥对生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 获取密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 获取公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获取私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 获取byte数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        byte[] privateKeyEncoded = privateKey.getEncoded();
        // 进行Base64编码
        String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
        String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
        // 保存文件
        FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
        FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));

    }

5.2 读取公钥和私钥

public static void main(String[] args) throws Exception {
        String input = "明德新民,止于至善";
        // 加密算法
        String algorithm = "RSA";

        //生成密钥对并保存在本地文件中
        generateKeyToFile(algorithm, "a.pub", "a.pri");
        //读取私钥
        PrivateKey privateKey = getPrivateKey("a.pri", algorithm);
        //读取公钥
        PublicKey publicKey = getPublicKey("a.pub", algorithm);

        String s = encryptRSA(algorithm, privateKey, input);
        String res = decryptRSA(algorithm, publicKey, s);
        System.out.println(res);
    }

    /**
     * 解密数据
     *
     * @param algorithm      : 算法
     * @param encrypted      : 密文
     * @param key            : 密钥
     * @return : 原文
     */
    public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{
        // 创建加密对象
        // 参数表示加密算法
        Cipher cipher = Cipher.getInstance(algorithm);
        // 私钥进行解密
        cipher.init(Cipher.DECRYPT_MODE,key);
        // 由于密文进行了Base64编码, 在这里需要进行解码
        byte[] decode = Base64.decodeBase64(encrypted);
        // 对密文进行解密,不需要使用base64,因为原文不会乱码
        byte[] bytes1 = cipher.doFinal(decode);
        return new String(bytes1);

    }
    /**
     * 使用密钥加密数据
     *
     * @param algorithm      : 算法
     * @param input          : 原文
     * @param key            : 密钥
     * @return : 密文
     */
    public static String encryptRSA(String algorithm,Key key,String input) throws Exception{
        // 创建加密对象
        // 参数表示加密算法
        Cipher cipher = Cipher.getInstance(algorithm);
        // 初始化加密
        // 第一个参数:加密的模式
        // 第二个参数:使用私钥进行加密
        cipher.init(Cipher.ENCRYPT_MODE,key);
        // 私钥加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        // 对密文进行Base64编码
        return Base64.encodeBase64String(bytes);
    }

    public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{
        // 将文件内容转为字符串
        String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());
        // 获取密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 构建密钥规范 进行Base64解码
        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        // 生成公钥
        return keyFactory.generatePublic(spec);
    }

    /**
     * 生成密钥对并保存在本地文件中
     *
     * @param algorithm : 算法
     * @param pubPath   : 公钥保存路径
     * @param priPath   : 私钥保存路径
     * @throws Exception
     */
    private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {
        // 获取密钥对生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        // 获取密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        // 获取公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获取私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 获取byte数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        byte[] privateKeyEncoded = privateKey.getEncoded();
        // 进行Base64编码
        String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
        String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
        // 保存文件
        FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
        FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));

    }

    public static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{
        // 将文件内容转为字符串
        String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());
        // 获取密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        // 构建密钥规范 进行Base64解码
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        // 生成私钥
        return keyFactory.generatePrivate(spec);
    }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

argument type mismatch

后端接收前端传来的数据 id,进行批量删除,报错如下: 错误一 removeByIds(ids) com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.IllegalArgumentException: argument type mismatch at com.baomidou.mybati…

华为OD机试 - 各位相加(Java)

一、题目描述 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 二、思路与算法 各位相加,使用递归,出口是结果的长度等于1。 三、Java算法源码 public static int addDigits(int num) {recursion(num);re…

vs2017如何创建一个asax文件

VS2017无法为网站创建Global.asax文件,导致出现错误WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。 解决方案如下: 勾选要应用的网站,这里我要应用的是ExSite 点击安装,然后点击确定即可。 此时&am…

单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

CAN总线和RS-485总线作为常用的工业通信总线,在许多工业领域中得到广泛使用。但随着工业应用的不断扩展和网络化的需求增加,它们面临着一些局限性。例如CAN总线虽然具有较高的通信速率和可靠性,但存在节点数量受限、数据传输距离短等问题。而…

Nginx总结

目录 Nginx介绍 Nginx的作用 反向代理 项目架构 实战:访问nginx服务器反向代理到另一台虚拟机上的tomcat服务器 负载均衡 项目架构 实战:访问nginx服务器,是否反向代理到集群中的任意一台tomcat服务器,停止一台tomcat服务器&…

JAVA16新特性

JAVA16新特性 概述 2021年3月16日正式发布,一共更新了17JEP https://openjdk.java.net/projects/jdk/16/ 一 语法层面 1_JEP 397:密封类(第二次预览) sealed class 第二次预览 通过密封的类和接口来增强Java编程语言,这是新的预览特性,用…

stream的collectors

起因的话&#xff0c;新进公司&#xff0c;看见了一段有意思的代码。 public final class MyCollectors {private MyCollectors() {}static final Set<Collector.Characteristics> CH_ID Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_F…

开源中国面试准备

dockerFile常见命令 1、FROM 设置要制作的镜像基于哪个镜像&#xff0c;FROM指令必须是整个Dockerfile的第一个指令&#xff0c;如果指定的镜像不存在默认会自动从Docker Hub上下载 2、MAINTAINER 镜像作者的信息&#xff0c;比如名字或邮箱地址 语法&#xff1a;MAINTAINER n…

HTTP第三讲——四层模型、七层模型

四层模型 TCP/IP 协议&#xff0c;它是 HTTP 协议的下层协议&#xff0c;负责具体的数据传输 工作。TCP/IP 协议是一个“有层次的协议栈”。 TCP/IP 当初的设计者真的是非常聪明&#xff0c;创造性地提出了“分层”的概念&#xff0c;把复杂的网络通信划分出多个层次&#xff…

免费矢量图标网站有哪些?

图标作为UI设计的必要元素&#xff0c;矢量图标是质量的保证。据说完美的用户体验应该从灵活性开始 。在响应设计盛行的当下&#xff0c;灵活矢量图标的重要性不言而喻。在这种情况下&#xff0c;风格齐全、质量上乘的矢量图标网站堪称设计宝藏。在这篇文章中&#xff0c;我们…

基于springboot的医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

读书笔记--数据治理之法

继续延续上一篇文章&#xff0c;对数据治理之法进行学习。数据治理之法是战术层面的方法&#xff0c;是一套涵盖8项举措的数据治理实施方法论&#xff0c;包括梳理现状与确定目标、能力成熟度评估、治理路线图规划、保障体系建设、技术体系建设、治理策略执行与监控、绩效考核与…

c++学习:STL之string类初识

目录 1.关于STL 1.什么是STL 2.STL的六的组件 2.关于string类的学习 1.为何学习string类 2.何为string类 3.string类对象的构造 4.容量操作 5.元素访问的操作 6.迭代器&#xff08;Iterators&#xff09; 7.修改类的操作 8.字符串操作 1.关于STL 1.什么是STL STL&a…

理解多态的实现原理

目录 概念&#xff1a; 特例&#xff1a; 协变&#xff1a; final&#xff1a; override: 抽象类、纯虚函数&#xff1a; 查表&#xff1a; 动态绑定&#xff1a; 概念&#xff1a; 就是多个不同的对象&#xff0c;在完成某种相同动作时&#xff0c;会产生多种不同的状态…

佩戴更舒适的骨传导耳机,音质也很出色,南卡 NEO体验

现在天气越来越好&#xff0c;特别适合户外运动&#xff0c;很多人跑步健身时都喜欢戴上一副骨传导耳机&#xff0c;听音乐的同时&#xff0c;还可以随时留意周围的交通状况。在国产的骨传导耳机里面&#xff0c;南卡是很受欢迎的一个品牌&#xff0c;而且旗下产品非常丰富&…

基于Redis优化验证码登录流程, 解决登录状态刷新问题

文章目录 1 问题: 多台Tomcat间session共享问题2 Redis代替session的业务流程分析2.1 设计key的结构2.2 设计Key的具体细节2.3 整体访问流程 3 基于Redis实现短信登录4 解决状态登录刷新问题4.1 初始方案问题4.2 优化方案4.3 代码 1 问题: 多台Tomcat间session共享问题 书接上…

Linux 内存分配/内存管理 相关接口

Linux 内存分配/内存管理 相关接口 分配栈内存alloca() 分配堆内存直接分配malloc() 分配初始化空间calloc() 分配对齐空间posix_memalign()aligned_alloc()过时&#xff1a;memalign()过时&#xff1a;valloc()过时&#xff1a;pvalloc() 修改块的大小realloc()reallocarray()…

20230506在Ubuntu22.04下使用python3下载合并ts切片

20230506在Ubuntu22.04下使用python3下载合并ts切片 2023/5/6 19:42 本文主要是和WIN7/WIN10下的差异比对&#xff01; 一、 Z:\1575\buquan-ts1574.py import requests from multiprocessing import Pool def mission(url,n): headers {"User-Agent":"M…

php语法基础

基础语法 1&#xff0c;php标记符 ①&#xff0c;XML风格 <?php echo "这是标准风格的标记"; ?>②脚本风格 <script language"php"> echo 这是脚本风格的标记; </script>③简短风格 <? echo "这是简短风格的标记"…

62.网页设计规则#8_视觉层次

什么是视觉层次&#xff1f; 视觉层次是关于确定设计中哪些元素是最重要的。视觉层次是为了吸引人们的注意力关注这些最重要的元素。视觉层次是关于为用户定义一个“路径”,引导他们浏览页面我们使用位置、大小、颜色、间距、边框和阴影的组合来建立元素/组件之间有意义的视觉…