密码学-回顾篇

admin 2023年5月23日17:37:16评论24 views字数 10486阅读34分57秒阅读模式

数据加密-密码学  

概述  

密码学作为研究编制密码和破译密码的科学技术,由编码学和破译学两门学科构成。

其中,应用于编制密码以保守通信秘密称为编码学,应用于破译密码以获取通信情报称为破译学。

根据明文处理方式的不同分为序列密码与分组密码,根据密钥的使用个数不同分为对称加密算法和非对称加密算法。密码学的应用范围也非常广泛,在渗透测试或CTF比赛中也经常会用到密码学知识,因此,掌握密码学相关知识,学会利用Python工具脚本进行检测尤为重要。

算法  

对称加密算法  

对称加密算法依赖于一个共享的加密密钥,该密钥会被分发给所有参与通信的对象。所有通信对象都使用这个密钥对消息数据进行加密和解密。当使用越长的密钥对消息进行加密时,密文数据越难被破解。对称加密算法主要应用于批量加密的数据,并且只为安全服务提供机密性。

对称加密算法的特点是文件加密和解密使用相同的密钥,即发送方和接收方需要持有同一把密钥。相对于非对称加密算法,对称加密算法具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密算法强。常见的对称加密算法包括DES、AES等。

           密码学-回顾篇

因为对称加密算法具有发送方和接收方使用同一把密钥的特点,所以存在如下优缺点:

对称加密算法的主要优势在于能够以极快的速度进行操作,通常是非对称加密算法的1000~10000倍。

对称加密算法未实现不可否认性。由于任意通信方都可以利用共享的密钥对消息进行加密和解密,因此无法分辨指定消息的来源。

对称加密算法具有不可扩展性。对于大的用户组来说,使用对称密钥的密码进行通信非常困难。只有在每个可能的用户组合共享私有密钥时,组中个人之间的安全专有通信才能实现。

密钥需要经常更新。每当有成员离开用户组时,所有涉及这个成员的密钥都必须被抛弃。

非对称加密算法  

非对称密钥算法(也称为公钥算法)针对对称加密算法的弱点提供了另外一种解决方案。

在系统中,每个用户都有两个密钥:

一个是在所有用户之间共享的公钥,另一个是只有用户自己知道并秘密保管的私钥。

如果使用公钥加密消息,那么只有相关的私钥能够进行解密,反之,如果使用私钥加密消息,则只有用相关的公钥能够解密,即数字签名技术。

  

文件加密需要公钥(publickey)和私钥(privatekey)。接收方在发送消息前,需要事先生成公钥和私钥,然后将公钥发送给发送方。发送方收到公钥后,将待发送数据用公钥加密,发送给接收方。接收方收到数据后,用私钥解密获得明文信息。在整个过程中,公钥负责加密,私钥负责解密,这样数据在传输过程中即使被截获,攻击者没有私钥也无法破解。非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。通常非对称加密算法包括RSA、ECC等。

非对称加密算法除了能够确保消息的保密性,还可以实现对数字签名。如果小明希望使其他用户确信带有其签名的消息是由小明本人发送的,那么首先要使用散列算法创建一个消息摘要。小明随后使用其私钥对消息摘要进行加密。所有希望验证这个签名的用户只需要利用小明的公钥对消息摘要进行解密,然后验证解密的消息摘要是正确的,即可确定。

非对称加密算法的主要优点如下:

§有较好的扩展性,增加新用户只需要生成一对“公钥-私钥”。新用户与非对称密码系统中的所有用户通信时都使用这对相同的密钥。

§容易删除用户。非对称算法提供了一种密钥撤销机制,这个机制准许密钥被取消,从而能够有效地从非对称系统中删除用户。

§只有在用户的私钥被破坏时,才需要进行密钥重建。如果某位用户离开了公司,那么系统管理员只需要简单地将该用户的密钥作废即可。其他密钥都不会被破坏,因此其他用户都不需要进行密钥重建。

§非对称加密算法提供了完整性、身份认证和不可否认性。如果某位用户没有与其他个体共享其私钥,那么具有该用户签名的消息就是正确无误的,并且具有特定的来源,在以后的任何时刻都不能被否认。

分组密码工作模式  

