一.加密和解密

下面先熟悉几个概念

1>对称加密:加密的key和解密的key是同一个

但是如何确保密钥安全地进行传递?秘钥的安全是一个问题

2>非对称加密:加密点的key和解密的key不是同一个

非对称加密的接收者和发送者都持有两个密钥,一个是对外公开的,称为公钥,一个是自行保管的,称为私钥。

非对称加密的规则是由某人A的公钥加密的消息,只能由A的私钥进行解密;由A的私钥加密的消息只能由A的公钥解密。

此时我们可以得出接收方、发送方有两个公钥两个私钥一共四个密钥,我们先看看两种简单的方式,这两种方式都是只使用两个密钥。

第一种模式只使用接收方的公钥和私钥,称为加密模式。

在加密模式中,由消息的接收方发布公钥,持有私钥。比如发送方要发送消息“hello,jimmy”到接收方,它的步骤是:

1>发送方使用接收者的公钥进行加密消息,然后发送。

2>接收方使用自己的私钥对消息进行解密。

这种模式下,消息的发送方,不保证第三个无法获得,但保证第三方无法解密。

第二种模式,由消息发送方发布公钥,持有私钥,称为认证模式。

比如发送者要发送消息“hello,jimmy”到接收者,它的步骤是:

1>发送者使用自己的私钥对消息进行加密,然后发送。

2>接收者使用发送者的公钥对消息进行解密。

这种模式,能证明发送方就是消息的发送者,而不是其他人。

3>数字签名

不管是加密模式,还是认证模式,接收方都无法确认消息是否被改动过,此时数字签名就登场了。

数字签名实际上就是上面非对称加密时的认证模式,只不过做了一点点的改进,加入了散列算法。大家比较熟悉的散列算法可能就是MD5了。

散列算法那的3个特点:

1>不可逆,由结果无法推算出原数据

2>原数据有一点变化,散列值都产生巨大变化

3>无论多么大或者多么少数据,总会产生固定长度的散列值(常见的32位64位),产生的散列值通常称为消息的摘要(digest)

那么如何通过引入散列函数来保证数据的完整性呢?也就是接收方能够确认消息确实是由发送方发来的,而没有在中途被修改过。具看下图:

1>发送方->把消息进行散列运算->得到消息摘要

2>发送方->自己的私钥对摘要加密->发送给接受方

3>接收方->用发送方的公钥解密消息和摘要

4>接收方对消息进行散列运算,得到一个消息摘要

5>接收方把自己得到的摘要和发送方发来的摘要进行比对。相同说明消息没被改动过;不同,说民消息被改动过了。

4>高级模式

上面的数字签名,只对消息摘要进行了加密,而没有对消息本身进行加密。非对称加密是非常耗时的,只对消息摘要加密,减少运算量,提高程序执行速度。

但是它不能保证消息不被第三方截获,因为消息是明文传输,第三方能直接看到明文,为了解决这个问题,需要将非对称加密的认证模式,加密模式,消息摘要进行一个结合,我们称之为高级模式。

我们将其分为发送方和接收方两部分来看。

先看发送方需要执行的步骤:

1>.将消息进行散列运算,得到消息摘要。

2>.使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。

3>.使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。
4>.发送消息和消息摘要。

接下来我们看一下接收方所执行的步骤:
1>.使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。
2>.使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。
3>.将消息进行散列运算,获得消息摘要。
4>.将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。

可以看出,使用了接收方,发送方全部的四个秘钥,再配合摘要,就满足了消息安全传递了。但是非对称加密是很耗时的,所以这个方案是很低效的。实际上,我们

可以通过它来解决对称加密中秘钥传递的问题。我们用高级实现方式进行对称加密中密钥的传递,之后的实际数据传递,采用对称加密方式完成,因为此时已经是安全的了。

5>证书机制

证书是用来做什么的?上面的各种模式中,我们假设接收方或者发送方所持有的,对方的公钥是正确的(确实是对方公布的)。实际上,如果不采取措施,双方在网络中

