图解密码技术总结

前言

最近一直在面试实习生岗,前后面试了几家。面试过程基本都不错,但是回答问题现在想想总觉得不够全面和细致,其中有面试官问我elf文件格式,我对elf文件格式还是很熟悉的,但是当时没有充分的表述出来,只说了头、节、段这些基本的概念。现在想想,应该从elf文件的分类、头的内容、节的由来、段的由来。典型的节、段内容、连接装载方式、android下elf特殊的地方等。一步一步系统的描述,并力求简短、提炼核心,这样才能更好的表现自己对知识的体系总结。毕竟是第一次面试,很是后悔,吸取教训,下次回答之前多多思考,不要抢答或是打断对方的话,冷静微兴奋,不要紧张或是激动。
知识上出问题的部分是密码学,这部分在被问到ssl时回答的很不好,基本全忘了,在此总结下密码学的内容。

密码

面临威胁:窃听、篡改、伪装、否认。
威胁特性:机密性、完整性、认证、不可否认性。
用来应对的密码技术: 对称密码、公匙密码、单向散列函数、消息认证码、数字签名、随机数生成器。
根据不同需求运用不同技术组合。

密码是隐藏内容,而隐写术隐藏的是消息本身。(我们在传递信息,但别人无法解读;别人不知道我们在传递信息)

常识:

  1. 不使用保密的密码算法–容易被算法的公布减弱强度。
  2. 使用低强度的密码比不进行任何加密更危险–影响自己的安全感,形成假安全感
  3. 任何密码总有一天被破解
  4. 密码只是信息安全的一部分–木桶效应

对称密码

实际上是将机密性压缩在了密匙中
64字节长度密匙足够防爆了。

DES:64位比特明文加密为64比特密文。更长采用分组模式
DES是一种16轮循环的feistel网络,密匙56比特。
容易被破解。

三重DES:为了增强DES强度,将DES重复三次。密匙168比特。
实现为加密、解密、加密,这样可以兼容普通的DES。
还在使用,但处理速度不高。

AES:分组长度固定128比特,密匙128、192、256比特。
使用PSN结构,安全、快速。

分组密码的模式

分组密码(DES、AES)对长文本加密需要模式。

ECB:明文分组加密后直接作为密文分组。
可受攻击:改变密文顺序即可修改明文

CBC:明文分组与前一个密文分组xor再进行加密形成密文分组,需要初始化向量。
解密:从前往后密文分组分组解密后xor前面的密文分组得出明文
可受攻击:对初始向量反转比特将可直接修改明文第一组
SSL/TLS使用

CFB:明文分组与前一个加密后的密文分组xor形成密文分组,需要初始化向量。
解密:从前往后密文分组xor前一个加密后的密文分组得到明文分组。
可受攻击:最后一个密文分组可翻转比特修改明文。重放攻击:用相同密匙加密的俩段消息,部分互相替换,可修改明文。
可用分组实现流密码

OFB:初始化向量不停加密,明文分组依次与加密的初始化向量xor形成密文分组。
解密:初始化向量不停加密,密文分组依次与加密的初始化向量xor形成明文分组。
可用于流
可受攻击:翻转比特

CTR:计数器每次递增后加密,将加密后的递增器与明文分组xor形成密文分组。
解密:相同
可用于流,可用于并行计算
可受攻击:翻转比特

公匙密码

RSA
公仅私可解,私仅公可解
处理速度只有对称密码的几百分之一。
破解难在求离散对数的问题…..我实际是算的求底…密文=明文的E次方modN…E是以明文为底密文的对数。
实际只要解决对大数进行质因数分解的高效算法。2048比特暂时是安全的。

不可防止中间人攻击。

混合密码

用对称密码提高速度、用公匙密码保护会话密匙。

其它交换法:Diffie-Hellman

认证

单向散列函数

用于检查数据的完整性,将数据化为短的散列值。
长度与消息长度无关,是固定的。单向性

要求:
长度固定、快、足够散列抗碰撞。
弱抗碰撞:找一个指定散列相同的消息困难
强抗碰撞:找任意俩条散列相同的消息困难

具体:
MD5-已经不安全
SHA-2、3常用

攻击:暴力破解利用多余性碰撞。
无法识别伪装

消息认证码

单向散列函数与密匙组合
证明消息是否被篡改。
将消息散列后加密一起发送,可以验证消息完整性。

攻击:重放攻击,截了不停重发
防御:每次发送的消息赋予递增的序号。或接受者先向对方发一个一次性随机数,发送者包含该随机数,每次不一样因此无法重放。

无法解决:
否认

数字签名

单向散列函数与公匙密码组合
证明消息是谁的
运用私匙加密,公匙解密,表明只有持有该密匙的人才能生成的消息。

防止否认:可以说自己私匙丢了…..这个自己否认总是有办法的

证书

公匙与数字签名组合
为公匙加上数字签名,能够认定:公匙确实属于此人

逐层信用,信用链。

攻击:注册相似人名

应用技术

密匙

密匙是消息秘密的精华。
用加盐防止字典攻击。口令容易被爆破

随机数

不可预测的源泉。

三级:
随机性、不可预测性、不可重现性。越来越严格
对应的随机数分类:
弱伪随机数、强伪随机数、真随机数

密码学用强伪随机数即可。

伪随机数生成器使用种子生成一串数字。

线性同余法不能运用于密码技术,c的rand、java的java.util.Random都是线性同余。
(A*内部状态+c)%M

单向散列可以用于生成强伪随机。用密码算法加密也可以。

SSL/TLS

SSL属于应用层,可以承载其它协议如http。
是一种技术框架,可以替换内容。
提供了几种密码套餐,双方会在ssl建立中协定使用哪种套餐。

加密传输时会有:分为多个片段,对每个片段压缩、加消息认证码、加编号。之后一起对称加密CBC模式。最后加上类型、版本、长度报头。
类型4种:握手、密码规格变更协议、警告协议、应用数据协议。

握手协议:

  1. C->S 可用版本号、当前时间、客户端随机数、会话id、可用密码套件、可用压缩方式
  2. C<-S 使用的版本号、当前时间、服务器随机数、会话id、使用的密码套件、使用的压缩方式
  3. C<-S 证书清单/RSA密匙交换(证书信息不足时)
  4. C<-S 证书类型清单、认证机构清单(需要客户端证明时)
  5. C<-S 问候结束
  6. C->S 客户端证书
  7. C->S 加密的主密码
  8. C->S 数字签名,证书本人
  9. C->S 切换密码,结束握手
  10. C<-S 切换密码,结束握手
  11. 成为应用数据协议

在实现时openSSL有过著名的心脏出血漏洞,数据大小没检查返回内存中数据。

面试时被问过套件选择….常见的有:
RSA/3DES,DSS/AES

其它密码技术

密匙:机密性压缩
散列:完整性压缩
消息认证码:消息认证压缩
数字签名:消息认证压缩
随机数:随机性压缩为种子随机

比特币

完全依赖于用户组成的P2P网络
区块链是保存比特币全部交易记录的公共账本。
将交易散列与上一块的散列一起存储为一块。
向链中添加新的记录交易的块就是挖矿。
为了证明自己完成了工作,规定新块的散列值前几位必须是0,通过在新块中修改nonce实现,相当于暴力破解单向散列函数。

完美的密码技术

量子密码:通信本身不可窃听
量子计算机:计算力庞大