密码学
起源:
古代战争-古典密码学
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也是如此,如此就完成了两端的数据传输,这样的数据传输是安全的,原因:
此时C截获了A往B发送的加密后数据(黄方框),当然也可以解惑A和B传递时使用的加密密钥,这时C要破解密文,需要解密密钥,截取的两个都是加密密钥,所以没办法破解,因此解密密钥是不能传输的,能传输的只能是加密密钥
此时,加密密钥和解密密钥也有另外一种称呼:
加密密钥成为公钥,即可以和别人共享,而解密密钥则成为私钥,即不能传输
问提:公钥加密,私钥解密,那么能不能用私钥加密公钥解密呢?
答案:其实是可以的,道理很简单,还看就可以:
上图时正常逻辑,即用公钥加密,私钥解密,那么现在不管他是不是元数据和密文,表示为下图:
假设中间的红色框为元数据,经过私钥加密之后就是右侧蓝方框,但是右侧蓝方框跟左侧蓝方框是一样的,所以从左边的过程来看,蓝方框数据经过公钥计算还原为原来的红方框数据,以此证明公钥时可以解私钥的
那么延伸了另外一个问题,可以可以经公钥与私钥互换,即私钥作为公钥被传递出去,公钥留在本地?
答案:也是不可以的,因为在很多情况下,公钥是可以被计算出来的,所以不安全。举个例子:比特币里的椭圆曲线算法,公钥时依靠私钥算出来的,所以获得了私钥就相当于获得了公钥和私钥:在举例,RAS算法,他的公钥的的核心部分对所有人来说都是一样的,所以公钥和私钥不能置换
由此延伸签名与验证:如图:
我是用我自己的私钥进行加密,让偶用公钥解密的,这样一来,没人能造出我的所创造的签名数据(这个数据指,用我的公钥公钥还原为原数据的一个数据)
图中用私钥加密的过程称为签名,用公钥解密的过程称为验证
关于签名还有一个问题:
只拿到签名数据是很不方便的,要看原数据只能再还原回去,如果还原回去之后,发现原数据时没有意义的,那么这个数字签名也是没用的,所以为了避免这种情况,把原数据和签名数据一块发出来,这样验证签名数据的时候与发出来的原数据比较,就可以验证(既能又看数据又能验证)
由此出来一个算法:加密+签名,可以推出这个数据并得知来源,如下图
首先,原数据经过对方公钥加密,形成密文,然后对方用他的私钥解密为原数据,同时,对原数据进行加签名,然后对方用我的公钥进行验证,由此一来,即可获得原数据,又可确认数据是否来源于我,应用于什么场景呢?我们可以回顾一下刚才的图:
这个图就是非对称加密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等文件的编码格式
压缩算法本质,如图:
图中意思:比如原来是个文本数据,用压缩算法就表示为最下面那行:用的是reng压缩算法,包括100个a,20个吧,3个从,2个a ,大概意思就是这样,不过i肯定不是这种写法 ,因为这种写法肯定会出问题,在如下情况:
这样压缩之后数据量还增大了,所以肯定不是这么简单,大概思路就是这样,用一种简单的方法表示
图片压缩了可以表示为:
意思为:用reng压缩算法,把64*64的图片压缩,从第一个像素到最后一个都是fffff颜色,大概表示为这样,但并不是真的算法也是这样,只是大概表示一下
音频视频编码解码:
道理是一样的
压缩算法分为有损算法和无损算法:
有损算法不同算法之间有差距,效率不同
序列化
序列化;把内存中的对象(一般是在内存中,比如JVM中的对象),转换为字节序列的过程
反序列化:把字节序列重新转化为内存中的对象
序列化属于编码吗?
严格来说,不属于编码,因为原来它属于内存中的对象,不是一种格式,而编码不是一个确定个概念,所以不用太纠结
Hash
定义:把任意数据转化为指定大小(通常很小)的数据
比如:一个班级里有三十个人,把每个人进行编号,那么这个过程就是hash,每个人的编号就是hashcode
作用:摘要,数字指纹(比如在指代一个人的时候,只需要叫他的名字,不需要说身高体重)
经典算法:MD5,SHA1,SHA256
如图:
比如推重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之后,就再来回顾一下非对称加密:
实际上,做签名的数据并不是原数据,而是、原数据进行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的父类啥的,而是属于他的其中一种编码方式