JAVA:非对称加密技术的详细指南

news2024/12/23 4:44:21

请关注微信公众号:拾荒的小海螺
博客地址:http://lsk-ww.cn/

1、简述

非对称加密是一种加密技术,使用一对密钥进行数据加密和解密。这两个密钥分别是公开密钥(public key)和私有密钥(private key)。公开密钥和私有密钥是数学上相关联的,使用公开密钥加密的数据只能通过对应的私有密钥解密,反之亦然。与对称加密(如AES、DES)不同,非对称加密不使用同一个密钥进行加密和解密。

在这里插入图片描述

2、原理和场景

  • 非对称加密的工作原理
    密钥生成:生成一对密钥,包括公开密钥和私有密钥。
    加密:发送方使用接收方的公开密钥加密数据。
    解密:接收方使用自己的私有密钥解密数据。

这种机制确保了数据传输的安全性,因为即使加密数据在传输过程中被截获,没有私有密钥的情况下也是无法解密的。

  • 非对称加密的应用场景
    数据加密:确保数据传输的机密性。
    数字签名:验证数据的完整性和发送者的身份。
    密钥交换:安全地交换对称加密的密钥
    在这里插入图片描述

3、加密算法

Java提供了丰富的库来实现非对称加密,常见的算法有RSA、DSA、ECDSA、ElGamal等,以下列举了非对称加密算法的实例。

3.1 RSA (Rivest–Shamir–Adleman)

RSA是最常用的非对称加密算法之一,广泛应用于数据加密和数字签名。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;

public class RSAExample {

