【阿一网络安全】如何让你的密码更安全?(二) - 非对称加密

上次《【阿一网络安全】如何让你的密码更安全?(一) - 对称加密》提到加密算法的对称加密,我们这次来聊聊非对称加密。

和对称加密不同,非对称加密的加密密钥和解密密钥不同。

非对称加密

大概过程就是,发送方使用公钥对明文数据进行加密,把密文发送给接收方,接收方收到密文,用私钥进行解密。如图所示:

在我们使用对称加密的时候,不仅要约定好发送、接收方的密钥,还要担心密钥泄漏。而在非对称加密中,不需要担心这个问题,公钥本身就是公开的,不需要额外对其进行保密,可以把公钥发给所有需要的人。

非对称加密,除了加密功能之外,部分非对称算法还提供了签名功能(确保明文数据的完整性和真实性,并不是保密性)。

发送方用私钥对明文数据进行加密,得到签名。接收方收到明文数据和签名后,用发送方的公钥解密签名,并将结果与明文数据比对。如果匹配,就证明这段消息确实是发送方发送的且没有被篡改。

非对称加密的核心思想,是基于特定的数学难题设计的,特点就是:

  1. 正向计算容易
  2. 反向计算在计算上不可行(在合理的时间内无法完成)

经典且广泛使用的非对称加密算法包括这几种,RSA、ECC和国密的SM2。

RSA

RSA是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用,是由 Ron Rivest、Adi Shamir 和Leonard Adleman 三人一起提出,RSA就是他们三人姓氏的首字母组成。

RSA的安全性,基于 大整数因子分解 的数据难题,换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。它使用两个不同的密钥进行加密,公钥用于加密,私钥用于解密。

密钥的生成

公钥和私钥,都是由 发送方 约定并生成的。

  1. 选择两个大的质数 p 和 q,p ≠ q,计算 N = p * q
  2. 计算欧拉函数 φ(N) = φ§ * φ(q) = (p - 1) * (q - 1)
  3. 选择一个小于 φ(N) 的整数 e,使得 e 与 φ(n) 互质
  4. 计算 e 关于 φ(N) 的模逆元 d,使得 d * e ≡ 1(mod φ(N))

公钥 = (N, e)。

私钥 = (N, d)。

加密

c = me mod N

假设发送方想把明文 m 发送给接收方,就可以按照这个公式把 明文 m,加密成 密文 c 发送给接收方。

解密

m = cd mod N

与加密类似,接收方获取到 密文 c,可以按照这个公式 把 密文 c,解密成 明文 m。

数字签名

RSA也可以用作 数字签名。

接收方 想给 发送方 发消息的话,可以把 他想要发的消息明文计算一个 散列值(Message Digest),然后用私钥 加密 这个 散列值 并放在消息明文后一起发送给发送方。

发送方 收到 接收方发送的消息后,把密文用 公钥 进行解密,然后和 发送发自己对这个 消息明文 的计算的散列值相比较,如果二者一致的话,那么就可以确保该消息 是接收方发送的,并且没有被篡改过。

安全性

  • 安全性基于 大整数因子分解的困难性。
  • 密钥长度 一般为 2048 或 4096 位。目前推荐的长度至少位 2048位。

优缺点

优点:

  • 原理相对简单
  • 可用于加密,也可用于数字签名
  • 广泛使用

缺点:

  • 计算速度慢
  • 可能受到量子计算机的威胁

实际应用

  • HTTPS 协议
  • SSH 安全连接
  • 数字证书

虽然RSA的理论基础相对简单,但是实际使用过程中,需要考虑很多的细节,比如填充方案,密钥管理,性能优化等。

ECC

ECC(椭圆曲线密码学,Elliptic Curve Cryptography),是一种基于椭圆曲线数学的公开密钥加密算法。

对比RSA的主要优势在于,使用较小的密钥长度就能提供相当级别的安全性,使得它特别适合资源受限的环境下使用,比如移动设备和物联网设备。

ECC 的安全性,基于椭圆曲线离散对数问题(ECDLP)的困难性,在椭圆曲线上,已知点P 和 点Q,找到整数k使得 Q = kP 是困难的。

密钥的生成

  1. 选择椭圆曲线 E 和 基点 G
  2. 选择 私钥 d (随机大整数)
  3. 计算 公钥 Q = dG

加密

  1. 选择随机数 r
  2. 计算 R = rGS = rQ
  3. 使用 S 的 x坐标 作为对称密钥 加密

