密码学基础

对于Android逆向所需的密码学基础进行简单总结。

1.密码学基本概念

  • 明文M:原始数据,待加密的数据
  • 密文C:对明文进行某种伪装或变换后的输出
  • 密钥K:加密或解密中所使用的专门工具
  • 加密E:用某种方法将明文变成密文的过程
  • 解密D:将密文恢复成明文的过程

密码学(Cryptography)一般可分为古典密码学和现代密码学。

其中,古典密码学,作为一种实用性艺术存在,其编码和破译通常依赖于设计者和敌手的创造力与技巧,并没有对密码学原件进行清晰的定义。古典密码学主要包含以下几个方面:

  • 单表替换加密(Monoalphabetic Cipher)
  • 多表替换加密(Polyalphabetic Cipher)
  • 奇奇怪怪的加密方式

而现代密码学则起源于 20 世纪中后期出现的大量相关理论,1949 年香农(C. E. Shannon)发表了题为《保密系统的通信理论》的经典论文标志着现代密码学的开始。现代密码学主要包含以下几个方面:

  • 对称加密(Symmetric Cryptography),以 DES,AES,RC4 为代表。
  • 非对称加密(Asymmetric Cryptography),以 RSA,ElGamal,椭圆曲线加密为代表。
  • 哈希函数(Hash Function),以 MD5,SHA-1,SHA-512 等为代表。
  • 数字签名(Digital Signature),以 RSA 签名,ElGamal 签名,DSA 签名为代表。

其中,对称加密体制主要分为两种方式:

  • 分组密码(Block Cipher),又称为块密码。
  • 序列密码(Stream Cipher),又称为流密码。

一般来说,密码设计者的根本目标是保障信息及信息系统的

  • 机密性(Confidentiality)
  • 完整性(Integrity)
  • 可用性(Availability)
  • 认证性(Authentication)
  • 不可否认性(Non-repudiation)

其中,前三者被称为信息安全的 CIA 三要素 。

2.古典密码学

古典密码是密码学中的其中一个类型,其大部分加密方式都是利用替换式密码或移项式密码,有时则是两者的混合。其于历史中经常使用,但现代已经很少使用,大部分的已经不再使用了。

(1)替换式密码

又名取代加密法,是密码学中按规律将文字加密的一种方式。替换式密码中可以用不同字母数为一单元,例如每一个或两个字母为一单元,然后再作加密。密文接收者解密时需用原加密方式解码才可取得原文本。由于拼音文字中字的组成为有限的字母,以英语为例只有26个字母,组成可能的单元数较少,因此使用替换式密码相对较为容易,而且亦可使用简单机械进行加密;相反,非拼音文字如中文则因单元数非常大难以使用一般加密方式,必需建立密码本,然后逐字替换。

  • 凯撒密码
  • 维吉尼亚密码

(2)移项式密码

移位式密码,它们字母本身不变,但它们在消息中顺序是依照一个定义明确的项目改变。许多移位式密码是基于几何而设计的。一个简单的加密(也易被破解),可以将字母向右移1位。例如,明文”Hello my name is Alice.”将变成”olleH ym eman si ecilA.”。

3.现代密码学基础

1.概述

(1)密码学的分类

  • 密码编码学——设计和研究密码通信系统,使其传递的信息具有很强的保密性和认证性的学科。
  • 密码分析学——研究如何从密文推出明文、密钥或解密算法的学科。
  • 密钥管理学——研究密钥的产生、分配、存储、传递、装入、丢失、销毁以及保护等内容的学科。

(2)密码理论与技术

  1. 基于数学的密码理论与技术——公钥密码、分组密码、序列密码、认证码、数字签名、Hash函数、身份识别、密钥管理、PKI 技术、VPN 技术等。
  2. 非数学的密码理论与技术——信息隐藏、量子密码、基于生物特征的识别理论与技术等。

(3)通用密码系统

一个密码系统由五元组(M、C、K、E、D)组成,如图所示——


特点:除用安全信道传送K密钥外,其他都是可以公开的。