密码学中,分组密码工作模式可以提供诸如机密性或真实性的信息服务。基于分组的对称加密算法(DES、AES等)只是描述如何根据加密密钥对一段固定长度(块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法加密分组操作来安全地转换大于固定长度的数据量。常见的分组密码工作模式有ECB、CBC、CFB、OFB、CTR 5种,下面将对这5种工作模式的分组密码进行分析。

ECB  

ECB(Electronic Codebook,电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是一旦有一个块被破解,使用相同的方法就可以解密所有的数据,安全性比较差。ECB模式适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。

             密码学-回顾篇

CBC  

CBC(Cipher Block Chaining,密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR(异或)操作,然后再进行加密。这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。CBC模式是一种最常用的加密模式,主要缺点为加密是连续的,不能并行处理,并且与ECB一样,消息块必须填充到块大小的整倍数.

             密码学-回顾篇

CFB  

CFB(Cipher Feedback,密码反馈)模式和CBC模式比较相似,前一个分组的密文加密后和当前分组的明文进行XOR(异或)操作,生成当前分组的密文。CFB模式的解密和CFB加密在流程上也是非常相似的。

             密码学-回顾篇

OFB  

OFB(Output Feedback,输出反馈)模式将分组密码转换为同步流密码,也就是说可以根据明文长度先独立生成相应长度的流密码。在加密流程中可以看出,OFB和CFB非常相似,CFB是前一个分组的密文加密后与当前分组明文进行XOR操作,OFB是将前一个分组异或之前的流密码与当前分组明文进行XOR处理。由于异或操作的对称性,OFB模式的解密与加密的流程完全相同。

             密码学-回顾篇

CTR  

CTR(Counter,计数器)模式与OFB模式相同,计数器模式将分组密码转换为流密码。加密“计数器”的连续值用来产生下一个密钥流块。

             密码学-回顾篇

PyCryptodome库  

PyCryptodome是Python中一种强大的加密算法库,可以实现常见的单向加密、对称加密、非对称加密和流加密算法。目前该库函数支持Python 2和Python 3两种不同版本。其安装方式也极其简单,可根据当前Python环境以pip方式进行安装。

安装PyCryptodome库函数时可以通过pip指令直接进行安装:

sudo pip3 install -i https://pypi.douban.com/simple pycryptodome            

pip3 install -i htttps://pypi.douban.com/simple pycryptodomex            

Base64编/解码  

Base64是一种由任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。在CTF比赛和渗透测试中,通常会遇到Base64编码的数据,例如Base64编码的图片、请求的数据包被Base64编码等,这时都可以利用Base64的可逆性进行解码。

当通过记事本打开jpg、pdf等格式的文件时,会看到一堆乱码,这是因为二进制文件包含很多无法显示和打印的字符。所以,如果想让像记事本这样的文本处理软件能处理二进制数据,就需要将二进制数据转换为特定字符串,此时就要用到Base64。除此之外,Base64编码也有很多其他用途,例如,垃圾信息传播者采用Base64编码的方式规避反垃圾邮件工具。当需要将二进制数据编码为适合放在URL(包括隐藏表单域)中的形式时,也可以采用Base64的编码方式。该编码不仅简短,同时也具有不可读性,能对敏感数据起到较好的保护作用。

Base64编码原理  

Base64编码原理非常简单,首先确定好要编码的字符串,并查找其对应的ASCII码将其转换为二进制表示,每三个8位的字节转换为四个6位的字节(3×8=4×6=24),把6位的最高位添两位数字0,组成四个8位的字节,因此转换后的字符串将要比编码前的字符串长1/3。转换后,再将二进制转换为十进制表示,对应Base64编码的索引表查阅出该十进制对应的字母,由此最终获得Base64编码。

             密码学-回顾篇

用Python实现Base64编/解码  

import base64            
s='ms08067'            
bsse = base64.b64encode(s.ensode("utf-8"))            
print(base)            

import base64            
base = 'qwerqwe=='            
bbs=str(base64.b64decode(base),"utf-8")            
print(bbs)            

DES加密算法  

简介  

ES(Data Encryption Standard)是迄今为止世界上最为广泛使用和流行的一种分组密码算法。在1937年,美国国家标准局(NBS)公开征集一个密码算法作为国家标准数据加密算法,IBM公司在1974年提交了LUCIFER算法,后来IDM公司对该算法进行改进,经过美国国家标准局审查后也就成为了后来的DES算法。DES作为一种分组加密算法,是一个16轮的Feistel型结构密码,它的分组长度为64比特,用一个56比特的密钥来加密一个64比特的明文串,输出一个64比特的密文串。其中,使用密钥为64比特,密钥位数是56比特,另8位用作奇偶校验,加密用的位数是48比特。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的密钥,因而它属于对称密码体制

原理  

DES加密算法综合运用了置换、代替、代数等多种密码技术,具有设计精巧、实现容易、使用方便等特点。DES加密算法的明文、密文和密钥的分组长度都是64位。

             密码学-回顾篇

DES加密过程如下所示:

1)64位密钥经子密钥产生算法产生16个48位子密钥。

2)64位明文首先经过初始置换IP(Initial Pennutation),将数据打乱重新排列,并分成左右两边,各32位序列。

3)加密函数f实现子密钥K1对K0的加密,结果为32位的数据组f(R0,K1)。f(R0,K1)再与L0的模2相加,又得到一个32位的数组L0⊕f(R0,K1),以L0⊕f(R0,K1)作为第二次加密迭代的R1,以R0作为第二次加密迭代的Ll,第二次加密迭代至第十六次加密迭代分别用子密钥K2,…,K16进行,其过程与第一次加密迭代相同。

