关于加密那些事

                                                                              密码学

起源:

 

古代战争-古典密码学

1.移位式加密:密码棒

信使送信来传递信息,为了避免信使被抓之后获取信息,把所要传达的信息写到密码棒上,          这样信使被抓也不能获取信息`

  

 

        密码棒

 

 

加密算法:缠绕木棒后书写

密钥(yao):木棒的尺寸规格

 

 

2.替换式加密:

 

举例:

 

 

第一行是A~Z

第二行是把A放到Z后面

 

然后,第一行的字母就用第二行表示,那么I LOVE YOU 即:

 

 

这样传纸条的时候老师就不懂了

加密算法:替换文字

密钥:码表

 

 

我觉得哈:密钥就是一把开门的钥匙,而加密算法就是使用这个要是的方法

 

 

 

现代密码学

(不仅可以加密文字,可以加密各种二进制文字)

 

1.对称加密   2.非对称加密

 

 

对称加密

 

对称加密类似于古典密码学中的替换式加密,只不过更加复杂,只是对于计算机来说很快

 

 

加密原因:网络上传输数据是很不安全的,两台电脑之间传输数据需要经过多个中间点,这些中间点都是可以获取这些消息的,发送网络消息的时候是辐射状的,向四面八方辐射,如果中间节点判断属于该节点就会接受,否则就会拒绝,所以一定要加密,以为别人不可能拿不到你的数据

 

原理:使用密钥和加密算法对数据进行转换,得到的无意义数据即为密文;使用密钥和解密算法进行你想转换,得到密文

 

现代密码学的对称加密与古典密码学的区别:更加复杂,应用范围更广

 

经典算法;DES,AES

 

DES因为密钥较短因而被弃用了,因为密钥短破解的几率更大

 

破解对称机密算法思路:前提是先拿到原文和密文对,用解密算法来解出,解密算法是用穷举法来试用的,从而解出他的密钥,就算是破解了他的算法

 

反破解思路:最有的对称加密算法密钥破解方式是穷举法,即暴力破解,一个一个密钥试

 

 

 

非对称加密:

 

原理:使用公钥对数据进行加密得到密文,使用私钥对数据进行解密得到原数据

经典算法:RSA,DSA

(RSA用来加密签名都可以,DSA专门用来签名,因为设计原因,DSA验证签名十分快,有速度优势,所以抓门用来签名)

 

 

注意上图:原数据是通过加密算法和加密密钥要得到密文,而密文通过加密算法和解密密钥得到原数据

(加密解密过程用的都是加密算法,但是密钥不一样)

 

举个非对称加密的例子:

 

限定条件:通讯过程中只能发十个字符

0123456789

 

发送消息;110

加密算法:对每一个字符进行加法

加密密钥:具体加几  本次为4

解密密钥:具体加几  本次为6

 

加密过后: 554

解密过后:110 (会有溢出,取个位)

 

 

这个例子就解释了为什么加密和解密都用加密算法,加密算法应该会允许溢出,不允许溢出,非对称加密的安全性就小很多

 

 

再说一下实际情况下传输数据的情况:

 

 

 

A和B是两个客户端,C是中间的一个客户端,A和B要进行通讯,那么第一步就是A和B互相把各自的加密密钥给对方,即这样:

 

然后加密的过程就是这样了,整体的传输流程为:A用B的加密密钥来加密数据,然后法送给B,B用B的解密密钥要解密数据,同理B对A也是如此,如此就完成了两端的数据传输,这样的数据传输是安全的,原因:

uploading.4e448015.gif转存失败重新上传取消

此时C截获了A往B发送的加密后数据(黄方框),当然也可以解惑A和B传递时使用的加密密钥,这时C要破解密文,需要解密密钥,截取的两个都是加密密钥,所以没办法破解,因此解密密钥是不能传输的,能传输的只能是加密密钥

 

此时,加密密钥和解密密钥也有另外一种称呼:

uploading.4e448015.gif转存失败重新上传取消

 

加密密钥成为公钥,即可以和别人共享,而解密密钥则成为私钥,即不能传输

 

 

问提:公钥加密,私钥解密,那么能不能用私钥加密公钥解密呢?

答案:其实是可以的,道理很简单,还看就可以:

 

uploading.4e448015.gif转存失败重新上传取消

上图时正常逻辑,即用公钥加密,私钥解密,那么现在不管他是不是元数据和密文,表示为下图:

 

uploading.4e448015.gif转存失败重新上传取消

假设中间的红色框为元数据,经过私钥加密之后就是右侧蓝方框,但是右侧蓝方框跟左侧蓝方框是一样的,所以从左边的过程来看,蓝方框数据经过公钥计算还原为原来的红方框数据,以此证明公钥时可以解私钥的

 

 

那么延伸了另外一个问题,可以可以经公钥与私钥互换,即私钥作为公钥被传递出去,公钥留在本地?

答案:也是不可以的,因为在很多情况下,公钥是可以被计算出来的,所以不安全。举个例子:比特币里的椭圆曲线算法,公钥时依靠私钥算出来的,所以获得了私钥就相当于获得了公钥和私钥:在举例,RAS算法,他的公钥的的核心部分对所有人来说都是一样的,所以公钥和私钥不能置换

 

 

由此延伸签名与验证:如图:

uploading.4e448015.gif转存失败重新上传取消

我是用我自己的私钥进行加密,让偶用公钥解密的,这样一来,没人能造出我的所创造的签名数据(这个数据指,用我的公钥公钥还原为原数据的一个数据)

 

图中用私钥加密的过程称为签名,用公钥解密的过程称为验证

 

 

关于签名还有一个问题:

uploading.4e448015.gif转存失败重新上传取消

 

只拿到签名数据是很不方便的,要看原数据只能再还原回去,如果还原回去之后,发现原数据时没有意义的,那么这个数字签名也是没用的,所以为了避免这种情况,把原数据和签名数据一块发出来,这样验证签名数据的时候与发出来的原数据比较,就可以验证(既能又看数据又能验证)

 

 

由此出来一个算法:加密+签名,可以推出这个数据并得知来源,如下图

 

uploading.4e448015.gif转存失败重新上传取消

 

首先,原数据经过对方公钥加密,形成密文,然后对方用他的私钥解密为原数据,同时,对原数据进行加签名,然后对方用我的公钥进行验证,由此一来,即可获得原数据,又可确认数据是否来源于我,应用于什么场景呢?我们可以回顾一下刚才的图:

 

uploading.4e448015.gif转存失败重新上传取消

 

这个图就是非对称加密A到B传输消息,这个图中C可以截取双方的公钥,因此可以伪造成A或B给对方发消息,但是签名验证就避免了这个问题,验证对方的身份

 

非对称加密破解:拿到对方的公钥,通过公钥拿到私钥,即破解了

反破解:用暴力破解(穷举法)来破解,即一个一个试

 

 

 

 

 

密码学密钥和登录密码有关系吗?

没关系

密钥(key)数学上的数据,辅助加密或者解密

   目的:保证数据被盗时不被人读取内容

密码(password) 在网上进行操作之前们进行身份验证,不需要数学知识,只需验证是否包含在该服务器数据库中

 目的:数据提供方或应用提供方对账户拥有数据的一种保护

 

 

 

 

Base64

 

定义:把二进制数据转换为64个字符组成的字符串编码算法

 

那么什么是二进制数据?

非文本数据就是二进制数据,广义来讲所有计算机数据都是二进制数据,其中有一种特殊的为二进制数据,剩下的时普通的二进制数据

 

64个字符都包括啥?

小写a-z,      大写A-Z,      数字0-9,    两个字符:+,/

 

什么思路?

原文只能用64个字符来表示,用二进制表示原文的每个字符,后来把二进制每六个分为一组,获取六位二进制所代表的十进制数字,用数字来寻找所对应的字符,

 

为什么是64个字符?

因为六位所代表的最大数为64,要用字符全部表示出来,而要用八位的话,就需要256个字符,因为没有这么多字符,如果有这么多字符,就不用通过八位转六位了

 

进行base64数据量会增大,有什么办法不增大?

base256啊,但是没有那么多字符

 

base64狭义作用:

把二进制数据(这里指非文本数据)转换为文本数据

 

 

为什么把非文本数据转化为文本数据?

一个老的场景:在原来的电脑中,邮箱是不能传输图片的,只能传输文本,但是电脑可以存储图片,怎么传输图片呢?用base64把非文本数据转换为文本,在电脑上在通过bsae64解码算法还原;在传输的途中,不能传输图片,只能通过base64来转一下,用文本来传图片

 

 

base64用途:

1.使原数据具有字符串的特性,如可以放在URL中传输,可以保存到文本文件,可以通过普通的聊天软件就行传输;

2.把原本人眼可以读懂的字符串变成不懂得字符串,降低偷窥风险

 

 

base64是安全的,高效的吗?

不对,既不安全也不高效,因为所有人都知道base64的加密和解密,并且他是低效的,用了base64的数据量会变长,而且每次用base64数据量增加三分之一,会造成极大的性能损失

 

 

base64变种:base58

比base64相比去掉了几个字符:数字0,和大写字母O(容易混淆):还有大写的I和小写的L(容易混淆);字符+ ,/

用处:用在比特币等虚拟货币的地址上,在进行转账的时候可能是看错,吧一些易混字符去掉,避免出错;而取去掉字符+和/是为了方便双击复制

 

 

URL encoding

也属于base64的变种

 

用法:讲URL中的保留字符使用百分号“%”进行编码

目的:消除歧义,避免解析错误

 

 

 

 

 

压缩与解压缩

 

 

压缩:把数据以另一种方式来存贮,以减小存储空间

解压缩:把压缩后的数据还原成原来的形式,以便使用

常见的压缩算法:DEFLATE     JPEG    MP3

 

DEFLATE:用zip打包所用的压缩算法

JPEG:会JPG图片进行压缩

MP3:对音频进行压缩

 

压缩属于编码吗?编码是什么意思是?

有一说一,编码没有官方的定义,一般所说的编码就是A格式转化为B格式,B格式可以转化过来,过程中不会损失信息和增加信息;而压缩和解压缩是符合这个特征的,所以压缩属于编码

 

媒体数据的编解码:

媒体数据:图片,音频,视频等;

图片编码:把图像数据写成JPG,PNG等文件的编码格式

 

 

压缩算法本质,如图:

uploading.4e448015.gif转存失败重新上传取消

图中意思:比如原来是个文本数据,用压缩算法就表示为最下面那行:用的是reng压缩算法,包括100个a,20个吧,3个从,2个a ,大概意思就是这样,不过i肯定不是这种写法 ,因为这种写法肯定会出问题,在如下情况:

uploading.4e448015.gif转存失败重新上传取消

这样压缩之后数据量还增大了,所以肯定不是这么简单,大概思路就是这样,用一种简单的方法表示

 

图片压缩了可以表示为:

uploading.4e448015.gif转存失败重新上传取消

 

意思为:用reng压缩算法,把64*64的图片压缩,从第一个像素到最后一个都是fffff颜色,大概表示为这样,但并不是真的算法也是这样,只是大概表示一下

 

 

音频视频编码解码:

道理是一样的

 

压缩算法分为有损算法和无损算法:

有损算法不同算法之间有差距,效率不同

 

 

 

                                                            序列化

 

序列化;把内存中的对象(一般是在内存中,比如JVM中的对象),转换为字节序列的过程

反序列化:把字节序列重新转化为内存中的对象

 

序列化属于编码吗?

严格来说,不属于编码,因为原来它属于内存中的对象,不是一种格式,而编码不是一个确定个概念,所以不用太纠结

 

 

 

 

                                 Hash

 

定义:把任意数据转化为指定大小(通常很小)的数据

比如:一个班级里有三十个人,把每个人进行编号,那么这个过程就是hash,每个人的编号就是hashcode

作用:摘要,数字指纹(比如在指代一个人的时候,只需要叫他的名字,不需要说身高体重)

经典算法:MD5,SHA1,SHA256

 

如图:

uploading.4e448015.gif转存失败重新上传取消

 

比如推重renghash是一种hash算法,输入字符串为原数据,这个算法是输入了“haha”跟“hehe”所得出出来的值是一样的,所以不能用这种,hash算法是能够进行指纹验证的,即确保每个人的数据尽量不一致,就需要保证所得出来的值有极小的碰撞率,所以这种算法是不行的

 

MD5在防破解上面已经被遗弃了,因为安全性比较差,容易被破解,不过还有一些别的用途

 

Hash算法实际用途:

1.数据完成性验证:比如下载一个文件,算出他的MD5值,下载完之后在重新计算MD5,则文件损坏

2.hashcode和hashmap

在java中,重写equals都会重写hashcode,又因为hashcode使用来验证身份的

(在hashmap中,首先j计算出key的hashcode,根据hashcode来找到内存地址中的位置,如果地址中有值,那么用equals比较key对象是否相同,如果相同则将value替换,如果没有值则将value方法哦上面,如果有value且key不同的情况下,则将hashcode相同的元素放到单链表上,所以通过hashcode可以确认身份)

 

 

由上可知,在hashmap中重写equals一定要重写hashcode,原因:

如果equals不等,而hashcode相等(hashcode用的是object的hashcode方法),因此这样程序会出bug,比如这两个数据不同但是经过Object的hashcode计算所得出来值相等,那么新数据就会取代旧数据,即便两者数据不同;而且也提高效率

 

 

hash用途3:隐私保护

 

明文存储会造成安全问题,即明文存储密码,这样别人会获取你的密码和账户,然后去各个网站试,可能会泄漏大量数据,避免这种情况可以使用hash

 

破解hash的玩意:彩虹表,用法:

用hash加密之后所得出来的值是固定的,彩虹表是收录了许多经过hash加密的原文和密文对的表,来查找有相同的密文找到原文,来暴力破解

 

与此同时破解彩虹表的东西也诞生了:加盐

每个网站定义一个盐(salt), 做hash加密的时候,将相当于在所存数据上添加一个数据,这就导致锁算出来的值不同与原数据进行hash的时候的值,盐就相当于是一个值,所以彩虹表失效了

 

 

hash是编码吗?

不是,因为他是单向的,不能被还原

 

 

hash是加密吗?MD5是加密吗?

不是,因为加密是可逆转的,MD5是hash的一种

 

 

为什么不可逆?

hash只是来验证身份的一个东西,只有很小量的数据,相当于人的指纹,根据指纹能转换会人吗?不可能的

 

 

通过理解hash之后,就再来回顾一下非对称加密:

 

uploading.4e448015.gif转存失败重新上传取消

 

 

实际上,做签名的数据并不是原数据,而是、原数据进行hash之后的特征数据,在进行签名,再加上原数据,就组成了签名后的数据,然后将元数据进行hash得到摘要,同事对其签名的摘要就行验证得到摘要,两个摘要就行验证,即可验证身份

 

 

 

 

字符集

含义:一个由整数向现实世界中的文字符号Map

分支:

  ACSII  128字符  1字节

ISO-8859-1;对ACSII进行扩充,1字节

Unicode; 13万个字符,多字节

UTF-8 ;   Unicode的编码分支

UTF-16:Unicode的编码分支,UTF-16是16位表示一个字符

GBK/GB2312/GB18030 :中国自研究标准,多字节,多字符+编码

 

 

现在一般都用Unicode编码,在某些选项中会有几个选项:Unicode,UTF-8 ,UTF-16等,其中Unicode并不表示UTF-8的父类啥的,而是属于他的其中一种编码方式

 

 

 

 

 

 

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值