传递公钥时,一样可以被篡改。为了解决这个问题,就西药证书机制了。比如百度要公布公钥时,找一个公正的第三方,就是常说的证书颁发机构(Certificate Authority),

百度将自己的身份消息以及公钥交给第三方机构,第三方机构对其进行身份证实,然后将其消息和公钥打包成证书(Certificate)。当我们需要获取公钥时,只需要获取证书,就能从中提取公钥。

6>不可逆加密:从密文不能还原成原文

7>对称可逆加密:加密key和解密key是同一个,能从密文进行还原成原文

8>不对称可逆加密:加密key和解密key不是同一个,能从密文进行还原成原文

二.MD5不可逆加密

首先对于同一个字符串,任何语言加密的MD5的结果都是一样的。MD5是把一个字符串串做摘要,产生一个32位的值,每一位都有0-9和A-F这16种可能。

且任何数据的MD5后的结果都不一样。

用途:

1>利用字符串相同,结果相同的特点

-做登录窗口的密码验证:输入密码->MD5->保存->登录->输入的密码MD5->进行对比

-文件MD5摘要:主要是检查文件是否被篡改。相同的文件,MD5摘要才能相同。

MD5现实中应用的比较广泛,比如百度云的极速秒传,主要就是利用第一上传文件的时候,会在服务器上保存MD5;如果再有文件上传,先计算文件的MD5,然后去服务器上进行匹配,如果匹配上了,就只上传文件名,至于文件内容就不再次上传了。另外SVN和Git都是应用的MD5。

三.Des对称可逆加密

Des加密,加密的key和解密的key是同一个。对一个字符串可以加密成密文,密文也可以还原成原文 .Des加密速度比较快,可用于数据加密,但是秘钥安全是问题。

Des算法是公开的,即使拿到密文,也推算不出秘钥,自然也推不出原文。

用途:

加密狗:通过硬件读取得到key,然后用key加密

四.RSA非对称可逆加密

RSA加密的key和解密的key不是同一个,从密文也可以还原成原文。RSA加密速度不快,但是安全性能好。加秘钥&解秘钥是一组的,知其一,不能推出另外一个。

加秘钥和解密要都可以当做公钥或者私钥。

1>私钥(加秘钥),公钥(解秘钥)=>保证消息来自私钥持有者,可以理解为身份验证

2>公钥(加秘钥),私钥(解秘钥)=>保证消息只有私钥持有者能得到。下图能更好的进行说明:

乙方把加秘钥作为公钥,进行公开;把解秘钥做为私钥,自己保存。甲方->乙的公钥加密->乙拿自己的私钥(解秘钥)得到明文

五.CA证书

流行的CA证书由CA机构颁发的,网站不带SSL的都有风险提示,网站不带https都有危险提示。

这些是把前面的对称可逆加密,非对称可逆加密,不可逆加密的综合应用。

CA证书

数据在网络上传输,是不安全的。为了保证在浏览器上数据传输安全。

首先由权威机构发布CA证书,CA机构用自己的私钥用MD5,加密一下前面5点的信息,得到一个数字签名。

分析上图

1>首先百度公司向权威的CA机构,申请CA证书,需要向CA权威机构提供5条的信息,包括持有者姓名,发证机关,有效日期,证书只有人的公钥,扩展信息。

2>CA机构用自己的私钥对上面5条信息进行MD5摘要,产生一个数字签名

3>Client端内置了根证书,内置了CA的公钥

4>Server内置了CA证书

单边认证https

单边认证用在https请求

分析上图

1>A1是Client向Server发起请求,A2服务器把证书给Client,此时Client由于内置了证书的公钥自然能看到证书中的内容。此时就证明了Server端是百度了。这就是不可以加密MD5的应用

