加解密与HTTPS(2)

news2024/10/2 6:51:04

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

近些天由于完全放开,我也从“杨过”变成了“杨康”,加之家中亲人故去,所以长久未能更新,特此致歉~


上次说了对称加密算法,这次来说说另外一种加密算法:非对称加密算法。

和对称加密算法不同,在非对称加密算法中,信息的收发双方需要各持有两个密钥:公钥和私钥。公钥和私钥是成对出现的:公钥必须公开,而私钥必须保密。

发送者A用接收者B的公钥加密,接收者B用自己的私钥解密。整个过程是这样的:

 

有几种常用的非对称加密算法:

1、RSA/DSA

2、ECDSA/ECC

3、PKCS

RSA是一种非常常见的非对称加密算法,它的加密和解密算法也都是公开的,其运行机制用一句简单的话来说就是几乎「不可能通过公钥推导出私钥」。

非对称加密算法产生的密钥都是成对出现的,一个公开的公钥,一个由用户自己保存的私钥。

RSA被认为是最优秀的非对称加密方案之一,支付宝的支付接口调用使用的就是RSA。

「不可能通过公钥推导出私钥」的机制,是建立在大整数因子分解的困难性上的,其安全性能够抵抗目前为止已知的绝大多数密码攻击。RSA的加密解密过程如下:

 

可以看到,如果要得到一个能够产生1024位或2048位二进制的质数乘积,参与运算的两个质数一定都是天文数字。对质数的乘积进行因式分解极其困难,即使是使用计算机也一样,因为素因子太多。这就是为什么可以说几乎「不可能通过公钥推导出私钥」的原因。

DSA和RSA的主要不同在于它不用作加密和解密,只用作签名,银行自助柜台、金融APP上的签名软件用的就是它。DSA签名生成速度很快,但验证速度比较慢,加密时更慢,解密却很快,这一点与RSA相反,其安全性与RSA差不多。实际上,OpenSSH 7.0及以上版本默认禁用了DSA算法。

全称椭圆曲线加密(Elliptic curve cryptography),以太坊的比特币地址就是用它生成的(比特币椭圆曲线采用的是secp256k1算法:y2 = x3 + 7)。ECC的数学基础是黎曼几何中的无穷远点性质、群率(GROUP LAW)公式,解释起来非常麻烦。

下面可以通过OpenSSL来演示比特币的加密与解密过程。这个OpenSSL在Linux上一般都是默认安装了的,Windows上面的安装可以问问度娘。

第一步:生成ECC私钥

# openssl ecparam -name secp256k1 -genkey > private.pem

# 查看结果

# cat private.pem

输出DER格式

# openssl ec -in private.pem -outform DER | tail -c +8 | head -c 32 | xxd -p -c 32 > private.der

# cat private.der

# 查看结果

# 777cba7ba9b5d29a9f27ce67e8e88cce40abe5099e2bc8db4eaa14794726b5a2

第二步:生成ECC公钥

通过private.pem生成未压缩公钥

# openssl ec -in private.pem -pubout -outform DER | tail -c 65 | xxd -p -c 65 > public.der

# 查看结果(未压缩公钥 = 前缀04 + x坐标 + y坐标)

# cat public.der

# 044d678b6b0870adbe3419dcce114600fd1a19a660925ad82e61c23489218baf847e2f550371b8ffe405913e9a3b6c3954f0e186bd2bf7769a62ea9fcf1c592d25

# 压缩公钥(前缀03 + x(如果y是奇数),前缀02 + x(如果y是偶数))结果

# 03edc773f78984a68dcad837d7fdf088c2efd434a088d9d6d1a7dc1e8770ea0b

第三步:执行Hash160运算

先执行SHA256操作,再进行RMD160运算

# openssl sha256 public.der

# 结果

# 8674a407487bb7808bbb2c1ac12603f1f3a480e98c01abbebd03477c5179f974

# 保存结果