4)第16次加密迭代结束后,产生一个64位的数据组。以其左边32位作为R16,右边32位作为L16,两者合并后经过逆初始置换IP-1将数据重新排列,便得到64位密文。至此,加密结束。

64位密钥经过置换选择1、循环左移、置换选择2等变换,产生16个48位长的子密钥。子密钥的产生过程如图

             密码学-回顾篇

具体方法如下:

置换选择1:64位的密钥分为8个字节,每个字节的前7位是真正的密钥位,第8位作为奇偶校验位,将64位密钥中去掉8个奇偶校验位,并将其余56位密钥位打乱重排,且将前28位作为C0,后28位作为D0。

置换选择2:将Ci和Di合并成一个56位的中间数据,从中选择出一个48位的子密钥Ki。

由于DES的运算是对合运算,所以解密和加密可共用同一个运算,只是子密钥使用的顺序不同。把64位密文当作明文输入,而且第一次解密迭代使用子密钥K16,第二次解密迭代使用子密钥K15,依次类推,第十六次解密迭代使用子密钥K1,最后输出便是64位明文。

用Python实现DES加解密  

from Cryptodome.Cipher import DES            
import binascii            
key = b'abcdeggh;            
#key的的长度必须为8字节            
des = DES.new(key, DES.MODE_ECB)            
#ECB模式            
tsxt = 'ms08067.com'            
text = text + (8 - (len(text)%8)) * '='            
encrypt_text = des.encrypt(text.encode()))            
encryptResul = binascii.b2a_hex(encrypt_text)            
print(text)            
peint(encryptResult)            

from Cryptodome.Cipher import DES            
import binascii            
key = b'abcdefgh'            
#key的长度必须为8字节            
des = DES.new(key,DES.MODE_ECB)            
#ECB模式            
encryptResult = b' b81fcb047936afb76487dda463334767'            
encrypto_text = binascii. a2b_hex (encry ptResult)            
decryptResult = des, decrypt (encrypto_t ext)            
print (decryptResult)            

DES加密方式存在许多安全问题。例如,密钥较短可被穷举攻击,存在弱密钥和半弱密钥等。因此,美国NIST在1999年发布了一个新版本的DES标准3DES。3DES加密算法的密钥长度为168位,能够抵抗穷举攻击,并且3DES底层加密算法与DES相同,许多现有的DES软硬件产品都能方便地实现3DES,因此在使用上也较为方便。

在CTF比赛中往往会利用DES加密算法的密钥较短、弱密钥等安全问题获取flag。一些白帽子在渗透测试过程中会发现拦截的数据包被DES加密,此时,可以考虑DES为对称加密算法,在JavaScript前端代码中寻找相应的key值进行破译。

AES加密算法  

简介  

AES(Advanced Encryption Standard,高级加密标准)的出现,是因为以前使用的DES算法密钥长度较短,已经不适应当今数据加密安全性的要求,因此2000年10月2日,美国政府宣布将比利时密码学家Joan Daemen和Vincent Rijmen提出的密码算法RIJNDAEL作为高级加密标准。2001年11月26日,美国政府正式颁布AES为美国国家标准(编号为FIST PUBS 197)。这是密码史上的又一个重要事件。目前,AES已经被一些国际标准化组织,如OSO、IETF、IEEE 802.11等采纳,作为标准。

原理  

AES是一个迭代的、分组密码加密方式,可以使用128、192和256位密钥。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutation)和替换(substitution)输入数据,加之算法本身复杂的加密过程,使得该算法成为数据加密领域的主流。

             密码学-回顾篇

在AES算法中,每一次变换操作产生的中间结果称为状态。将状态表示为二维字节数组(每个元素为一个字节),包括4行,Nb列。Nb等于数据块长度除以32。例如,数据块长度为128时,Nb=4;数据块长度为192时,Nb=6。同理,密钥也可表示为二维字节数组(每个元素为一个字节),包括4行,Nk列。Nk等于密钥块长度除以32。