2>Client端用证书中的第四条(持证人持有人公钥)中的公钥加密“123”给Server,Sever用自己的私钥解开后,B2把解开后的字符串发给Clinet。证明了Server就是证书对应的服务器。这就是Dse非对称可逆加密的应用

3>C1是客户端随机产生一个秘钥字符串“123”最为对称加密的秘钥,然后用百度的公钥加密后传输给Server

4>C2,Server收到后,用自己的私钥解开字符串,就拿到了秘钥字符串“123”,之后Client和Server通信的时候,就用“123”把信息进行加密,然后再传输。这就是RSA对称可逆加密的应用。

双边认证

双边认证和单边认证和相似,搞懂了单边认证,双边认证就容易理解了

分析上图

1>A1和A2和单边认证一样,证明了Server是招商银行

2>A3和A4和单边认证一样,证明了Server就是证书对应的服务器

3>B1和B2,B3也类似单边认证,证明Client端是小明

4>C1是Server随机产生一个秘钥,作为对称可逆加密的秘钥,用Client的公钥加密后,传给Client

5>之后Client和Server通信,都用“123”作为秘钥加密后进行传输

MD5,Des,RSA加密解密的更多相关文章

  1. C# Base64编码解码 ,Md5、Rsa加密解密

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Clas ...

  2. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  3. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  4. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

  5. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  6. RSA加密解密和读取公钥、私钥

    /// <summary>     /// RSA加密解密及RSA签名和验证    /// </summary>     public class RSADE    {    ...

  7. RSA加密解密及RSA加签验签

    RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...

  8. 利用RSACryptoServiceProvider进行RSA加密解密

    前言: 本文只介绍How to use,对于加密算法的研究不予讨论. 关于私钥的存储,微软给的建议是使用windows自带的秘钥容器,相见文档. 为了直观看到私钥和公钥,本文直接将其存入XML文件中. ...

  9. C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

    差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...

  10. RSA加密解密及RSA签名和验证及证书

    RSA加密解密及RSA签名和验证及证书 公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密 ...

随机推荐

  1. Android 4.4系统,User模式adb默认开启,取消授权,开启root调试记录

    开启User模式adb,取消授权,修改如下: 1. /build/core/main.mk  修改以下内容 ifeq (true,$(strip $(enable_target_debugging)) ...

  2. Ansible的参数介绍

    安装完成ansible后查看ansible的参数:ansible -h ansible 命令格式:Usage: ansible <host-pattern> [options] ansib ...

  3. mysql allow remote host

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEG ...

  4. Redis系列:深刻理解高性能Redis的本质

    1 背景 分布式系统绕不开的核心之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升.通过使用缓存,我们把频繁查询的数据由磁盘调度到缓存中,保证数据的高效率读写. 当然,除了在内存内运行 ...

  5. Calico网络插件

    以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...

  6. 每天一个 HTTP 状态码 202

    202 Accepted 202 Accepted 表示服务器已经接受了这个请求,但是还不确定这个请求是否能够成功地被处理完.该请求最终可能会或可能不会被执行,并且在处理发生时可能会被拒绝,这是不确定 ...

  7. Android 实现开机自启APP

    原文地址:Android 实现开机自启APP - Stars-One的杂货小窝 公司有个项目,需要实现自启动的功能,本来想着是设置桌面启动器的方式去实现,但是设备是华为平板(EMUI系统),不允许设置 ...

  8. 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  9. ExtJS 布局-Column布局(Column layout)

    更新记录: 2022年6月1日 开始. 2022年6月4日 发布. 1.说明 使用列布局,可以将容器拆分为特定大小的列,并将子组件放置在这些列中. 可以设置子组件宽度值为: 百分比(相对父容器宽度) ...

  10. VueX的模块你知道多少?

    为什么会出现VueX的模块呢?当你的项目中代码变多的时候,很难区分维护.那么这时候Vuex的模块功能就这么体现出来了. 那么我们就开始吧!一.模块是啥? /* eslint-disable no-un ...