# echo 8674a407487bb7808bbb2c1ac12603f1f3a480e98c01abbebd03477c5179f974 > public_sha256.der

# openssl ripemd160 public_sha256.der

# 结果

# 9870db0ccf40cfd970b503fb031c889d089a4cd4

# 保存结果

# echo 9870db0ccf40cfd970b503fb031c889d089a4cd4 > public_rmd160.der

第四步:添加ECC前缀

可以给第3步结果加上Bitcoin的地址前缀(具体地址可以问度娘),例如,普通主网地址是00

# 00 + 9870db0ccf40cfd970b503fb031c889d089a4cd4

# 结果

# 009870db0ccf40cfd970b503fb031c889d089a4cd4

# 保存结果

# vi public_rmd160.der

# 在前面增加00,保存退出

# 查看结果

# cat public_rmd160.der

第五步:执行SHA256

执行两次SHA256,取前8位作为校验和

# openssl sha256 public_rmd160.der

# echo c6349f1cb358dcd7af0dc8fd4cf7aa82293142eea7d97f45c83e86595ac22c04 > public_sha256.der

# openssl sha256 public_sha256.der

# 结果

# 9550d445c36fc5d37cadfa1fff385121388a7e15d05fc78244c30e8aa9647908

# 取前八位

# 9550d445

第六步:第四步和第五步结果合并

# 第四步结果

# cat public_rmd160.der

# 009870db0ccf40cfd970b503fb031c889d089a4cd4

# 第五步结果

# 9550d445

# 结果合并

# echo 009870db0ccf40cfd970b503fb031c889d089a4cd49550d445 > public_result.der

第七步:执行Base58编码

Base59编码是一种独特的编码方式,是Base64的变形,主要用于比特币的钱包地址。

出于演示目的,仅用Base64执行编码

# openssl base64 -in public_result.der

# 结果

# MDA5ODcwZGIwY2NmNDBjZmQ5NzBiNTAzZmIwMzFjODg5ZDA4OWE0Y2Q0OTU1MGQ0NDUK

小知识:在比特币系统中,通过私钥能得到公钥,通过公钥能得到钱包地址,也就是:私钥 => 公钥 => 钱包地址,而反向是不可以的。

PKCS全称公钥加密标准(Public-Key Cryptography Standards),是由RSA公司设计、发布的一系列安全标准。主要用于证书申请、更新、作废、数字签名、数字信封等创建。例如目前苹果的IOS使用的就是PKCS12标准的证书。

还是以OpenSSL生成PKCS12为例说明。

第一步:密钥生成和使用

生产一个1024位的私钥,保存在rsa_private_key.pem里

# openssl genrsa -out rsa_private_key.pem 1024

通过私钥生产公钥,保存在rsa_public_key.pem里

# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第二步:生成pkcs12文件

密钥库keyrepo.p12,密码123456,有效期1天

# keytool -genkey -v -alias root -keyalg RSA -storetype PKCS12 -keystore keyrepo.p12 -dname "CN=www.company.com,OU=company,O=公司,L=武汉,ST=湖北,C=中国" -storepass 123456 -keypass 123456 -validity 1

生成客户端证书

# keytool -genkey -v -alias p12client -keyalg RSA -storetype PKCS12 -keystore keyrepo.p12 -dname "CN=www.company.com,OU=company,O=公司,L=武汉,ST=湖北,C=中国" -storepass 123456 -keypass 123456 -validity 1

查看已生成的证书

keytool -list -v -alias p12client -keystore keyrepo.p12 -storepass 123456 -storetype PKCS12

将p12证书导出为.cer格式

keytool -export -alias p12client -keystore keyrepo.p12 -storetype PKCS12 -storepass 123456 -rfc -file p12.cer

# 查看.cer文件

keytool -printcert -v -file /p12.cer

可以看到,PKCS生成密钥的过程比ECC简单多了。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

利用python实现热力学地图(保姆式讲解)