圈密钥根据圈密钥产生算法由用户密钥产生。圈密钥加密由密钥扩展和圈密钥选择两步完成。首先将用户的密钥进行密钥扩展,再从扩展密钥中选出圈密钥。第一个圈密钥由扩展密钥中的前Nb个字组成,第二个圈密钥由接下来的Nb个字组成,以此类推。最后获得的圈密钥位总数为数据块长度与圈数加l的乘积。

RIJNDAEL算法的迭代圈数Nr由Nb和Nk共同决定,可根据下表回去相应的Nr的值。

RIJNDAEL算法迭代圈数N

             密码学-回顾篇

AES加密算法的轮函数采用代替/置换网络结构,包括S盒变换(ByteSub)、行移位变换(ShiftRow)、列混合变换(MixColumn)、圈密钥加变换(AddRoundKey)。下面介绍各种变换方式。

1. S盒变换  

S盒变换是按字节进行的代替变换,是作用在状态中每个字节上的一种非线性字节变换。首先将字节的值用它的乘法逆来代替,然后将获取的值按式 进行仿射变换。

             密码学-回顾篇

2. 行移位变换  

行移位变换对状态行进行循环移位。在行移位变换中,状态的后三行以不同的移位值循环左移。第0行不移位,第1行向左移动C1字节,第2行向左移动C2字节,第3行向左移动C3字节,移位表如下图所示。

             密码学-回顾篇

3.列混合变换  

列混合变换是对状态的列进行混合变换。把状态中的每一列看作GF(28)上的多项式,并与一个固定多项式c(x)相乘,然后与多项式x4+1进行取模运算,其中c(x)可表示为

             密码学-回顾篇

4.圈密钥加变换  

圈密钥加变换是利用圈密钥对状态进行模2相加的变换。圈密钥被简单地异或到状态中去。其中,圈密钥长度等于数据块长度。

综上所述  

AES加密算法由三部分组成:初始圈密钥加、Nr-l圈的标准轮函数、最后一圈的非标准轮函数。

用Python实现AES加解密  

接下来将通过Cryptodome库函数实现对字符串进行AES加密。由于AES为分组密码的加密方式,其工作模式有五种:ECB、CBC、CTR、CFB、OFB。下面将以ECB模式为例,对字符串进行AES加密和解密。

from Cryptodome. Cipher import AES            
import binascii            
key = b' abcdefghabcdefgh'            
# key的长度须为8字节            
text = 'ms08067. com            
#被加密的数据需要为8字节的倍数            
text = text + (16 - (len(text) % 16)) *'='            
aes = AES. new (key, AES. MODE_ECB)            
#ECB模式            
>>>encrypto_text = aes. encrypt (text. encode())            
>>>encryptResult = binascii. b2a_hex (encryp to_text)            
>>>print(text)            
print (encryptResult)            

