当前位置: 首页 > article >正文

六十九:基于openssl实战验证RSA

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名领域。在实际开发和学习过程中,理解 RSA 的工作原理和使用场景非常重要。本文将以 OpenSSL 工具为基础,通过实例操作来验证和理解 RSA 的关键功能,包括密钥生成、加密解密以及签名验证。

一、准备工作

  1. 安装 OpenSSL 确保系统中已经安装了 OpenSSL。如果尚未安装,可以通过以下命令进行安装:

    • 在 Linux 系统中:

      sudo apt update && sudo apt install openssl
    • 在 macOS 系统中:

      brew install openssl
  2. 验证安装 执行以下命令确认 OpenSSL 已正确安装:

    openssl version

    输出版本号即表示安装成功。

二、RSA 密钥生成

RSA 密钥分为公钥和私钥,私钥用于解密和签名,公钥用于加密和验证签名。

  1. 生成私钥

    openssl genrsa -out private_key.pem 2048

    此命令生成一个 2048 位的 RSA 私钥,并保存到文件 private_key.pem

  2. 从私钥中提取公钥

    openssl rsa -in private_key.pem -pubout -out public_key.pem

    此命令提取私钥对应的公钥,并保存到文件 public_key.pem

三、加密与解密

使用生成的密钥进行加密和解密操作。

  1. 加密数据

    echo "Hello, RSA!" > plaintext.txt
    openssl rsautl -encrypt -inkey public_key.pem -pubin -in plaintext.txt -out encrypted.dat

    该命令使用公钥对文件 plaintext.txt 的内容进行加密,生成的密文保存到 encrypted.dat

  2. 解密数据

    openssl rsautl -decrypt -inkey private_key.pem -in encrypted.dat -out decrypted.txt
    cat decrypted.txt

    此命令使用私钥对密文进行解密,解密后的内容保存到 decrypted.txt 并输出。

四、签名与验证

RSA 签名和验证是数据完整性和身份认证的重要手段。

  1. 生成签名

    openssl dgst -sha256 -sign private_key.pem -out signature.dat plaintext.txt

    此命令使用私钥对文件 plaintext.txt 的内容生成 SHA-256 签名,签名保存到 signature.dat

  2. 验证签名

    openssl dgst -sha256 -verify public_key.pem -signature signature.dat plaintext.txt

    使用公钥验证签名是否正确。如果签名有效,将输出 Verified OK

五、注意事项

  1. 密钥保护 私钥是 RSA 安全性的核心,应妥善保存,防止泄露。可以为私钥设置密码保护:

    openssl genrsa -aes256 -out private_key.pem 2048

    此命令在生成私钥时会要求设置密码。

  2. 数据长度限制 RSA 加密的数据长度不能超过密钥长度减去填充字节数。对于长数据,建议使用混合加密方案:

    • 使用对称加密(如 AES)加密数据。

    • 使用 RSA 加密对称密钥。

六、总结

本文通过实际操作展示了使用 OpenSSL 进行 RSA 的密钥生成、加密解密以及签名验证的全过程。这些操作不仅有助于加深对 RSA 工作原理的理解,还为实际开发中的安全性需求提供了实践参考。

  目录:

一:浏览器发起 HTTP 请求的典型场景_浏览器如何发送用户名密码的请求-CSDN博客

二:基于ABNF语义定义的HTTP消息格式-CSDN博客     

三:网络为什么要分层:OSI模型与TCP/IP模型-CSDN博客   

四:HTTP的诞生:它解决了哪些网络通信难题?-CSDN博客      

五:评估Web架构的七大关键属性-CSDN博客          

六:从五种架构风格推导出HTTP的REST架构-CSDN博客          

七:如何用Chrome的Network面板分析HTTP报文-CSDN博客      

八:URI的基本格式及其与URL的区别-CSDN博客      

九:为什么要对URI进行编码?-CSDN博客      

十:详解HTTP的请求行-CSDN博客     

十一:HTTP 状态码详解:解读每一个响应背后的意义-CSDN博客      

十二:HTTP错误响应码:理解与应对-CSDN博客      

十三:如何管理跨代理服务器的长短连接?-CSDN博客     

十四:HTTP消息在服务器端的路由-CSDN博客     

十五:代理服务器转发消息时的相关头部-CSDN博客   

十六:请求与响应的上下文-CSDN博客   

十七:Web内容协商与资源表述-CSDN博客  

十八:HTTP包体的传输方式(1):定长包体-CSDN博客  

十九:HTTP包体的传输方式(2):不定长包体-CSDN博客

二十:HTML Form表单提交时的协议格式-CSDN博客