一、首先展示最终的效果 对二手房房源的分析,将分析后的结果用热力图显示: 显示效果如下所示&#xff1a; heatMap参考代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <!DOCTYPE html> <head><meta http-equiv&q…

一起看跨年烟花(流行背景音乐+雪花)---- 系列

2023年快要到来啦&#xff0c;很高兴这次我们又能一起度过~ 目录 一、前言 二、跨年烟花 三、效果展示 四、详细介绍 五、编码实现 index.html js 六、获取代码 需要源码&#xff0c;可以私信我(⊙o⊙)&#xff1f;关注我&#xff1f; 一、前言 时光荏苒&#xff0c;白…

数据结构-树

1、树的分类 &#xff08;1&#xff09;满二叉树 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是满二叉树。也就是说&#xff0c;如果一个二叉树的层数为K&#xff0c;且结点总数是(2^k)-1&#xff0c;则它就是满二叉树。 &#xff08;2…

ThingsKit物联网平台 v1.0.1-Release版本发布

基于ThingsBoard二次开发的物联网平台推荐&#xff1a;ThingsKit物联网平台&#xff0c;开箱即用的物联网低代码平台&#xff0c;提供N1N的产品服务体系&#xff0c;帮助企业快速搭建稳定可靠的物联网系统平台&#xff0c;为企业节省大量时间及人力成本。www.thingskit.com Th…

centos7安装k3s和rancher