解密

  1. 计算 S = dR
  2. 使用 S 的 x坐标 作为对称密钥 解密

数字签名

签名:

  • 选择随机数 k
  • 计算 R = kG,r 为 R 的 x坐标
  • 计算 s = k-1 (H(m) + dr) mod n
  • 签名为 (r, s)

验证:

  • 计算 u1 = H(m)s-1 mod nu2 = rs-1 mod n
  • 计算 V = u1G + u2Q
  • 如果 V 的x坐标等于r,则签名正确

安全性

  • 基于 椭圆曲线离散对数问题的困难性
  • 密钥最小长度为 224位,对应的对称加密密钥的长度为 128位

优缺点

优点:

  • 使用更短的密钥获得相同的安全性,最小224位
  • 计算速度更快
  • 资源耗费低

缺点:

  • 量子计算攻击
  • 无效曲线攻击
  • 后门
  • 旁路攻击

实际应用

  • TLS / SSL
  • 移动设备安全
  • 物联网设备
  • 加密货币

虽然ECC的数学基础看起来更复杂,但是他的计算效率更加的高效。它的高效性使得它广泛用于许多加密货币中。实现过程中仍然需要注意一下细节,比如曲线的选择、随机数的生成等。

SM2

SM2是我国国家密码管理局发布的一种公钥密码算法,属于国家商用密码,算法公开。

它基于ECC(椭圆曲线密码学),但有其特定的参数和实现细节,加密强度和ECC相当。

密钥的生成

  1. 生成随机数 d ∈ [1, n-1],其中 n 是椭圆曲线的阶
  2. 计算 公钥 P = dG ,G为基点

加密

  1. 生成随机数 k ∈ [1, n-1]
  2. 计算点,(x1, y1) = kG,(x2, y2) = kP,P为接收方公钥
  3. 使用对称加密算法 SM4加密消息,密钥为 x2
  4. 然后加密明文

解密

  1. 计算点,(x2, y2) = d(x1, y2),d为接收方私钥
  2. 使用对称加密算法 SM4解密密文,密钥 为 x2

数字签名

签名:

  1. 对 消息 M进行摘要处理(SM3),得到 e = H(M),H为哈希函数
  2. 生成随机数 k ∈ [1, n-1]
  3. 计算点,(x1, y1) = kG
  4. 计算 r,r = (e + x1) mod n,如果 r = 0 或者 r + k = n,则重新选择 k
  5. 计算 s,s = ((1 + d)-1 * (k - r * d)) mod n,如果 s = ,则重新选择 k
  6. 签名为 (r, s)

验证:

  1. 检查 r,s ∈ [1, n-1]
  2. 计算 e,e = H(M)
  3. 计算 t,t = (r + s) mod n,如果 t = 0,则签名无效
  4. 计算点,(x1, y1) = sG + tP
  5. 计算 R,R = (e + x1) mod n,如果 R = r,则签名有效,否则签名无效

安全性

  • 采用256的椭圆曲线
  • 不可伪造、不可否认性
  • 有效防止中间人攻击
  • 前向安全性,即使长期泄露密钥,也不会影响之前会话的安全性

优缺点

优点:

  • 基于ECC,使用更短的密钥获得相同的安全性
  • 效率高
  • 为我国国家密码管理局发布的标准算法,具有良好的兼容性和标准化支持
  • 不仅支持加解密,还支持数字签名,能够满足多种安全需求
  • 本地化,配套使用SM3

缺点:

  • 主要在国内使用,国际化可能存在兼容性问题
  • 实现复杂

实际应用

  • 被广泛用于政府部门、金融机构和大型企业的信息系统中
  • 电子政务、电子商务、可信计算等多个领域

总结

本文主要简单介绍了非对称加密算法 RSA、ECC 和 SM2 的基本原理,以及它们的实现过程。对比对称加密,非对称加密算法的最大优势就是保障了密钥分发的安全性、支持数字签名。

因此,现在大部分的认证和签名场景,其实使用的都是非对称加密算法。比如,在SSH登录、Git上传等场景中,我们都可以将自己的公钥上传到服务端,然后由客户端保存私钥。

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

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

相关文章

mac 安装redis

官网下载指定版本的redis https://redis.io/ 目前3.2.0 是最新最稳定的 版本 这里是历史版本下载 下载指定版本 安装 1.放到自定义目录下并解压 2.打开终端,执行命令 cd redis的安装目录下 make test -- 此命令的作用是将redis源代码编译成可执行文件&#xff0c…