(4)密码分析攻击的类型(抗攻击强度由弱到强)

  1. 未知算法攻击:仅从密文进行破译;
  2. 惟密文攻击(Ciphertext only):仅已知密码算法和密文进行破译;
  3. 已知明文( 密文) 攻击(Known plaintext):攻击者拥有一些明文/密文对;
  4. 选择明文攻击(Chosen plaintext) :攻击者可以有选择地一些对攻击有利的特定明文,并产生与之对应的密文。相当于攻击者已拥有装有加密密钥的加密装置,但还无法获得密钥,这时的攻击目标是能解读截获的密文。(窃听)
  5. 选择密文攻击(Chosen ciphertext) :攻击者可以有选择地一些对攻击有利的特定密文,并能得到与之对应的明文。相当于攻击者已拥有装有解密密钥的解密装置(已能窃听),但还无法获得密钥,这时的攻击目标是能够伪造密文。(伪造)
  6. 其中,(2)~(5)均假设攻击者已知算法和已有密文。

(5)密码体制的分类

密码体制的分类方法有很多,常用的分类方法是——

2.分组密码体制

(1)概述

分组密码体制是在密钥控制下一次变换一个明文数据块(又称为分组)的密码体制。对分组加密算法的一般要求如下——

  • 分组长度足够大。防止攻击者通过收集不同的密文/明文对来进行穷举明文空间攻击。
  • 如分组长度仅为8bit时,若收集256个不同的密文/明文对就可破译整个分组密文。
  • 密钥空间应足够大。防止攻击者穷举密钥空间的攻击。
  • 密码算法足够复杂。是破译者除了采用强行攻击(穷举法)外,找不到其它密码分析方法(当然社会学方法除外)。

(2)分组密码算法举例

  • DES
  • 三重DES
  • IDEA
  • RC5
  • AES

(3)总结比较分组密码的几种操作方式

3.序列密码体制

(1)概述

序列密码又称为流密码(stream cipher ),它是对称密码算法的一种。序列密码具有软件实现简单、便于硬件实现、加解密处理速度快、没有或只有有限的错误传播特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信和外交通信。

序列密码分为同步序列密码(如分组加密的OFB模式)和自同步序列密码两种

(2)实例

  • 基于LFSR 的序列密码
  • 序列密码算法RC4
  • ……

4.分组密码与序列密码的对比

  1. 分组密码以一定大小的分组作为每次处理的基本单元,而序列密码则以一个元素(如一个字母或一个比特)作为基本的处理单元。
  2. 序列密码使用一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,硬件实现电路更简单;其缺点是:低扩散(意味着混乱不够)、插入及修改的不敏感性。
  3. 分组密码使用的是一个不随时间变化的固定变换,具有扩散性好、插入敏感等优点;其缺点是:加密处理速度慢、存在错误传播。

5.非对称密码体制 (公钥密码体制)

(1)公钥密码体制模型

(2)算法/实例

公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

  • RSA
  • ElGamal
  • 背包密码体制
  • 椭圆曲线密码体制(Menezes-Vanstone 公钥密码体制)
  • Rabin 密码体制
  • 椭圆加密算法ECC(ECC使用的是椭圆曲线编码学,相对于RSA,ECC的抗攻击性更强,并且计算量小,处理速度快,存储空间占用小,所以适用于移动设备使用。)

(3)公钥密码体制的应用

  • 密钥交换
  • 数字签名
  • 加密/解密(不推荐用公钥密码对消息直接进行加密)

(4)两种密码体制的比较

1.对称密码体制

  • 对明文/密文变换时,加解密密钥相同,或可相互导出;
  • 双方在通信前需要安全地协商共享密钥;
  • 加解密算法效率较公开密码算法高;
  • 系统开放性差,密钥管理复杂;
  • 不能提供抗抵赖服务。

