一、密码学
加密是一种存储和传输数据的的方法。通过编码为不可读的形式来保护信息的科学手段。也是保护敏感信息的有效方法。
密码分析学是一种研究和破解加密过程、破坏身份验证方案以及对算法和秘钥进行逆向工程的学科,是密码术和密码学的重要组成部分。
1、密码系统
(1)密码系统
一个密码系统包含用于加密和解密的所有必须组件(如可靠隐私PGP)。一个密码系统至少包含软件、协议、算法、秘钥等组件。
(2)密码系统的强度
加密算法的强度源自于算法的复杂程度,秘钥的机密性,秘钥的长度、初始化向量以及它们如何在密码系统内协同工作。
(3)Kerckhoffs原则
一个密码系统唯一需要保密的部分应当是秘钥。
2、密码系统提供的服务
(1)机密性:除了授权实体外、其他实体无法理解提交的数据
(2)完整性: 数据从创建到传输、存储都不会被未授权更改
(3)身份验证:对创建信息的用户或系统的身份进行验证
(4)授权: 证明身份之后,向个体提供允许访问某些资源的秘钥或密码
(5)不可否认性:确保发送方无法否认发送过消息
3、密码学的种类
(1)一次性密码本
一次性密码本是使用一组由随机值组成的密码本。需要加密的明文消息已转换为位,而一次性密码本也有随机为组成,加密过程使用“异或”的二进制数学函数,简写为XOR。
一次性密码本使用要求:由真正的随机值构成、只使用一次、安全分发至目的地、在接受方和发送方处都是安全的、至少与消息一样长
(2)隐藏密码与滚动密码
滚动密码:滚动秘钥密码使用周围随处可见的方法(如电视剧连城诀中将宝藏藏于诗词)
隐藏密码:消息内的消息,是一种隐写术
(3)隐写术
隐写术是将一种数据隐藏在另一种介质中以藏匿数据的方法
隐写术涉及的组件:
载体:内部具有隐藏信息的信号、数据流或文件
隐写介质:将信息隐藏在内的介质
有效载荷:要隐藏和传输的数据
4、密码的种类
(1)替代密码
替代密码是使用不同的位、字符或字符分组来替换原来的位、字符或字符分组。替代密码使用秘钥来规定应当如何实现替代。
(2)换位密码
换位密码是对原有的值进行置换,重新排列原来的位、字符或字符分组以隐藏其原有的意义。秘钥决定了字符移动到的位置。
5、加密的方法
(1)对称算法和非对称算法
对称加密使用同一秘钥加密和解密。非对称秘钥使用两个不同的秘钥来达到加密和解密的目的。
对称加密和非对称加密的对比:
属性 | 对称系统 | 非对称系统 |
秘钥 | 两个或多个实体共享同一个秘钥 | 一个实体拥有公钥,另一个实体拥有私钥 |
秘钥交换 | 通过安全机制进行带外交换 | 公钥每个人都能拥有,私钥只属于所有者 |
速度 | 算法不太复杂,运行速度快 | 算法复杂,运行速度慢 |
用途 | 批量加密,加密文件和通信路径 | 秘钥分发和数字签名 |
作用 | 提供机密性 | 提供身份验证和不可否认性 |
(2)分组密码和流密码(对称算法的只要类型)
分组密码:分组密码用于加密解密时,消息会被划分为为若干位分组,这些分组随后会通过数学函数进行处理,每次一个分组。分组密码在方法上使用了扩散和骚乱。扩散指单独一个明文位会影响到若干密文位,类似雪崩效应。扰乱指使秘钥和密文之间的关系尽可能复杂,从而令攻击者无法从密文中发现秘钥。
流密码:流密码将消息作为位流对待,并且使数学函数分别作用在每一位上。流密码使用了秘钥流生成器,它生成的位流与明文位进行异或,从而产生密文。
(2)初始化向量(IV)
初始化向量用于算法,可确保加密过程中不会产生某种模式的随机值,它们与秘钥一同使用,而且在传输时不需要加密。
(3)混合加密
对称秘钥与非对称秘钥的混合使用:发送方使用对称秘钥加密消息,使用非对称秘钥加密对称秘钥;接受方解密并获取对称秘钥,然后使用对称秘钥解密消息。
会话秘钥:使用一次的对称秘钥,用于对通信会话期间两个用户之间的消息进行加密。
二、对称加密系统
主要的对称加密算法有DES、3DES、AES、IDEA、Blowfish、RC4、Rc5、Rc6
1、数据加密标准(DES)
DES是一种标准,DEA是一种执行DES的算法;DES已经被NIST开发的作为高级加密标准(AES)的Rijndael算法所取代。
(1)DES的工作方式
DES是一种对称分组加密算法,DES使用64位秘钥,其中56位为实际使用的秘钥,另外8位用于奇偶校验。DES算法将消息分成若干组,并且一次加密一个分组,这些分组经历16轮换位和替代函数运算。最后得到的结果是64位分组。
(2)DES的工作模式
电子密码本(ECB):ECB模式像一个密码本,将一个64位的数据分组输入带秘钥的算法,就会生成一个密文分组。ECB使用更便捷,但风险是数据分组都是用相同的秘钥进行加密,因此密码本也完全一样。
密码分组链接(CBC):一组明文和秘钥总是生成相同的密文。CBC并不暴露加密模式,算法会处理每个文本分组,秘钥以及基于前一个分组的值,并将他们应用于下一个文本分组,这样得到的密文更随机。
密文反馈(CFB模式):CFB的工作方式使用了分组密码和流密码
输出反馈(OFB)
计数器(CTR)模式
2、三重DES(3DES)
3DES使用了48轮运算,使它对于差分密码分析有很强的抵御能力,但是3DES要执行额外的操作,所以严重影响其性能,3DES完成加密解密的时间要比DES长3倍。
3、高级加密标准(AES)
NIST选择了Rijndael作为高级加密标准的算法,AES是一种对称分组密码,支持128、192、256位的秘钥。如果秘钥和数据分组大小为128位是执行10轮运算,如果为192位时,执行12轮运算,如果为256位时执行14轮运算。
4、国际数据加密算法(IDEA)
IDEA是一种分组密码,它处理64位数据分组。64位大小的数据分组划分为16个更小的分组,每个分组都执行8轮数学函数运算,IDEA使用的秘钥长度为128位。
IDEA使用了与DES类似的模式,但秘钥更长。
IDEA申请了专利,需要付费才能使用。
5、Blowfish
Blowfish也属于分组密码,它处理64位的数据分组,秘钥长度为32-448位,数据分组要经过16轮加密函数运算以得到密文。
6、RC4
RC4是最常用的流密码之一、它的秘钥长度可变,用于SSL协议。
RC4算法简单、快捷、有效。但它的扩散率低,容易遭受到攻击
7、RC5
RC5是一种分组密码,参数可变,该算法的分组通常大小为32、64或128位,其秘钥长度可达128位,用于加密解密的轮数也是可变的,最多可达255轮。
8、RC6
RC5基础上构建的,所有属性与RC5相同。
三、非对称加密系统
1、Diffie-Hellman算法
Diffie-Hellman是第一个非对称秘钥协定算法,Diffie-Hellman算法使两个系统不需要提前建立关系或预先安排就能安全地交换秘钥,这种算法可实现秘钥发送,但并不提供加密或数字签名功能。
2、RSA
RSA是全球标准,能够用于数字签名,秘钥交换和加密,它于1978年在麻省理工学院开发,并提供身份认证和秘钥加密。RSA算法的安全性来自于分解大因数为质数的困难性。
3、EI Gamal
EI Gamal是一种用于数字签名、加密和秘钥交换的公钥算法,它是以在一个有限域内计算离散对数的困难性为基础。它实际上是Diffie-Hellman算法的扩展,主要缺点是性能。
4、椭圆曲线密码系统(ECC)
ECC提供的功能与RSA相似,有数字签名、安全秘钥分发和加密。ECC的效率比其他对称加密算法的效率更高。
5、背包算法
第一版Merkle-Hellman算法只能用于加密,后来经过改进,可提供数字签名功能。由于不安全,目前已经不再使用。
6、零知识证明
只告诉需要知道的知识,不会提供更重要的信息。
四、消息的完整性
1、单项散列
单向散列是一种函数,它将可变长的字符串或消息压缩变换成固定长度的值,散列函数并不保密,它是公开的,单项散列函数的秘密是它的“单向性”。单向散列函数本身不使用任何秘钥。为了对消息摘要提供更多的保护,需要使用消息身份验证代码(MAC),MAC函数是通过某种形式对消息应用秘密秘钥而派生的一种身份验证机制,但并不表示它使用对称秘钥来加密消息。MAC有三种基本类型,和单向散列对比如下:
函数 | 步骤 | 提供的安全服务 |
散列 |
| 完整性,不提供机密性或身份验证,只能检测无意更改 |
HMAC |
| 完整性和数据源身份验证,不提供机密性 |
CBC-MAC |
| 数据源身份验证和完整性,不提供机密性 |
CMAC | CMAC的工作方式CBC-MAC相同,但是基于更复杂的逻辑和数学函数 |
|
2、散列算法
(1)MD4
Ron Rivest设计的单向函数,生成128位的消息摘要值
(2)MD5
MD4的审计版本,仍生成128位消息摘要,但它的算法比较复杂,所以更难攻破,目前不已经不再是很安全
(3)SHA
SHA由NSA设计,NIST发布,并和数字签名标准(DSS)一起使用。SHA生成160位的散列值或消息摘要,生成的结果随后输入非对称算法。SHA后更名为SHA-1,SHA-1容易遭受碰撞攻击,该算法的新版本(SHA-2,SHA-3)已经开发和发布即SHA-256,SHA-512。SHA-2和SHA-3可安全使用。
3、数字签名
数字签名是使用发送方的私钥加密的散列值。签名的动作以为着使用私钥来加密消息的散列值。
五、公钥基础设施
公钥基础设施(PKI)是一种使用公钥密码学和X.509标准的ISO身份验证框架,建立这个框架的目的是允许在不同的网络和互联网之间进行身份验证。PKI由程序、数据格式、措施、通信协议、安全策略及公钥密码机制组成,这些组件以综合的方式运行,使得分散的人们能以安全的、预定的方式相互通信。
PKI基础设施包含了标识用户身份,创建和分发证书,维护和取消证书,分发和维护加密等部分,并使得所有技术都能够沟通,而且能够共同运行以达到加密通信和验证身份的目的。
PKI由许多不同的部分组成,包括认证授权,注册授权,证书,秘钥以及用户。
1、认证授权机构(CA)
CA是保管和发布数字证书的可信组织机构。CA负责创建和签发数字证书,当CA签发证书时,它将个人的身份和公钥绑定在一起,还负责该个体的真实性。CA还在必要时负责取消证书,被取消的证书的信息存储在证书吊销列表(CRL)中。
CA的认证过程:当一个人请求证书时,注册授权机构RA会验证这个人的身份,并将证书请求提交给CA,随后,CA创建证书并签名,再将其发送给请求者,同时为请求者在证书的有效期内保管该证书。当一个人想要与这个人通信时,CA通常要担保该人的身份。
交叉认证:不同的CA之间建立信任关系,以以来彼此的数字证书和公钥,就像证书和秘钥是它们自己签发的一样。
在线证书状态协议(OCSP):OSCP会实时确认证书是否被取消,并向用户报告证书是否有效、无效、还是未知。
2、证书
证书是用于将公钥和唯一标识其所有者所需的组成部分关联起来的机制,CA创建数字证书的标准是x.509,它规定证书中使用的不同字段以及能够在这些字段中输入的有效值。目前使用的是X.509 v3。
3、注册授权机构(RA)
RA建立和确认个人的身份,代表终端用户启动使用CA的认证过程,以及执行证书生命周期管理功能。
4、证书的生成
(1)终端用户注册自己,即获取数字证书的过程
1)用户想RA发送一个请求
2)RA向用户索要特定的身份标识信息
3)RA接收并验证其身份标识信息,通过了就将用户的认证请求发送给CA
4)CA创建一个证书,该证书嵌入了用户的公钥及身份信息。
(2)终端用户与其他用户保密通信的过程
1)用户从一个公共目录请求得到对方的公钥
2)这个目录(存储库)将对方的公钥发送给用户。
3)用户验证数字证书并提供对方的公钥,并使用该公钥加密一个会话秘钥,这个会话秘钥用于加密它们之间传递的信息,然后将加密的会话秘钥发送给对方,还要讲自己的包含其公钥的证书也发送给对方
4)对方接受到用户的证书时,其浏览器会询问CA是否对该证书进行了数字签名,只有对方的浏览器信任这个CA,并且验证了证书,双方就可以进行加密通信了。
六、Openssl
OpenSSL是一个加密工具包,实现了安全套接字层(SSL v2/v3)和传输层安全(TLSV1)网络协议及其所需的相关加密标准。而openssl程序是一个命令行工具,用于使用openssl的各种加密功能。
OpenSSL由三部分组成:分别是libencrypto库、libssl库、openssl多用途命令行工具
1、SSL(安全套接字层)/TLS(传输层安全)
为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
SSL/TLS握手的过程:
(1)客户端发起请求,将它所支持的算法列表、协议版本及一个用作产生密钥的随机数发送给服务器;
(2)服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
(3)客户端对服务器的证书进行验证,并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密,并将加密后的信息发送给服务器;
(4)客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和MAC密钥
(5)客户端将所有握手消息的MAC值发送给服务器;
(6)服务器将所有握手消息的MAC值发送给客户端。
2、OpenSSL秘钥工具的使用
(1)对称加密的使用
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish
# 使用3des算法加密
~]# openssl enc -e -des3 -a -salt -in /etc/passwd -out ./passwd.cipher
# 解密
~]# openssl enc -d -des3 -a -salt -out passwd -in passwd.cipher
(2)非对称加密的使用
# 生成私钥
~]# (umask 077; openssl genrsa -out /tmp/tmp_rsa 2048)
Generating RSA private key, 2048 bit long modulus
................................................................+++
.....................+++
e is 65537 (0x10001)
# 提取公钥
~]# openssl rsa -in /tmp/tmp_rsa -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5PZudMhzDk/W73zu7PcF
UXsBoShjZ5krrVsg3xjHgs14zYDXW0H3nihX2KV2mJlb/8KiKc6z1Cb9A7MWIqRs
l9vLNlo1w55KdtFstxEdH8vEl6QBzGE30bohQmt6jjTndum4QNXPBzZ5TAeBTG2s
Rkj50II4acIWeJYpvvvbV1RkBzddXLfYQd+GNC7+CkVfM7usVCmYtXHmGqUdPS9U
8TjEb1+RkJ2b4jN0F7rPsoNzk43DBjpV+248DEl8gl7InFhPiUEE2wqT8DgpzOFl
lh6HPVakFKqFujvBlWTwiYL+QntRevIw6B0je2O1q/9Wp1g7xbWFfEsXBxbY2Jc4
mQIDAQAB
-----END PUBLIC KEY-----
(3)使用openssl生成随机数
~]# openssl rand -base64 10
X/lajp48Zl6CoQ==
~]# openssl rand -hex 10
ef58126dbf9a52db5904
3、使用openssl建立私有CA
Openssl与CA相关的配置文件为/etc/pki/tls/openssl.cnf,主要的配置内容如下:
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # use SHA-256 by default
preserve = no # keep passed DN ordering
policy = policy_match
试验环境如下:
CA server:搭建私有CA IP:192.168.16.130
客户机:向CA请求签署证书 IP:192.168.16.155
(1)构建私有CA
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可
# 生成私钥
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
# 生成自签证书,在签署过程中需要输入相关信息
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
# 为CA提供所需的目录及文件
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
在签署时的一些参数说明:
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(2)客户机向CA请求签署证书
# 在请求签署证书的主机上生成私钥
]# (umask 077; openssl genrsa -out /etc/pki/nginx/private/server.key 2048)
# 在请求签署证书的主机上生成签署请求,需要输入相关信息
]# openssl req -new -key /etc/pki/nginx/private/server.key -out /etc/pki/nginx/private/server.csr -days 365
# 将请求通过可靠方式发送给CA
]# scp /etc/pki/nginx/private/server.csr root@192.168.16.130:/tmp/testCA
# CA主机签署请求
~]# openssl ca -in /tmp/testCA/server.csr -out /etc/pki/CA/certs/server.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Mar 22 16:53:19 2020 GMT
Not After : Mar 22 16:53:19 2021 GMT
Subject:
countryName = cn
stateOrProvinceName = Shanghai
organizationName = dayi123
organizationalUnitName = dayi123
commonName = www.dayi123.com
emailAddress = 123@123.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
8A:D2:3A:A9:AA:CB:9B:20:88:6C:B0:E1:47:DD:E8:EE:EC:97:4F:CB
X509v3 Authority Key Identifier:
keyid:33:C5:D7:C8:31:DF:34:95:8C:82:26:4A:CF:85:42:F1:A0:EA:8E:F6
# 将签署完成的证书发送给请求主机
~]# scp /etc/pki/CA/certs/server.crt root@192.168.16.155:/etc/pki/nginx/private/
# 查看证书中的信息
]# openssl x509 -in /etc/pki/nginx/private/server.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/emailAddress=123@123.com
(3)吊销证书
# 客户端获取要吊销的证书的serial(在使用证书的主机执行):
]# openssl x509 -in /etc/pki/nginx/private/server.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/emailAddress=123@123.com
# 先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致,一致时吊销,在CA server上执行
~]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
#生成吊销证书的吊销编号(第一次吊销证书时执行)
~]# echo 01 > /etc/pki/CA/crlnumber
# 更新证书吊销列表
~]# openssl ca -gencrl -out server.crl
# 查看crl文件:
~]# openssl crl -in server.crl -noout -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=cn/ST=Shanghai/L=Shanghai/O=dayi123/OU=dayi123/CN=www.dayi123.com/emailAddress=123@123.com
Last Update: Mar 22 17:05:42 2020 GMT
Next Update: Apr 21 17:05:42 2020 GMT
CRL extensions:
X509v3 CRL Number:
1
Revoked Certificates:
Serial Number: 01
Revocation Date: Mar 22 17:03:26 2020 GMT
Signature Algorithm: sha256WithRSAEncryption
七、针对密码学的攻击
被动攻击:攻击者灭有影响协议、算法、秘钥、消息或加密系统的任何部分。如偷听和嗅探。
主动攻击:攻击者实施了破坏行为,如篡改消息,更改系统文件和假冒他人
常见的攻击向量:秘钥、算法、实现、数据、人
1、唯密文攻击
攻击者拥有若干消息的密文,每条消息都是使用相同加密算法加密的,攻击者的目标是找出加密过程中的秘钥。
2、已知明文攻击
攻击者拥有一条或多条消息的明文和相对应的密文。攻击者的目标是找出用于加密消息的秘钥,从而解密和读取其他消息。
3、选定明文攻击
攻击者拥有明文和密文,不过可选择已加密的明文来查看相应的密文,这样可以使得它们更深入理解加密过程的工作方式,从而能够获得正在使用的秘钥的更多信息。
4、选定密文攻击
攻击者选择将要解密的密文,并且可以获得解密后的明文。
5、差分密码分析
也以找出加密秘钥为目标,这种工具会查看对具有特定差异的明文及逆行加密而生成的密文对,并且分析这些差异的影响和结果。这也是一种选定明文攻击。
6、线性密码分析
通过执行函数来确定使用分组算法的加密过程中利用某个特定秘钥的最大概率。
7、旁路攻击
不用直接攻击一台设备,只需监视它如何运行就可以了解其工作机制。
8、重放攻击
重放攻击是攻击者捕获了某些类型的数据并重新提交它,从而寄希望于欺骗接收设备误以为这些是合法信息、时间标记和序列号是防御重放攻击的两种对策。
9、代数攻击
代数攻击分析算法内使用的数学原理中存在的脆弱性,并利用了其内在的代数结构
10、分析式攻击
分析式攻击会确定算法结构上的弱点或缺陷
11、统计式攻击
统计式攻击确定算法设计中的统计弱点并对其加以利用
12、社会工程攻击
攻击者可以通过各种社会工程攻击类型诱使人们提供加密秘钥材料。