安全部分
数据会受到偷听,假冒,篡改,事后否认的区别
偷听 | 加密 |
---|---|
假冒 | 消息认证码或数字签名 |
篡改 | 消息认证码或数字签名 |
事后否认 | 数字签名 |
Hash函数:理解为hash搅拌机
给定数据转换成——无规律、固定长度数值
不管输入多长输出hash值长度不变
不可逆推导
MD5和SHA1有安全隐患
加密:用密钥对数据进行数值计算,使第三方不认识
加密解密都用相同密钥的共享密钥加密 和不同密钥的 公开密钥加密,私有密钥解密
5-4、共享密钥加密
前者也叫对称加密,有凯撒密码,AES,DES。然而只有一个密钥,被偷听的风险很大
这就到了一个“密钥分配问题”——
解决这个问题,可以用密钥交换协议,和公开密钥加密 两种方法
5-5、公开密钥加密
后者也叫非对称加密,接受方B生成公开密钥P和私有私钥S,它把公钥P发给发送方A用来加密,发送方把密文发回来,接受方用私钥S解密成功。
典型的有RSA,椭圆曲线加密算法
多人网络密钥数量n(n-1)/2
B发公钥给A过程中,公钥有可能被中间人X替换,于是A用Px加密数据,然后X用自己的私钥Sx解密。解密完再用Pb给密文加密。B成功用Sb解密。AB没有意识到中途被窃听了。
中间人攻击就是:Pb被拦截,变成了Px的过程。
此处的问题就是A无法判断Px不是来自B的。公钥的出处无法识别
解决这个问题 ——数字证书,混合加密(解决加密解密太慢)
5-6、混合加密
过程类似于公开密钥加密,即非对称加密。
只是A使用B的公钥加密的不是数据,是一个共享加密中使用的密钥。
应用场景:SSL协议,经过版本升级也叫TLS
5-7、hellman密钥交换
A把共享密钥P给B
A,B各自有Sa,Sb,和P合并成PSa,PSb
相互交换,再和原本的Sa,Sb组合。所以PSaSb作为共享加密的密钥
因为X获得的P,PSa,PSb组合不出PSaSb。(组合是不能分解的)
所以是安全的
P是素数,G是生成元
私有数X,Y
G^x%P G ^ y%P
交换后再用结果^x%p 得G^xy%P作为共享加密的密钥
这个方法实际上运用了数学上的“离散对数问题”
5-8、消息认证码
防止篡改
认证码MAC=密文和密钥共同生成的值,可以看作hash操作
B端受到了密文和MAC,会用密文和自己的密钥生成MAC,看两个MAC是否相等
5-9、数字签名
认证中心的Sc,由A的资料生成的签名,即中心认可了A是A的凭证
数字签名只有消息发送者才能生成。因此可以确定谁是发送者。
数字签名的生成是采用了公开密钥加密。
发送者A准备公钥和私钥。与公开加密相反。
A先发公钥给B,再用私钥加密消息,加密完的就叫数字签名。A将数字签名和消息都发给B。B用受到的公钥解密。对比解密后的消息和一同接受的消息是否一致。
RSA支持这种性质。
公开加密费时,一般签名是对消息的hash码进行加密。
无法确定公开密钥的制作者是谁。下一节可以解决这个问题。
5-10、数字证书
A有Pa和Sa,要向CA申请发行证书,证明公钥是自己生成的
认证中心确认A资料后,使用自己的私钥Sc根据A的资料生成数字签名。
认证中心把生成的数字签名和资料放在同一个文件中。
然后中心把包含数字签名和资料的——数字证书还给了A。
A又把证书给B。B判断数字签名是否来自认证中心,只有中心的Pc可以验证
确认后B从证书中拿到了Pa
总结:B只要不信任非证书形式受到的密钥,就避免中间人攻击的问题
前提是B拥有的Pc是真实由中心发放的
有个树形结构,根结点是根认证中心,正当性由自己证明
服务器间也有“服务器证书”,用于网站通信
基础部分
程序 是计算机 能识别的内容
算法 指人的逻辑加入程序从而达到目的的一种方法
第1章 数据结构
数据结构 是 数据间的顺序和位置
栈适用于深度优先遍历,选最新数据
队列适用于广度优先遍历,选最早数据
取hash值 mod数组长度
hash表就是竖着是数组,数组后跟着因为冲突连着的链表。
查询时:hash后取模找到第几个盒子,去盒子里找。只有一个就是那个数据,不止就在盒子里的链表线性找
数组空间太小,冲突概率大,数组太大,空盒子太多,内存浪费
链地址法(放在链表中)
开放地址法(计算一个盒子的地址)
堆 被用于实现优先队列(适合频繁的取最小值,如迪杰斯特拉每次选最近顶点)
往堆中加数,先放在最下层空的地方,若堆顶数被取出,也将最下层最右边数先放在堆顶。再做调整。
调整堆从上往下,添加数从下往上
BST树(二分思想那边)
最小值要从左端开始,往左下的末端寻找
最大值从右端,右下的末端
添加的数小于比较数,左移,否则右移
删除,没有子节点直接删掉
只有一个子节点,直接补上去
否则,在被删结点的左子树找最大的替代它/右子树中最小的替代它
第2章 排序
冒泡排序:可以从后往前两两比较,最小的数冒到最前面。也可以从前往后
选择排序:从待排的中选出最小的,和待排中最左边交换
都是第一轮比较n-1次,第n-1轮比较1次就好,复杂度都是n^2
插入排序:固定从左端排序,右侧留下待排序。待排比左边小,则交换
第1次比较0个数,第2次比较1个数,第n次比较n-1个数。复杂度还是n^2
堆排序
将n个数据放入堆中,复杂度nlogn
归并排序
归并是指把两个排好序的子序列,合成更大的有序序列,比如4个2,先把左边2个2分别排序,然后合并成1个4。
怎么合并:找出首位最小的那个数,然后移动它
分割的时间不算在里面,往上归并的过程也很像树,复杂度也nlogn
快排
选pivot,小于一次左移,大于依次右移,不论左移后和右移后的大小
一直分割迭代,给人以归并的相反感觉
往下一层层分割 为logn层,每层都要跟pivot比较,复杂度也是nlogn
第3章 数组查找
线性查找
只能查找已排序的数据
二分查找
也是查已排序数据,复杂度logn
第4章 图的搜索
从顶点搜索直到指定顶点(终点)
深度优先:沿着一条路径不断往下直到不能继续为止,然后再折返。开始搜索下一条候补路径(最新成为候补点)
将可以直接到达的点,中最近的作为下一个候补点,上一个点变色,标记已完成
广度优先:优先选离起点近的做候补点。候补点用FIFO的方式,先加入图的优先访问。访问完的变色,标记访问过了(最早成为候补点)
福特算法:最短路径
起点外的顶点默认标∞,表示起点到他的距离。边就是两顶点间距离
当起点到某个点的计算距离变短时,更新顶点上的权重。
狄克斯特拉算法:
更注重顶点,不能有负权重
A*算法:狄克斯特拉只考虑顶点到候补顶点的距离,来决定下一个顶点。还会考虑当前顶点到终点的估算距离
估算距离和实际距离越近,A*算法越靠谱
第7章 其他算法
一直取除数和余数相除,直到余数为0.除数就是最大公约数
素性测试,RSA算法也会用到
即费马小定理:n
n^p%p=n
汉诺塔递归问题:t(n)=2t(n-1)+1,即2^n -1