SPI驱动学习五(如何编写SPI设备驱动程序)

目录 一、SPI驱动程序框架二、怎么编写SPI设备驱动程序1. 编写设备树2. 注册spi_driver3. 怎么发起SPI传输3.1 接口函数3.2 函数解析 三、示例1:编写SPI_DAC模块驱动程序1. 要做什么事情2. 硬件2.1 原理图2.2 连接 3. 编写设备树4. 编写驱动程序5. 编写app层操作程序…

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.…

微带结环行器仿真分析+HFSS工程文件

微带结环行器仿真分析HFSS工程文件 工程下载:微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件,它表明…

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 …

在Ubuntu上运行QtCreator相关程序

背景:希望尝试在Linux系统上跑一下使用QtCreator相关的程序,因为有一些工作岗位要求有Linux上使用Qt的经验。 (1)我是把Windows上的程序移过来的,Windows上文件名称是不区分大小写的。 而Ubuntu上是区分的 所以一部分头文件需要进行修改&am…

idea创建SpringBoot项目

目录 1. 新建一个SpringBoot项目 2. 使用Springboot官网创建项目 3. 使用阿里云地址创建SpringBoot项目 4. 使用maven创建SpringBoot项目 5. 在Idea中隐藏指定文件/文件夹 1. 新建一个SpringBoot项目 Springboot2 要求jdk版本: 1.8 maven: 3.3 内嵌的tomcat: tomcat9 我们…

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,1,2001,2,1200,2,2000…

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言(UML)中的一种静态结构图,主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分,用于对系统的词汇进行建模、对…

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行…

93. UE5 GAS RPG 应用负面效果表现

在上一篇文章里,我们实现了添加负面效果GE,并且在添加GE时,也会给角色应用一个负面效果标签作为标识。在这一篇里,我们将通过负面效果标签标识,应用角色身上展现对应的负面效果的表现。 我们将在这篇文章里添加一个自定…

【c++进阶[五]】list相关接口介绍及list和vector的对比

💓博主CSDN主页::Am心若依旧💓 ⏩专栏分类c从入门到精通⏪ 🚚代码仓库:青酒余成🚚 🌹关注我🫵带你学习更多c   🔝🔝 1.前言 本章重点 本章重点讲解list的接口函数的熟悉&#xf…

Linux-RPM与YUM

目录 前言: rpm包的管理 rpm包的简单查询指令 ​编辑 rpm包名的基本格式 rpm包名基本格式 ​编辑 卸载rpm包 细节问题 安装rpm包 yum yum的基本指令 安装指定的yum包 yum报错 问题描述: 解决方法: 前言: Linux操…

电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法

我们的电脑使用硬盘作为存储设备来保存数据,硬盘里的数据是存储在扇区上,这些存储数据的单元则位于表面有磁性材料的旋转的盘片上。硬盘内部的磁头悬浮于高速旋转的盘片上,用于读写和检索数据。 假如我们使用电脑时不小心删除了某个文件&…

Vue3使用Uni-ui的popup弹出层组件

由于uni-ui中有些组件文档的基于vue2编写的,比如popup组件 下面是vue3的写法 除了文档中要求的aleterDialog外,还得利用v-if设置一个isDialog判断 // template // script 解决

Linux基础2-权限2(操作权限,粘滞位,umask,目录文件的rwx权限)

上篇内容:Linux基础2-权限1(用户,权限是什么?)-CSDN博客 目录 一. 权限的操作(命令) 1.1 chmod 1.2 chown 1.3 chgrp 二. 粘滞位 三. umask(遮掩码) 四. 目录文件的 r w x 权限 一. 权限…

Ubuntu22.04版本左右,开机自动启动脚本

Ubuntu22.04版本左右,开机自动启动脚本 1. 新增/lib/systemd/system/rc-local.service中[Install]内容 vim /lib/systemd/system/rc-local.service 按 i 进入插入模式后,新增内容如下: [Install] WantedBymulti-user.target Aliasrc-local.…

如何读.Net Framework 的源码?

.Net Framework的源码可以从这里下载 Download 也可以在线直接浏览 https://referencesource.microsoft.com 这里我们以System.IO.Directory.CreateDirectory函数为例,来说明如何去读.Net Framework的源码。 在ReferenceSource在线界面的搜索框里输入Directory.Cr…