微服务实战系列之加密RSA

news2024/9/29 19:31:00

前言

在这个时代,我们选择的人生目标已丰富多彩,秉持的人生态度也千差万别:
除了吃喝玩乐,还有科技探索;
除了CityWalk,还有“BookWalk”
除了走遍中国,还有走遍世界;
凡此种种选择和坚持,都是为了播下一粒种子,期望一树梨花。

好了,我们暂且按下其他不表,言归正传。
“微服务实战系列”中,博主已完成了以下组件的介绍:

  • 微服务实战系列之Sentinel
  • 微服务实战系列之Token
  • 微服务实战系列之Nacos
  • 微服务实战系列之Gateway

此时,博主不禁灵机一动,发起灵魂一问:
当我们希望跨时空沟通,又要防止别人偷窥干扰,应该怎么办?
显然以上4个组件不符合要求,自然望洋兴叹、无能为力。奈何博主也身不怀绝技,自觉闷闷不乐中…

那到底怎么办呢?当然有问题就有办法,欢迎今天的主人公闪亮登场:RSA


在正式掌握RSA之前,我们先了解一下密码学中的基本概念和常用术语。

一、密码学

密码学(在西欧语文中,源于希腊语kryptós“隐藏的”,和gráphein“书写”)是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。著名的密码学者Ron Rivest解释道:“密码学是关于如何在敌人存在的环境中通讯”,自工程学的角度,这相当于密码学与纯数学的异同。密码学是信息安全等相关议题,如认证、访问控制的核心。密码学的首要目的是隐藏信息的涵义,并不是隐藏信息的存在。密码学也促进了计算机科学,特别是在于电脑与网络安全所使用的技术,如访问控制与信息的机密性。密码学已被应用在日常生活:包括自动柜员机的芯片卡、电脑使用者存取密码、电子商务等等。
密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。

1. 安全标准
  • 信息的保密性 Confidentiality:
    防止信息泄漏给未经授权的人(加密解密技术);
  • 信息的完整性 Integrity:
    防止信息被未经授权的篡改(消息认证码,数字签名);
  • 认证性 Authentication:
    保证信息来自正确的发送者(消息认证码,数字签名);
  • 不可否认性 Non-repudiation:
    保证发送者不能否认他们已发送的消息(数字签名);
2. 基本术语
  • 密钥:分为加密密钥和解密密钥。
  • 明文:没有进行加密,能够直接代表原文含义的信息。
  • 密文:经过加密处理处理之后,隐藏原文含义的信息。
  • 加密:将明文转换成密文的实施过程。
  • 解密:将密文转换成明文的实施过程。
  • 密码算法:密码系统采用的加密方法和解密方法,随着基于数学密码技术的发展,加密方法一般称为加密算法,解密方法一般称为解密算法。
  • 加密(encryption)算法:将普通信息(明文,plaintext)转换成难以理解的资料(密文,ciphertext)的过程;
  • 解密(decryption)算法则是其相反的过程:由密文转换回明文;加解密包含了这两种算法,一般加密即同时指称加密(encrypt或encipher)与解密(decrypt或decipher)的技术。

在这里插入图片描述

二、RSA

初步学习了密码学的基本知识后,接下来,我们该谈谈今天的主人公——RSA了。
不过博主今天不谈数论,不谈公式,只带着各位盆友了解RSA是怎么理论联系实际的。

1. 名词解释

RSA:一般指RSA加密算法。RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。

这里提到一个关键的词:非对称加密算法。这是个什么东东?继续名词解释。

公钥加密,也叫非对称(密钥)加密(public key encryption),属于网络安全二级学科,指的是由对应的一对唯一性密钥(即公开密钥和私有密钥)组成的加密方法。
它解决了密钥的发布和管理问题,是商业密码的核心。在公钥加密体制中,没有公开的是私钥,公开的是公钥。

纵观以上定义,我们发现RSA原来是靠一组密钥对在工作。
简言之,公钥即public key,可以公开的密钥;私钥即private key,不可公开的密钥。

2. 工作原理

首先,在RSA的世界里,请记住一个口诀:公钥加密,私钥解密。请看以下大屏幕:
在这里插入图片描述
由乙方(可以理解为密钥对创建人),私钥自己保管,公钥向甲方开放。
当甲方需要向乙方传输消息时,可以使用乙方提供的公钥进行加密,如此便可防止“偷窥者”干扰,进而避免敏感数据泄密。乙方收到消息后,可以使用自己保管的私钥进行解密,实现数据利用。

3. 实际应用

在我们实际应用场景中,大致分几步完成RSA的加密和解密。

3.1 创建密钥对KeyPair
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//初始化
keyPairGenerator.initialize(1024);//RSA默认长度,推荐至少>=1024
//获取密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
3.2 获取公钥publicKey
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
3.3 获取私钥privateKey
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
3.4 加密
public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        int inputLen = data.getBytes().length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offset = 0;
        byte[] cache;
        int i = 0;
        // 对数据分段加密
        while (inputLen - offset > 0) {
            if (inputLen - offset > 117) {
                cache = cipher.doFinal(data.getBytes(), offset, 117);
            } else {
                cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
            }
            out.write(cache, 0, cache.length);
            i++;
            offset = i * 117;
        }
        byte[] encryptedData = out.toByteArray();
        out.close();
        // 加密后的字符串,并以UTF-8为标准转化成字符串
        return new String(Base64.encodeBase64Str(encryptedData));
    }