文章目录一. 安装k3s1.1 关闭防火墙1.2 修改hostname1.3 安装containerd1.4 containerd安装mysql81.5 安装k3s1.6 卸载k3s二. 安装rancher2.1 安装helm2.1.1 下载2.1.2 安装2.1.3 添加几个repo2.1.4 报错2.2 helm安装ingress-nginx2.3 添加rancher repo2.4 helm安装rancher(自己…

读论文---Clip微调---CLIP Itself is a Strong Fine-tuner

标题 摘要 Recent studies have shown that CLIP has achieved remarkable success in performing zero-shot inference while its fine-tuning performance is not satisfactory. In this paper, we identify that fine-tuning performance is significantly impacted by hyp…

复杂并发场景下的并发调度模型在转转的演进之路

文章目录一、问题背景二、复杂并发场景释义2.1 简单并发场景2.2 复杂并发场景三、分组并发调度模型演进3.1 简单异步并发调度3.2 分组并发调度四、自驱动并发调度模型演进4.1 一个优化耗时的小目标及其实现4.2 下一步的疑惑4.3 对问题的重新思考以及自驱动并发调度模型的诞生4.…

蓝桥集训(附加面试题)第八天

本文来源于算法面试题特训专栏&#xff0c;这里有大量专业性的算法题比如&#xff08;动态规划21天&#xff0c;大厂特训28天等等&#xff09; 欢迎大家一起学习。 链接&#xff1a;传送门 目录标题导读Java蓝桥集训面试题点击直接资料领取导读 在刚刚结束的 每日算法&面…

【pandas】教程:3-取DataFrame子集

pandas 取 DataFrame 的子集 pandas 选择列 注&#xff1a; 引用库的导入和数据的导入只做一次&#xff0c;所有代码是在 jupyter notebook 里完成的。 import pandas as pd titanic pd.read_csv("data/titanic.csv")只要年龄数据 ages titanic["Age"…

速度杠杠的,部署机器学习模型的这7个要点要谨记

在模型部署时&#xff0c;模型的性能和耗时都非常重要。但是我们在构建模型时&#xff0c;往往没有考虑模型的预测速度。虽然性能优化会损害预测准确性,但更简单的模型通常运行得更快&#xff0c;也不容易过拟合。 预测延迟被测量为进行预测所需的经过时间。延迟通常被视为一个…

降维和特征选择的对比介绍

在machine learning中&#xff0c;特征降维和特征选择是两个常见的概念&#xff0c;在应用machine learning来解决问题的论文中经常会出现。特征降维和特征选择的目的都是使数据的维数降低&#xff0c;使数据维度降小。但实际上两者的区别是很大&#xff0c;他们的本质是完全不…

Java整合RocketMQ实现生产消费

文章目录参考文档环境搭建生产者普通消息同步发送异步发送单向传输顺序消息延迟消息批量消息事务消息消费者Push消费Pull 消费代码仓库参考文档 RocketMQ作为阿里系开源项目&#xff0c;有非常成熟的中文文档可以快速了解并上手。 环境部署控制台安装RocketMQ常见问题 环境搭…

【现代机器人学】学习笔记八:轨迹生成

这节课的内容主要讲述如何通过插值等方式生成一条满足运动学约束的运动轨迹。这节的内容在全书中较少&#xff0c;相比前一章开链动力学而言&#xff0c;可以说内容少了许多。但是这节的内容却是目前在机械臂应用方面使用最广泛的一节。 闲话休提&#xff0c;马上开始&#xf…

ThreeJS:创建第一个三维场景

场景效果 ThreeJS与WebGL WebGL使得开发者可以直接使用显卡的计算资源,创建高性能的二维和三维计算机图形效果,然后在JavaScript脚本中进行WebGL编程,创建三维场景并生成动画。但是,原生的WebGL编程是十分复杂的,且容易出错。然而,Three.JS库可以简化WebGL的开发过程。 基…

十、Java 17 新特性

十、Java 17 新特性 JDK 17 在 2021 年 9 月 14 号正式发布了&#xff01;根据发布的规划&#xff0c;这次发布的 JDK 17 是一个长期维护的版本&#xff08;LTS)。Java 17 提供了数千个性能、稳定性和安全性更新&#xff0c;以及 14 个 JEP&#xff08;JDK 增强提案&#xff09…

示波器应用(二)

前篇我们对场景六基色色相和白平衡还有明度进行了验证&#xff0c;对黑白场做了微调。后面我们还需要对场景调光。 本篇主要涉及一些画面美术知识&#xff0c;不感兴趣可以跳过。 我们需要先了解一个摄影知识 曝光 下面要说到一种颜色模式HSB&#xff0c;HSB分别表示&#…

Redhat-ansible-合集

1.安装 2.部署ANSIBLE 2.1INVENTORY 2.2ANSIBLE配置文件 2.3AD HOC命令 3.PLAYBOOK 4.变量 5.ansible vault加密变量 6.ansible_facts 7.loop 8.条件判断 9.handler处理 10.错误处理 11.tags标签 12.管理文件 13.template模板 14.host-pattern 15.动态Inventory 16.ro…

玻纤效应对skew的影响(一)

在高速SerDes传输系统中&#xff0c;随着信号速率的提高&#xff0c;UI会越来越小&#xff0c;传输线的对内skew会越来越大。以PCIe信号来说&#xff0c;PCIe4.0速率的一个UI是62.5ps&#xff0c;当速率提高到PCIe5.0时&#xff0c;每个UI就只有31.25ps&#xff0c;更进一步&am…

SparkSQL源码分析系列01-Catalyst作用

SparkSQL 是如何将SQL语句转化为Spark任务的呢&#xff1f; 详细过程如下图 通过拉去 github 的 Spark 源码&#xff0c;查看 SparkSQL 模块的 readme.txt 文件可以看出&#xff0c;SparkSQL 包含4个方面的内容 SparkSQL源码主要包含4大模块 Catalyst (sql/catalyst)&…

Solidity之为什么 ++i 比 i++ 省gas

文章目录为什么 i 比 i 省gas测试验证demo1demo2为什么 i 比 i 省gas为什么 i 比 i 省gas i通常更昂贵&#xff0c;因为它必须增加一个值并“返回”旧值&#xff0c;因此可能需要在内存中保存两个数字我在记忆中只使用过一个数字。在许多情况下&#xff0c;在编译器优化之后&a…