2.非对称密码体制

  • 对明文/密文变换时,加解密密钥不相同,且不能由公钥导出私钥;
  • 公钥应公开,私钥保密;
  • 系统开放性好,密钥管理较容易;
  • 可提供抗抵赖服务(数字签名)
  • 加解密运算复杂,效率低,不宜作数据加密;
  • 存在特有的,“可能报文攻击”的威胁。

6.密钥管理

(1)密钥分配

保密通信中的一方利用此机制生成并选择秘密密钥,然后将其传送给通信的另一方或通信的其他多方。典型协议:Kerboros密钥分配协议、Blom密钥预分配。

(2)密钥协商

通常是一种协议,利用该协议,通信双方可以在一个公开的信道上通过相互传送一些消息来共同建立一个共享的秘密密钥。在密钥协商中,双方共同建立的秘密密钥通常是双方输入消息的一个函数。典型协议:Diffie-Hellman密钥交换协议。

7.网络通信的加密方式

(1)分类

  • 链路加密(Link encryption)
  • 端- 端加密(End-to-End encryption)
  • 端对端加密 + 链路加密

8.报文鉴别与散列函数

(1)报文鉴别

定义

报文鉴别是指在两个通信者之间建立通信联系后,每个通信者对收到信息进行验证,以保证所收到信息的真实性的过程。确保——

  • 报文是由确认的发送方产生的;
  • 报文内容没有被篡改过;
  • 报文是按与发送时的相同顺序收到的。
如何实现报文鉴别?

鉴别符:附加在报文上的额外信息。当报文必须经过签别才能被接受时,鉴别符可使接收端验证该报文。鉴别符可以在功能上与报文本身的内容无关(例如,仅用一次的标识符或信源标识符),也可以是报文内容的一个函数。

产生报文鉴别符的三类方法
  1. 报文加密:报文用对称密钥算法加密后的密文作为鉴别符。
  2. 散列函数:是一个将任意长度的报文映射为定长的散列值的公共函数,以散列值作为鉴别符。
  3. 报文鉴别码(MAC,Message Authentication):使用一个通信双方共享的秘密信息(如密钥)产生一个定长数据分组,并将它附加在报文中作为鉴别符。即所谓的密码检验(MAC)。

(2)散列函数(Hash Function)

定义
  1. 单向散列函数H( )是一种单向密码体制,它是一个从明文到密文的不可逆函数,也就是说,是无法解密的。
  2. 密码学上的Hash函数是一种将任意长度的消息M映射为较短的、固定长度的一个值H(M)的函数 ,称函数值H(M)为消息摘要MD(Message Digest)或散列码。 MD可作为报文鉴别的鉴别符。
主要应用
  • 保证数据的完整性;
  • 单向数据加密:如口令表加密;
  • 数字签名。
基本性质

单向散列函数
  1. 基于分组密码的Hash函数(基于分组密码的CBC工作模式的Hash函数、基于分组密码的CFB工作模式的Hash函数);
  2. 无密钥散列函数;
  3. 直接设计单向散列函数——这类单向散列函数并不基于任何假设和密码体制,它通过直接构造复杂的非线性关系达到单向性要求。这类算法是目前比较流行的一种设计方法,典型的有:MD2、MD4、MD5、SHA-1、PIPE-MD、HAVAL等算法。
对单向散列函数的攻击

对单向散列函数的攻击是指攻击者寻找一对产生碰撞消息的过程。评价单向散列函数的最好的方法就是看一个攻击者找到一对碰撞消息所花的代价有多高。通常在讨论单向散列函数的安全性时,我们都假设敌手已经知道单向散列函数算法(遵循Korchoffs假设)。目前对单向散列函数的攻击方法可以分为以下几类——

  • 强力攻击(或穷举攻击):典型方法如生日攻击。
  • 利用单向散列函数的的弱性质(结构和代数性质),如中间相遇攻击、修正分组攻击和差分分析等。
  • 另外,若使用其他密码算法来构造单向散列函数,还可能因为所用的密码算法的弱点而引起攻击(例如,DES的一些众所周知的弱点,如互补性、弱密钥与半弱密钥等,都可用来攻击基于DES构造的单向散列函数)。