    public static void main(String[] args) {
        try {
            // 生成RSA密钥对
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPairGen.initialize(2048);
            KeyPair pair = keyPairGen.generateKeyPair();
            PublicKey publicKey = pair.getPublic();
            PrivateKey privateKey = pair.getPrivate();

            // 原始信息
            String message = "这是一个RSA加密示例";
            System.out.println("原始消息: " + message);

            // 加密
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedMessage = cipher.doFinal(message.getBytes());
            System.out.println("加密后的消息: " + new String(encryptedMessage));

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
            System.out.println("解密后的消息: " + new String(decryptedMessage));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
3.2 DSA (Digital Signature Algorithm)

DSA主要用于数字签名,确保数据的完整性和真实性。

import java.security.*;
import java.util.Base64;

public class DSAExample {

    public static void main(String[] args) {
        try {
            // 生成DSA密钥对
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
            keyPairGen.initialize(2048);
            KeyPair pair = keyPairGen.generateKeyPair();
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();

            // 原始信息
            String message = "这是一个DSA签名示例";
            System.out.println("原始消息: " + message);

            // 签名
            Signature sign = Signature.getInstance("SHA256withDSA");
            sign.initSign(privateKey);
            sign.update(message.getBytes());
            byte[] signature = sign.sign();
            System.out.println("签名: " + Base64.getEncoder().encodeToString(signature));

            // 验证签名
            sign.initVerify(publicKey);
            sign.update(message.getBytes());
            boolean isVerified = sign.verify(signature);
            System.out.println("签名验证结果: " + isVerified);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.3 ECDSA (Elliptic Curve Digital Signature Algorithm)

ECDSA是基于椭圆曲线的数字签名算法,比RSA和DSA提供更高的安全性和性能。

import java.security.*;
import java.util.Base64;

public class ECDSAExample {

    public static void main(String[] args) {
        try {
            // 生成ECDSA密钥对
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("EC");
            keyPairGen.initialize(256);
            KeyPair pair = keyPairGen.generateKeyPair();
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();

            // 原始信息
            String message = "这是一个ECDSA签名示例";
            System.out.println("原始消息: " + message);

            // 签名
            Signature sign = Signature.getInstance("SHA256withECDSA");
            sign.initSign(privateKey);
            sign.update(message.getBytes());
            byte[] signature = sign.sign();
            System.out.println("签名: " + Base64.getEncoder().encodeToString(signature));

            // 验证签名
            sign.initVerify(publicKey);
            sign.update(message.getBytes());
            boolean isVerified = sign.verify(signature);
            System.out.println("签名验证结果: " + isVerified);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.4 ElGamal

ElGamal是一种基于离散对数问题的加密算法,主要用于加密和密钥交换。

import java.security.*;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ElGamalParameterSpec;
import org.bouncycastle.jce.spec.ElGamalPrivateKeySpec;
import org.bouncycastle.jce.spec.ElGamalPublicKeySpec;
import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator;
import org.bouncycastle.crypto.params.ElGamalKeyGenerationParameters;
import org.bouncycastle.crypto.params.ElGamalParameters;
import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters;
import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;

public class ElGamalExample {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static void main(String[] args) {
        try {
            // 生成ElGamal密钥对
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("ElGamal", "BC");
            keyPairGen.initialize(256);
            KeyPair pair = keyPairGen.generateKeyPair();
            PublicKey publicKey = pair.getPublic();
            PrivateKey privateKey = pair.getPrivate();

            // 原始信息
            String message = "这是一个ElGamal加密示例";
            System.out.println("原始消息: " + message);

            // 加密
            Cipher cipher = Cipher.getInstance("ElGamal/None/PKCS1Padding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedMessage = cipher.doFinal(message.getBytes());
            System.out.println("加密后的消息: " + new String(encryptedMessage));

            // 解密
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
            System.out.println("解密后的消息: " + new String(decryptedMessage));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、结论

非对称加密算法在信息安全中扮演着重要的角色。通过Java中的JCA和BouncyCastle库,可以方便地实现各种非对称加密算法。这些算法各有优缺点,选择合适的算法需要根据具体应用场景来决定。

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

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

相关文章

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2)比较含退格的字符串 .1- 题目解析 .2- 代码编写 3)基本计算器 II .1- 题目解析 .2- 代码编写 4&…

进程状态、进程创建和进程分类

文章目录 进程进程常见的状态进程调度进程状态变化关系 进程标识示例--进程标识的使用以及简介 进程创建fork函数vfork函数示例--使用fork函数创建子进程,并了解进程之间的关系 创建进程时发生的变化虚拟内存空间的变化示例--验证fork函数创建进程时的操作 对文件IO…

【例题】lanqiao3226 宝藏排序Ⅱ

样例输入 5 1 5 9 3 7样例输出 1 3 5 7 9解题思路 这里的n≤10^5,说明O(n ^2)的算法行不通。 基于比较的高效算法和基于数值划分的高效算法全部参考这篇文章 代码 最简单的自带排序 nint(input()) alist(map(int,input().split()))a.sort() print( .join(map…

量化交易backtrader实践(二)_基础加强篇(1)_数据列表准备与主要实践内容

上一篇回顾 上一篇是数据获取篇,在上一篇里,我们初步接触了backtrader的回测逻辑,重点放在了回测的数据获取的问题上,确保了我们在用合适且有效的正规数据在做回测,我们的目的是要通过backtrader深入讨论量化交易的内…

【Linux进程控制】进程等待

目录 进程等待 进程等待是什么? 为什么? 怎么办? wait方法 获取子进程status 多进程的等待问题 waitpid方法 什么是阻塞等待?什么是非阻塞等待? wait/waitpid获取子进程信息原理 进程等待 进程等待是什么&am…

【AI学习】陶哲轩在 2024 年第 65 届国际数学奥林匹克(IMO)的演讲:AI 与数学

陶哲轩在 2024 年第 65 届国际数学奥林匹克关于AI 和数学的演讲,很有意思。陶哲轩的讲话语速太快了,足见其聪明! AI用于数学的一些方面: 陶哲轩介绍到刚刚被数学家接受并开始普及的方法:形式化证明辅助工具。 形式化…

API:连接数字世界的隐形纽带

在这个智能手机和应用程序无处不在的时代,你可能听说过API这个术语,但你知道它究竟是什么吗?API,全称为应用程序编程接口(Application Programming Interface),是一种让不同的软件和服务之间能够…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: A. 使用表存储数据,格式统一,便于维护。…

C++11第五弹:线程库 | 互斥锁 | 原子操作

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

蓝牙耳机是入耳式的好还是开放式的好?2024开放式耳机推荐

个人推荐入开放式耳机,戴起来更舒服,主要有以下几方面原因: 减少对耳部的压迫: 不入耳设计:开放式耳机通常不需要插入耳道,避免了对耳道的直接压迫。入耳式耳机的耳塞长时间塞在耳道内,会对耳…

Linux基础---07文件传输

Linux文件传输地图如下,先选取你所需的场景,若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网: 检查网络是否畅通命令:ping www.baidu.com,若有持续的返回值就说明网络畅通。Ctr…

前端基础知识(HTML+CSS+JavaScript)

文章目录 一、HTML1.1 HTML 基础:1.1.1 HTML 的概念:1.1.2 认识 HTML 标签:1.1.3 HTML 文件基本结构:1.1.4 标签层次结构: 1.2 HTML 快速入门:1.3 HTML常见标签:1.3.1 标题标签:h1-h…

数据结构-2.顺序表

1.线性表 线性是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表有: 顺序表 , 链表 , 栈 , 队列... 线性表在逻辑上是线性结构, 也就是连续的一条直线 . 但是在物理结构上并不是连续的, 线性表在物理上存储时, 通常以数组和链式结…

5-----RYZ维修工具 操作界面预览与功能操作解析 刷机 解锁 修复参数等等

以上是工具选项功能的界面预览 。通过预览可以看到很多功能选项。此类工具涵盖了很多操作区域。需要根据自己机型的实际需求来操作。根据开发者的描述。此工具有一下功能。包含mtk刷机 分区修复。9008刷机 备份基带efs等等。 高通操作区域 高通修复串码 高通修改写入基带qc…

石化盈科PMO总经理任志婷受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 石化盈科信息技术有限责任公司运营管理部总经理兼PMO总经理任志婷女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“激活关键的少数派——项目经理培养体系的设计实践”。大会…

无人机视角下落水救援检测数据集

无人机视角下落水救援检测数据集,利用无人机快速搜索落水者对增加受害者的生存机会至关重要,该数据集共收集12万帧视频图像,涵盖无人机高度从10m-60m高度,检测包括落水者(11万标注量)、流木(900…

TCP/IP - ICMP

目录 1. 帧格式2. ICMPv4消息类型(Type = 0,Code = 0)回送应答 /(Type = 8,Code = 0)回送请求(Type = 3)目标不可达(Type = 5)重定向(Type = 11)ICMP超时(Type = 12)参数3. ICMPv6消息类型回见TCP/IP 对ICMP协议作介绍 ICMP(Internet Control Message Protocol…

什么是快充协议,最常见的快充协议有哪些

什么是快充协议 随着手机快充的出现大家都知道快充技术但很多人确不知道快充协议,在快充技术里快充协议是必不可少的,那么今天我们就来探讨一下什么是快充协议? 快充协议是一种通过提高充电效率来缩短设备充电时间的电池充电技术。它通过在充…

商淘云九周年 分账系统助力企业合规发展

从2015到2024年,商淘云电商服务品牌已走过整整九个春秋。这九年,是商淘云不断发展壮大,深化品牌建设服务,并取得显著成效的九年,也是见证中国电商迅速崛起的九年。我们回顾九年的风雨历程,感受到企业的成长…