二十一:断点续传与多线程下载是如何做到的?-CSDN博客

二十二:Cookie的格式与约束-CSDN博客

二十三:Session及第三方Cookie的工作原理-CSDN博客

二十四:浏览器为什么要有同源策略?-CSDN博客

二十五:如何“合法”地跨域访问?-CSDN博客

二十六:Web条件请求的作用-CSDN博客

二十七:Web缓存的工作原理-CSDN博客

二十八:Web缓存新鲜度的四种计算方式-CSDN博客

二十九:复杂的Cache-Control头部解析-CSDN博客

三十:在 Web 中什么样的响应才会被缓存?-CSDN博客

三十一:HTTP多种重定向跳转方式的差异-CSDN博客

三十二:HTTP 协议的基本认证-CSDN博客

三十三:Wireshark的基本用法-CSDN博客

三十四:如何通过DNS协议解析域名?-CSDN博客

三十五:Wireshark的捕获过滤器-CSDN博客

三十六:Wireshark的显示过滤器-CSDN博客

三十七:WebSocket解决什么问题?-CSDN博客

三十八:WebSocket的约束-CSDN博客

三十九:WebSocket协议:实时通信的未来-CSDN博客

四十:如何从HTTP升级到WebSocket-CSDN博客

四十一:Web传递消息时的编码格式-CSDN博客

四十一:掩码及其所针对的代理污染攻击-CSDN博客

四十三:Web如何保持会话心跳-CSDN博客

四十四:HTTP/1.1发展中遇到的问题-CSDN博客

四十五:HTTP/2特性概述-CSDN博客

四十六:如何使用Wireshark解密TLS/SSL报文?-CSDN博客

四十七:h2c:在TCP上从HTTP/1升级到HTTP/2-CSDN博客

四十八:Web中带带封表的关系:帧,消息与流-CSDN博客

四十九:Stream流ID的作用-CSDN博客

五十:带号格式:带型及设置带的子型-CSDN博客

五十一:HPACK如何减少HTTP头部的大小?-CSDN博客

五十二:HPACK中如何使用Huffman树编码?-CSDN博客

五十三:HPACK中整型数字的编码-CSDN博客

五十四:HPACK中头部名称与值的编码格式-CSDN博客

五十五:服务器端的主动消息推送-CSDN博客

五十六:Stream的状态变迁-CSDN博客

五十七:RST_STREAM帧及常见错误码-CSDN博客

五十八:我们需要Stream优先级-CSDN博客

五十九:非TCP流量控制机制-CSDN博客

六十:HTTP/2与gRPC框架-CSDN博客

六十一:HTTP/2的问题及HTTP/3的意义-CSDN博客

六十二:HTTP/3: QUIC 协议格式-CSDN博客

六十三:七层负载均衡做了些什么?-CSDN博客

六十四:TLS协议的工作原理-CSDN博客

六十五:对称加密的工作原理(1):XOR与填充-CSDN博客

六十六:对称加密的工作原理(2):工作模式_电子密码本(ecb)模式-CSDN博客

六十七:详解AES对称加密算法-CSDN博客

六十八:非对称密码与RSA算法-CSDN博客


http://www.kler.cn/a/502686.html

相关文章:

  • 《自动驾驶与机器人中的SLAM技术》ch8:基于 IESKF 的紧耦合 LIO 系统
  • springboot
  • 细说STM32F407单片机以DMA方式读写外部SRAM的方法
  • 大数据运维管理体系的搭建
  • Leetcode刷题笔记—栈与队列
  • 【数据库系统概论】数据库恢复技术
  • 大疆机场及无人机上云
  • Maven中的dependencyManagement和dependencies
  • 【初识扫盲】厚尾分布
  • 利用 Python 爬虫获取 1688 商品评论的实践指南
  • 基于Python(Django)+SQLite3实现的(Web)资产管理系统
  • C++内存泄露排查
  • Go Ebiten小游戏开发:井字棋
  • Postgres14.4(Docker安装)
  • 【数据分析】一、初探 Numpy
  • 服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.
  • 行业案例:高德服务单元化方案和架构实践
  • 【开源免费】基于SpringBoot+Vue.JS企业级工位管理系统(JAVA毕业设计)
  • C++ 的 pair 和 tuple
  • 【江协STM32】11-1 SPI通信协议
  • UE5 打包项目
  • 【源码解析】Java NIO 包中的 Buffer
  • 新型物联网智能断路器功能参数介绍
  • Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
  • 【2024年华为OD机试】 (C卷,100分)- 工号不够用了怎么办?(Java JS PythonC/C++)
  • 【机器学习】数学知识:指数函数(exp)