单向散列函数SHA
  1. 基础是MD4,SHA不基于任何假设和密码体制,它采用了直接构造的办法,速度很快(除了加法之外,算法中并没有大的运算),非常实用。
  2. SHA系列算法的比较如下——SHA-1,SHA-256,SHA-384,SHA-512这些散列函数的主要差别在于填充方法、字长、初始常数、基本函数等部分,它们的基本运算结构大体是相同的。

MD5消息摘要算法

一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

SHA与MD5的比较(均由MD4演化而来)


(3)数字签名

概述

数字签名的主要作用——将消息和拥有消息的实体可信地联系起来。

过程与示意图

  1. 发送方要发送消息运用散列函数(MD5、SHA-1等)形成消息摘要;
  2. 发送方用自己的私钥对消息摘要进行加密,形成数字签名;
  3. 发送方将数字签名附加在消息后发送给接收方;
  4. 接受方用发送方的公钥对签名信息进行解密,得到消息摘要;
  5. 接收方以相同的散列函数对接收到的消息进行散列,也得到一份消息摘要;
  6. 接收方比较两个消息摘要,如果完全一致,说明数据没有被篡改,签名真实有效;否则拒绝该签名。
实例
  • RSA数字签名体制
  • ElGamal数字签名体制
  • 基于椭圆曲线密码的数字签名算法ECDSA
  • 数字签名标准(DSS, Digital Signature Standard),DSS中所采用算法通常称为DSA(Digital Signature Algorithm)。
  • 特殊数字签名方案
特殊数字签名的实例
  • 盲签名——D.Chaum 盲签名(RSA)方案
  • 不可否认签名——D.Chaum不可否认签名
  • 代理签名——M-U-O代理签名方案
  • 门限签名——HAN 可验证门限签名方案
  • 群签名
  • ……

9.身份鉴别技术

(1)概念

身份鉴别也称为“身份验证”或“身份认证”,是指在计算机及计算机网络系统中确认操作者身份的过程,从而确定该用户是否具有对某种资源的访问和使用权限,进而使计算机和网络系统的访问策略能够可靠、有效地执行,防止攻击者假冒合法用户获得资源的访问权限,保证系统和数据的安全,以及授权访问者的合法利益。

  1. 身份认证协议一般在两个通信方之间进行,一方按照协议向另一方发出认证请求,对方按照协议规定作出响应,协议执行成功后,双方应能确信对方身份。
  2. 身份认证也可以依靠双方都信任的第三方,如密钥分发中心,或证书签发权威来执行。
  3. 身份认证协议中验证身份所用密钥称为认证密钥,可以使用对称密钥,也可使用公钥。身份认证协议分为基于对称密钥和基于公钥两类。

(2)针对身份鉴别的主要威胁和攻击手段

(3)常用身份鉴别技术

  • 静态口令鉴别(PAP; Password Authentication Protocol)
  • 一次性口令鉴别 (OTP: One time Password)
  • 双因子身份鉴别(如基于智能卡)
  • 生物特征鉴别
  • 利用对称加密算法实现身份鉴别
  • 利用公钥技术实现身份鉴别
  • 基于证书的身份认证
  • 基于密码算法的鉴别协议
  • 零知识证明
基于证书的身份认证

目前国内外普遍使用的、技术成熟的、可实际使用的还是基于证书的数字签名技术的认证。公钥基础设施PKI(Public Key Infrastructure)可提供多种网上安全服务,主要是认证、授权、数据保密性、数据完整性和不可否认性。

在网络环境中公钥以电子证书的形式签发,由所谓的证书权威机构CA生成和签发。CA是大家都信任的第三方。

关键——CA 证书+“三趟消息”

10.总结

提供机密性、完整性和身份鉴别的安全通信示例(发送端)

4.密码攻击理论

在我们攻击一个密码学系统时,我们或多或少会得到关于这个系统的一些信息。根据得到信息量的不同,我们可以采用的方法就可能不同。在当今的密码学分析时,一般我们都会假设攻击者知道密码学算法,获取算法的方式多重多样,比如间谍,逆向工程等。