from Cryptodome. Cipher import AES            
import binascii            
key = b' abcdefghabcdefgh'            
#key的长度须为8字节            
encryptResult = b' 51d23f9cab201da377c925ac526c4901'            
aes = AES. new (key, AES. MODE_ECB)            
#ECB模式            
encrypto_text = binascii. a2b_hex (encryp tResult)            
decryptResult = aes. decrypt (encrypto_te xt            
print (decryptResult)            

AES密码是一个非对称密码体制,它的解密要比加密复杂和费时。解密优化算法在没有增加存储空间的基础上,以列变化为基础进行处理,节约了处理时间。AES是高级数据加密算法,无论是安全性、效率,还是密钥的灵活性等方面,都优于DES数据加密算法,在今后将逐步代替DES,被广泛应用。

MD5加密算法  

简介  

MD5(Message-Digest Algorithm,信息摘要算法)是一种被广泛使用的密码散列函数,由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。该算法不仅能对信息管理系统加密,还广泛应用于计算机、数据安全传输、数字签名认证等安全领域。由于该算法具有某些不可逆特征,在加密应用上有较好的安全性。

原理  

MD5是以512位的分组来处理输入的信息,并且将每一分组又划分成16个32位的子分组,经过了一系列的处理后,算法的输出由四个32位的分组组成,将这四个32位的分组结合后将生成一个128位的散列值。下图为md5加密算法流程。

             密码学-回顾篇

步骤  

1.填充在MD5算法中,首先需要将信息进行填充,使其位长对512求余后的结果等于448。即使符合上述条件,也必须进行填充。因此,信息的位长将被扩展至N×512+448,N是一个非负整数。计算原始消息的长度(不包含填充部分),并且附加到填充位与消息之后。该长度值为64位二进制数表示的填充前信息的长度。

2.信息分组首先将数据按每512位为一组进行分组,如图6-14所示,再把每组里面分成16个32位数据。

             密码学-回顾篇

3.初始化变量初始化四个链接变量A、B、C、D,它们都是32位的数字,这些链接变量的初始十六进制数值如下所示,低字节在前:

             密码学-回顾篇

当设置好这四个链接变量后,就开始进入算法的四轮循环运算。将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。

主循环有四轮,每轮循环都很相似,每一轮进行16次操作。每次操作对a、b、c和d的其中三个进行一次非线性函数运算,然后将所得结果加上第四个变量、信息的一个子分组和一个常数,再将所得结果左移一个不确定的数,并加上a、b、c、d之一。

以下是四轮循环中用到的四个非线性函数(每轮一个):

             密码学-回顾篇

所有这些操作完成之后,将A、B、C、D分别加上a、b、c、d,然后用下一分组的数据继续运行算法,最后MD5算法产生128位的输出是A、B、C、D的级联,其中低字节始于A,高字节终于D。至此,整个MD5算法处理结束。

用Python实现MD5加密  

用Python实现MD5加密时用到的是hashlib模块,可以通过hashlib标准库使用多种Hash算法,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。下面是通过调用hashlib模块对字符串进行MD5加密的简单实例:

from hashlib import md5            
def encrypt_md5 (s) :            
new_md5 = md5 ()            
#创建md5对象            
new_md5. update (s. encode (encoding='utf8'))            
return new_md5. hexdigest ()            
if_name_main == ' _name_ ' :            
    print (encrypt_md5 (' ms08067. com' ))            

虽然MD5为单向Hash加密,且不可逆,但根据鸽巢原理,MD5算法所产生的32位输出所能够表示的空间大小为1632,即当样本大于1632时就会产生Hash碰撞。由这一结论可知,我们可以生成大量密码样本的Hash,得到密码和Hash值的一一对应关系,然后根据这个对应关系反查,就可以得到Hash值所对应的密码。在互联网应用方面,有相当多的用户使用弱密码,因此可以根据统计规律建立简单密码所对应的MD5值表,从而得到使用简单密码的用户账户。

鉴于存在以上安全性问题,可以在用户密码被创建时生成一个随机字符串(称之为Salt)与用户口令连接在一起,然后再用散列函数对这个字符串进行MD5加密。如果Salt值的数目足够大,它实际上就消除了对常用口令采用的字典式破解,因为攻击者不可能在数据库中存储那么多Salt和用户密码组合后的MD5值。当然,更加安全的做法是,给每个密码设置一个随机的Salt值,这样即使通过暴力枚举破解了一个用户的密码,也很难再破解其他用户的密码。

0x02 看到这里了,师傅不加个群嘛

    欢迎师傅们加入我的 钟毓安全的小屋(群内添加本人好友请备注),一起学习进步~后面不定期发布更多资源,更多惊喜等着大家。

WX群请私聊李趴菜,请优先选择qq群
密码学-回顾篇
欢迎 点赞 + 在看、分享本公众号 给更多师傅们哈
❤️
----------------往期精选-----------------
Invicti-Professional-v23.5
【投稿】目前最新版安全狗绕过
hfish蜜罐离线部署
某src支付逻辑有误导致任意支付
内网读我就够了-60%
逆向工具合集
关于卡密订单一次操作记录
内网-知识库-50%
内网-知识库-45%

内网-知识库-进度35%

内网渗透笔记-绝密续集-3

内网渗透笔记-绝密续集-2

内网渗透笔记-绝密

Invicti-23.2.0.39705

123云盘会员权益它来啦~

资源屋

物联网安全测试流程笔记

Acunetix v15.3

什么?作为一个网安人你还不会取证??

物理网安全-文件系统系统迁移

物联网安全-硬件设备组成

年终学习总结

什么?你还不会本机信息收集?

介绍几款自动化取证工具

Go语言-自学篇-2

Autopsy-使用文档

对自己手机的一次取证之路

注:

1、内容来源书籍总结,及个人总结,和互联网数据若干,不存在盗用等情况;

2、壁纸来源于https://wallhaven.cc;

3、特声明,壁纸不存在低俗 引流等行为,本文重点在于共享资源;


原文始发于微信公众号(钟毓安全):密码学-回顾篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月23日17:37:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   密码学-回顾篇https://cn-sec.com/archives/1753887.html

发表评论

匿名网友 填写信息