3.5 解密
public static String decrypt(String data, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] dataBytes = Base64.decode(data);
        int inputLen = dataBytes.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offset = 0;
        byte[] cache;
        int i = 0;
        // 对数据分段解密
        while (inputLen - offset > 0) {
            if (inputLen - offset > 128) {
                cache = cipher.doFinal(dataBytes, offset, 128);
            } else {
                cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
            }
            out.write(cache, 0, cache.length);
            i++;
            offset = i * 128;
        }
        byte[] decryptedData = out.toByteArray();
        out.close();
        // 解密后的内容 
        return new String(decryptedData, "UTF-8");
    }

综上,关于如何使用RSA加密算法进行数据传输,已完成相关介绍,希望有助于各位盆友理解并学会如何使用它。


结语

通过以上叙述,期望各位盆友可以一文学会如何使用RSA加密和解密。当然RSA绝技显然不止于此。让我们一步一步走向胜利,享受知识带来的快乐吧!GoodNight
在这里插入图片描述

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

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

相关文章

Me-and-My-Girlfriend-1

Me-and-My-Girlfriend-1 一、主机发现和端口扫描 主机发现,靶机地址192.168.80.147 arp-scan -l端口扫描,开放了22、80端口 nmap -A -p- -sV 192.168.80.147二、信息收集 访问80端口 路径扫描 dirsearch -u "http://192.168.80.147/" -e * …

Linux进程通信——消息队列

概念 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点 1.消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。(消息队列是结构体) 2.消息队列独立于发送与接…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么?|小程序网站搭建 在当今数字化时代,企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率,许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

数据库基础入门 — SQL

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…

n-皇后问题(DFS回溯)

n−皇后问题是指将 n 个皇后放在 nn的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包含整数 n。 输出…

Python的安装及其python程序生成exe可执行程序

Python是一种高级编程语言,由Guido van Rossum在1989年12月首次发布。它具有简单易学、易读、易写的语法和强大的动态类型和垃圾回收机制。Python解释器是自由且开放源代码的软件,可以在各种操作系统(如Linux、Windows、macOS等)上…

SSM框架(一):Spring 容器

文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例:配置数据库4.…

软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具

目录 1 前言2 符号及作用:3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时,实体关系图(ER图)无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…

Android codec2 视频框架之输出端的内存管理

文章目录 前言setSurfacestart从哪个pool中申请buffer解码后框架的处理流程renderOutbuffer 输出显示 前言 输出buffer整体的管理流程主要可以分为三个部分: MediaCodc 和 应用之间的交互 包括设置Surface、解码输出回调到MediaCodec。将输出buffer render或者rele…

可用于短期风速预测及光伏预测的LSTM/ELM预测程序

微❤关注“电气仔推送”获得资料(专享优惠) 程序内容: 该程序是预测类的基础性代码,程序对河北某地区的气象数据进行详细统计,程序最终得到pm2.5的预测结果,通过更改数据很容易得到风速预测结果。程序主要…

U盘系统制作

一、简介 目标:将Linux和Windows系统装进U盘,linux称为LTG、Windows称为WTG 环境: 1、使用Rufus工具进行操作 2、基于windows系统进行Rufus软件进行制作 3、使用联想Y7000作为测试U盘系统启动测试机器(无系统盘) 优点…

CAD文件转奥维 转shapefile

之前写过一篇CAD转ArcGIS 其实万变不离其宗,都是经纬度知识的应用。 背景是当我们拿到一份带有坐标的CAD文件如何转换为矢量文件。 首先我们要明白XY坐标系的含义。 X—real X-500000 为近距离标准经线的距离。 y 为距离赤道的距离。 X 429174.3048 Y 32313…

Java 多线程之 volatile(可见性/重排序)

文章目录 一、概述二、使用方法三、测试程序3.1 验证可见性的示例3.2 验证指令重排序的示例 一、概述 在Java中,volatile 关键字用于修饰变量,其作用是确保多个线程之间对该变量的可见性和禁止指令重排序优化。 当一个变量被声明为volatile时&#xff0…

暴力求解欲哭无泪之保安问题

身为程序员哪一个瞬间让你最奔溃? > 提醒:在发布作品前,请把不需要的内容删掉。 方向一:身为程序员遇到过的奔溃瞬间 写题目想到第一个方法便是暴力求解,然后少情况 题目如下: 方向二:如何解决遇到的奔溃瞬间 不…

Arduino驱动Si7021温湿度传感器(温湿度传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Si7021温湿度传感器,应用了专用的数字模块采集技术和温湿度传感技术,具有极高的可靠性与卓越的长期稳定性。同时其体积小巧、精度高,特别是拥有毫秒级测试转换时间(DHT系列需要约2s的转换时间),启动测量与读…

2023.11.19使用flask制作一个文件夹生成器

2023.11.19使用flask制作一个文件夹生成器 实现功能: (1)在指定路径上建立文件夹 (2)返回文件夹的路径和建立成功与否的提示 main.py import os from flask import Flask, request, jsonify, render_templateapp F…

生态系统NPP及碳源、碳汇模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…

微信关键词自动回复有什么用?

微信关键词自动回复有什么用? 关键词回复可以帮助解答客户的高频次问题。 假如,微信可以设置自动回复。。。 你还在担心一个个通过好友手动发欢迎语吗? 遇到常规问题,不用再复制粘贴那个已经回答了一百遍的答案吗?…