1.攻击模式

根据攻击者获取密码学系统的信息的多少将攻击模式分为以下几类。

  1. 唯密文攻击:攻击者仅能获得一些加密过的密文。
  2. 已知明文攻击:攻击者有一些密文对应的明文。
  3. 选择明文攻击:攻击者在开始攻击时可以选择一些明文,并获取加密后的密文。如果攻击者在攻击中途可以根据已经获取的信息选择新的明文并获取对应的密文,则称为适应性选择明文攻击。
  4. 选择密文攻击:攻击者在开始攻击之前可以选择一些密文,并获取解密后的明文。如果攻击者在攻击图中可以根据已经获取的信息选择一些新的密文并获取对应的明文,则称为适应性选择密文攻击。
  5. 相关密钥攻击:攻击者可以获得两个或多个相关密钥的加密或解密后的密文或明文。但是攻击者不知道这些密钥。

2.常见攻击方法

根据不同的攻击模式,可能会有不同的攻击方法,目前常见的攻击方法主要有——

  • 暴力攻击
  • 中间相遇攻击
  • 线性分析
  • 差分分析
  • 不可能差分分析
  • 积分分析
  • 代数分析
  • 相关密钥攻击
  • 侧信道攻击

5.密码学库的识别

1.Android平台

(1)概述

Android App开发过程中,加解密功能主要是利用Android SDK提供的加密相关的API进行编程实现的。

Android SDK使用的加密相关的API和JAVA提供的基本相似,由Java Cryptography Architecture(JCA,java加密体系结构),Java Cryptography Extension(JCE,Java加密扩展包),Java Secure Sockets Extension(JSSE,Java安全套接字扩展包),Java Authentication and Authentication Service(JAAS,Java 鉴别与安全服务)组成。

  1. JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器,对应的Android API中的以下几个包:java.security、java.security.acl、java.security.cert、java.security.interfaces、java.security.spec
  2. JCE扩展了JCA,提供了各种加密算法、摘要算法、密钥管理等功能,对应的Android API中的以下几个包:javax.crypto、javax.crypto.interfaces、javax.crypto.spec
  3. JSSE提供了SSL(基于安全套接层)的加密功能,使用HTTPS加密传输使用,对应的Android API主要在java.net.ssl包中。
  4. JAAS 提供了在Java平台上进行用户身份鉴别的功能。对应的Android API主要在以下几个包:javax.security.auth、javax.security.auth.login、javax.security.auth.callback、javax.security.auth.x500
  5. 此外Android API还提供了android.securityandroid.security.keystore(API 23新增)来管理keychain和keystore。

(2)分类与总结

各种常用的加解密算法与对应的Android API所在的包如下——

算法 相关包名 补充说明
Base64编码算法 android.util.Base64 base64只是一种编码方式,并不是一种加密算法,不要使用base64来加密数据。
Hash算法(如SHA、MD5等) java.security.MessageDigest ……
对称加密算法(如AES) javax.crypto.Cipher(提供加密解密的API)javax.crypto.spec.SecretKeySpec(提供key管理的API) 还可能出现以下包——javax.crypto.KeyGeneratorjavax.crypto.SecretKey
非对称加密算法(如RSA用于数字签名或加密) 主要的包如下图中红框标注所示 还有一些相关包如下图所示

注意——逆向分析Android App时可根据上述特征识别判断对应的加解密算法。

