android开发你应该懂的密码基础

2,842 阅读6分钟

本篇文章其实算是《图解密码技术》一书的读书笔记。对于密码技术的入门推荐好好看完这本书。

对称密码

对称加密,是指加密和解密使用相同的密钥。对称加密的优点是速度比较快,但是会存在密钥配送的问题。在密钥配送方面可以使用Diffie-Hellman算法来解决。下面是对称加密常用的算法:

  • DES(Data Encryption Standard)

一种将64比特的明文加密成64比特密文的对称密码算法。des的密钥长度规格上讲是64位,因为每隔七比特设置一个错误检查比特,实质密钥长度是56位。示意图如下所示:

  • 三重DES

为了增强DES的加密强度,将DES重复3次所得的一种密码算法(注意加密的步骤是:加密-解密-加密)。示意图如下所示:

  • AES(Advanced Encryption Standard)

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)

分组密码的模式

分组密码:每次只能处理特定长度的一块数据的一类密码算法;流密码:对数据流进行连续处理的一类密码算法

  • ECB(Electronic CodeBook mode)电子密码本模式

在ECB模式中,将明文分组加密之后的结果直接成为密文分组.示意图如下所示:

  • CBC(Cipher Block Chaining mode)密码分组链接模式

在CBC模式中,首先将明文分组与前一个密文分组进行异或运算,然后再进行加密(初始化向量IV).示意图如下所示:

  • CFB(Cipher FeedBack mode) 密文反馈模式

在CFB模式中,前一个密文分组会被送回到密码算法的输入端.示意图如下所示:

  • OFB(Output FeedBack mode) 输出反馈模式

在OFB模式中,密码算法的输出会反馈到密码算法的输入中。示意图如下所示:

  • CTR(Counter mode) 计数器模式

CTR模式是一种通过逐次累加的计数器进行加密来生成密钥流的流密码.示意图如下所示:

下面使用一张表格总结上面几种模式的差异和优缺点:

模式 优点 缺点 备注
ECB模式 简单、快速;
支持并行计算(加密、解密)
明文的重复排列会反映在密文中;
通过删除、替换密文分组可以对明文进行操作;
对包含某些错误比特的密文进行解密时,
对应分组会出错;不能抵御重放攻击
不应使用
CBC模式 明文的重复序列不会反映在密文中;
解密支持并行计算;
能够解密任意密文分组
加密不支持并行计算;
对包含某些错误比特的密文进行解密时,
第一分组的全部比特以及后一个分组的相应比特会出错;
推荐使用
CFB模式 不需要填充;
解密支持并行计算;
能够解密任意密文分组
加密不支持并行计算;
对包含某些错误比特的密文进行解密时,
第一分组的全部比特以及后一个分组的相应比特会出错;
不能抵御重放攻击
现已不使用,推荐使用CTR模式代替
OFB模式 不需要填充;
可事先进行解密、加密的准备;
加密、解密使用相同结构;
对包含某些比特错误的密文进行解密时,
只有明文中相应比特会出错
不支持并行计算;
主动攻击者反转密文某些比特时,
明文分组相应比特也会受到反转
推荐使用CTR模式代替
CTR模式 不需要填充;
可事先进行解密、加密的准备;
加密、解密使用相同结构;
对包含某些比特错误的密文进行解密时,
只有明文中相应比特会出错;
支持并行计算(加密、解密)
主动攻击者反转密文某些比特时,
明文分组相应比特也会受到反转
推荐使用

公钥密码

跟对称加密不同,非对称加密在加密和解密两个阶段使用的是不同的密钥。加密时候使用的密钥我们称之为公钥,解密时使用的密钥称之为密钥。通常公钥都是公开的,私钥是通信双方自己保留不能公开的。在非对称加密中使用到的主要是 RSA算法 。其交互流程大概如下所示:

单向散列函数(消息摘要)

单向散列函数只能辨别出“篡改”,无法辨别出“伪装”

  • 常见单向散列函数

    • MD5
    • SHA-1 SHA-256 SHA-384 SHA-512
  • 应用

    • 检测软件是否被篡改
    • 一次性口令
    • 为随机数生成器
    • 数字签名
    • PBE(Password Base Encryption)基于口令的加密
    • 消息认证码
  • 攻击

    • 暴力攻击,如彩虹表

消息认证码MAC(message authentication code)

消息认证码是一种确认完整性并进行认证的技术。消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,输出一个固定长度的数据,称为MAC值

消息认证码可以识别篡改和伪装,但是不能解决“对第三方证明”以及“防止否认”这两个问题

  • 实现方法

    • 使用单向散列函数,如HMAC
    • 使用分组密码实现

      将分组密码的密钥作为消息认证码的共享密钥来使用,并使用CBC模式将消息加密,将除最后一个密文分组以外的丢弃,并将最后一个密文分组作为MAC值

  • 应用实例

    • IPsec:对通信内容的认证和完整性校验都是采用消息认证码完成
    • SSL/TLS:对通信内容的认证和完整性校验也使用了消息认证码
  • 攻击

    • 重放攻击
    • 暴力破解

数字签名

数字签名可以识别篡改和伪装,还能防止否认

  • 数字签名与公钥密码

  • 应用

    • 安全信息公告
    • 软件下载
    • 公钥证书

      验证数字签名时需要使用合法的公钥,而为了确保公钥合法,可以将公钥作为消息体,对其加上数字签名

    • SSL/TLS

      SSL/TLS在认证服务器身份是否合法的时候需要使用服务器证书,而服务器证书就是加上了数字签名的服务器公钥

  • 实现

    使用RSA

  • 攻击

    • 中间人攻击
    • 对单向散列函数的攻击
    • 利用数字签名攻击公钥密码
    • 证书

为公钥添加数字签名

下面附上一张简单的思维导图

上面总结的比较简单,只是大概谈及了一下概念。如果对于具体细节感兴趣的推荐看一下《图解密码技术》这本书。感谢你宝贵的时间阅读这篇文章。