2.其他(主要参考自密码学软件博物馆

(1)常见密码学库

high-level crypto library
  • cryptlib
  • GPGME
  • Keyczar
  • NaCL
  • libsodium
low-level crypto library:
  • botan
  • crypto++
  • tomcrypt
  • nettle
  • gcrypt
  • Windows Crypto APIs
Java Crypto
SSL库
  • OpenSSL/BoringSSL/LibreSSL/GMSSL
  • GnuTLS
  • NSS
  • CyaSSL/WolfSSL
  • XySSL/PolarSSL/TropicSSL/mBed TLS
  • axTLS
  • MatrixSSL
  • BearSSL
Lightweight Crypto
  • Tinycrypt
  • Libhydrogen
  • Arduino Cryptography Library
  • TinyECC
  • A modified version of TinyECC
  • TinyECDH
  • MicroECC
  • Lightweight Crypto Lib
python crypto
  • Welcome to pyca/cryptography
  • fastecdsa · PyPI
JS crypto
  • bitwiseshiftleft/sjcl: Stanford Javascript Crypto Library
misc
  • Fast, simple, cryptographically strong random numbers in C++. Experimental.
Obsolete
  • RSAREF
Proprietary Crypto
  • A Brief Look At North Korean Cryptography

(2)常见密码学软件

  • putty
  • Truecrypt 7.2 (已经停止开发,但是依然很经典)
  • Keepass
  • OpenVPN
  • OpenSSH

6.关于Android-加密与在开发时使用设备管理策略

这一部分内容主要讨论如何正确的使用加密技术,在Android设备上安全的存储数据。我们首先要引入自己实现的加密算法库,使较老的设备上也能实现较高强度的加密算法,为后续的各种策略提供稳固的基础。

(1)概述

  • 使用加密库(如开源库Spongy Castle
  • 生成对称加密密钥
  • 保护SharedPreferences数据(通过对应的开源加密库secure-preferences
  • 基于口令的加密(PBE)
  • SQLCiper加密数据库(类似的还有用于加密APP中各个文件的项目IOCiper
  • AndroidKeyStore provider(在 Android4.3中,添加了一个新的功能,它使得app能把加密私钥保存在一个名为“ Android KeyStore”的系统 KeyStore中。“Android KeyStore”只能被创建它的app访问,并由设备pin码保护。具体而言, Android KeyStore是个证书存储(certificate store),所以只有公钥私钥可以存放在其中。
  • 在开发时使用设备管理策略

(2)主要内容

1.生成对称加密密钥

接下来显示如何正确初始化SecurityRandom类,以及如何用其初始化一个AES加密密钥。AES是继DES之后的新一代加密标准,通常使用长度为128位和256位的密钥。

具体实现示例

补充说明

2.基于口令的加密

在运行时,用通常是由用户提供的口令/passcode去创建(推导出)加密密钥。

具体实现示例

补充说明

3.在开发时使用设备管理策略

设备管理策略在 Android2.2中被首次引入(但这个功能及设备加密相关的具体限制却要到Android3.0以上版本才被加上),它能授权app获取更高级别的设备控制能力。这些特性主要针对企业级app的开发人员,给予他们控制、限制和潜在的破坏能力,同时还为他们提供了可选的第三方移动设备管理(MDM)解决方案。一般来说,除非已经建立了相应的信任关系,比如,银行和银行app,它并不面向消费类app( consumer app)。这个实验将定义以下两个旨在加强设备安全性的设备策略,此外它们也可以成为企业移动安全策略的一部分。

  • 设备强制加密(这也将确保使用pin码/口令)。
  • 强制执行最大超时锁屏时间。

除了以上策略,设备管理员还可以执行以下操作。

  • 强制使用密码
  • 规定密码的复杂度
  • 3.0及后续版本中,记录用户曾经输入过的口令
  • 恢复出厂设置前密码验证失败的最大次数
  • 恢复出厂设置
  • 锁定设备
  • 禁用锁屏小部件(4.2以上版本)
  • 禁用摄像头(4.0以上版本)

[Android学习笔记七] 设备管理服务示例开发
设备管理应用程序的实现(Device Administration )

7.对典型加解密算法的介绍

常见的加密算法可以分成三种:

  • 对称加密算法;
  • 非对称加密算法;
  • Hash算法(Hash算法(哈希散列算法)特别之处在于它是一种单向算法,即不可逆,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,但是却不能通过这个Hash值重新获得目标信息。);

A.DES(对称加密)

DES处理的明文分组长度为64位,密文分组长度也是64位,使用的密钥长度为56位(实现上函数要求一个64位的密钥作为输入,但其中用到的只有56位,另外8位可以用作奇偶校验位或者其他用途)。DES的解密过程和加密相似,解密时使用与加密同样的算法,不过子密钥的使用次序要反过来。DES的整个体制是公开的,系统的安全性完全靠密钥的保密。

B.AES(对称加密)

AES加密算法即密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。

AES算法本质上是一种对称分组密码体制,AES是一个迭代分组密码,其分组长度和密钥长度都是可变的,只是为了满足AES的要求才限定处理的分组大小为128位,而密钥长度为128位、192位或256位,相应的迭代轮数N,为10轮、12轮、14轮。

AES算法,基本变换包括SubBytes(字节替代)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加)KeyExtension(密钥扩展)。

AES解密算法与加密不同,基本运算中除了AddRoundKey(轮密钥加)不变外,其余的都需要进行逆变换,即InvSubBytes(逆字节替代)、InvShiftRows(逆行移位)、InvMixColumns(逆列混淆)。

AES的原理图和基本加密流程如下——

  1. 把明文按照128bit拆分成若干个明文块。
  2. 按照选择的填充方式来填充最后一个明文块。
  3. 每一个明文块利用AES加密器和密钥,加密成密文块。
  4. 拼接所有的密文块,成为最终的密文结果。

(1)AES加密器

AES加密不是一次把明文变成密文,而是先后经过很多轮加密。

  • 初始轮(Initial Round) 1次
  • 普通轮(Rounds) N次
  • 最终轮(Final Round) 1次

AES的Key支持三种长度:AES128,AES192,AES256。Key的长度决定了AES加密的轮数。除去初始轮,各种Key长度对应的轮数如下:

  • AES128:10轮
  • AES192:12轮
  • AES256:14轮

不同阶段的轮有不同的处理步骤。初始轮只有一个步骤:加轮密钥(AddRoundKey)。普通轮有四个步骤:字节代替(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)、加轮密钥(AddRoundKey)。最终轮有三个步骤:字节代替(SubBytes)、行移位(ShiftRows)、加轮密钥(AddRoundKey)

解密流程基本是把加密流程倒置过来,顺序变为最终轮——>普通轮——>初始轮,扩展密钥的使用顺序也和加密相反。

(2)AES的工作模式和填充模式

工作模式

AES加密算法提供了五种不同的工作模式:ECB、CBC、CTR、CFB、OFB,所有工作模式的差别体现在宏观上,即明文块与明文块之间的关联,AES加密器的内部处理流程都是相同的。

如果AES加密的时候使用了某一种工作模式,解密的时候也必须采用同样的工作模式。

ECB模式(不安全)——

CBC模式——

填充模式

在对称加密(分组加密算法)中,常用的填充模式如下——

  • NoPadding(不填充,在默认情况下,这种padding,要求 密钥、初始向量IV长度都是16字节,内容字节长度必须是16的倍数,如果不是16的倍数,则引发异常。如果一定要使用这种padding,而无法保证内容为16字节的倍数,可以考虑自实现一套规则,补全内容长度为16*n)
  • ZeroPadding(Zero 在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中所有字节填充为0x00,零填充在数据最后字节为零的时候可能不可逆)
  • PKCS5Padding/PKCS7Padding(在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中所有字节填充为需要填充的字节长度值)
  • ISO10126Padding(在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中最后一个字节填充为需要填充的字节长度值, 填充字节中其余字节均填充随机数值.)
  • ssl3Padding
  • ANSIX923Padding(在填充时首先获取需要填充的字节长度 = (块长度 - (数据长度 % 块长度)), 在填充字节序列中最后一个字节填充为需要填充的字节长度值, 填充字节中其余字节均填充数字零.)

补充说明——

  1. PKCS5和PKCS7的填充方式相同,都是用填充的总字节数进行填充。区别在于PKCS5的规范中只讨论了 (8字节/64位) 块的加密, 而在PKCS7Padding定义中,对于块的大小是不确定的。因此PKCS7可以用于不是64位整数倍的块的填充。并且向下兼容PKCS5Padding。对于AES加密(16字节/128位),这两种填充方式效果相同。
  2. ssl3Padding也与PKCS5/PKCS7相同,都是用总字节数填充,区别在于SSL在明文和填充块之间有一组消息验证码(MAC)。

(3)AES的安全性

密钥长度越大,加密轮数就越多,安全性也就越高,但加密的时间成本也就越高,所以一般根据自己的需求选择密钥长度。

C.RSA(非对称加密)

RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是最优秀的公钥方案之一。RSA是第一个能同时加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击。

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是如果想要对其进行因式分解却极其困难,因此可以将乘积公开作为密钥。

D.MD5(哈希)

MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。算法原理如下——

对于MD5目前最有效的攻击方式就是彩虹表。彩虹表的基本原理如下——

  • 组合了暴力法和查表法,并在这两者之中取得一个折中,用我们可以承受的时间和存储空间进行破解。它的做法是,对于一个Q = H(P),建立另一个算法R使得 P = R(Q),然后对于一个p,这样进行计算:p0 -H-> q1 -R->p1 -H-> q2 -R->p2 -H-> q3 -R->p3 … -H-> q(n-1) -R->p(n-1) -H-> qn -R->pn
  • 简单的说,就是把q用H、R依次迭代运算,最后得到pn,n可能比较大。最后我们把p0和pn都存储下来,把其他的结果都丢弃。然后用不同的p0代入计算,得到多个这样的p的对子。
  • 我们在做破解的时候,给出了一个q,我们来寻找p。我们先把q做一次R运算得到一个值例如叫c1,然后把c1和每一个p对的最后一个做比较,假如和某一个pn相等,那么有可能这个pn所对应的p(n-1)就是我们在追寻的q,为了验证我们把pn对应的p0再做一次链式计算,比对qn是否就是给出的q,如果是,很明显p(n-1)就是我们在追寻的p,因为 p(n-1) -H-> qn。如果不是就继续寻找直到遍历所有的q0qn对。
  • 事情还刚刚开始,我们再算q -R-> c1 -H-> -R-> c2,再比对c2是否是qn,如果是,那么p(n-2)就可能是p;再算c3、c4直到c(n-1)。
  • 总的来说,就是用一个p0pn对来存储了一个链子的数据,如果n很大,就可以大大减小了存储的空间。这样带来的问题是必须做n次比对,时间更长,但是我们不需要瞬间破解,等待几秒乃至几天破解一个密码都是可以接受的。

比较有效的增强其安全性的方法就是加盐——在密码学中,盐(Salt))是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。

E.参考链接

AES和DES

DES和AES算法详解
漫画解读:什么是AES算法
对称加密算法的PKCS5和PKCS7填充
【Android】pkcs#5填充和pkcs#7填充比较
密码学中的数据块填充模式

MD5相关

MD5加密算法原理及实现
彩虹表的原理简介
(总结)密码破解之王:Ophcrack彩虹表(Rainbow Tables)原理详解(附:120G彩虹表下载)
为什么要在密码里加点“盐”
加盐密码保存的最通用方法是?

8.参考链接

古典密码学

古典密码
密码学(一)——古典密码

Android加密相关

Android应用安全开发之浅谈加密算法的坑
Android代码中加解密方式(各种加密算法的具体实现)
Android几种加密解密的方法(仅代码)
Android 最全的AES加密算法及其实现
Android移动开发-Android数据加密与解密的实现
java加解密例子
对称加密—-AES和DES加密、解密

数字签名

数字签名是什么?

其他

一篇文章搞定密码学基础
密码学简介
密码算法编程练习网站——the cryptopals crypto challenges
ctf在线工具-包括各种常用的加密算法的在线解密
密码学软件博物馆 (CryptoZoo)-列出了各种经典的用于实现加解密的第三方库和软件
常用加密算法简介