当前位置: 首页 > 科技观察

盘点Python爬虫中90%的常用加密算法_0

时间:2023-03-18 17:28:01 科技观察

相信大家在抓取数据的时候,都会遇到很多加密参数,比如“token”、“sign”等,今天就带大家一起来了解一下吧在抓取数据的过程中看看这些主流的加密算法,它们的特点是什么,加密方式有哪些等等,了解这些对我们逆向破解这些加密参数有帮助!一、基础知识首先我们要了解的是,什么是加密和解密?顾名思义加密:将明文数据转化为密文的过程解密:加密的逆过程,即从密文中恢复出原始明文的过程。加密和解密算法的运算通常是在一组密钥的控制下进行的,分别称为加密密钥(EncryptionKey)和解密密钥(DecryptionKey),如下图所示:而加密算法是分为对称加密、非对称加密和哈希算法,其中对称加密:即加密和解密使用相同的密钥,如RC4、AES、DES等加密算法。非对称加密:即加密和解密使用不同的密钥。相同的密钥,如散列算法如RSA加密算法:也称为散列函数。对不同长度的输入报文产生一个固定的输出,输出值为哈希值2。Base64伪加密Base64严格来说不是一种做加密的算法,而是一种编码方式,使用64个字符,也就是64个字符A-Z、a-z、0-9、+、/分别实现数据的编码,可用于HTTP环境下传输长标识信息。base64编码是不可读的,需要解码后才能读取。我们使用Python对任意URL进行Base64编码操作,代码如下:importbase64#如果要将字符串转成base64,首先要将字符串转成二进制数据url="www.baidu.com"bytes_url=网址。encode("utf-8")str_url=base64.b64encode(bytes_url)#编码后的参数必须是二进制数据print(str_url)output:b'd3d3LmJhaWR1LmNvbQ=='那么同样的,我们也可以对其进行解码,代码如下:url="d3d3LmJhaWR1LmNvbQ=="str_url=base64.b64decode(url).decode("utf-8")print(str_url)output:www.baidu.com3.MD5加密MD5是一种应用广泛的Linearhash算法,和加密后生成一个固定长度(32位或16位)的数据,由字母和数字组成,大小写统一。最终加密生成的数据是不可逆的,也就是说加密后的数据不能轻易恢复成原来的字符串,除非被暴力破解。让我们在Python中实现MD5加密:importhashlibstr='thisisamd5demo.'hl=hashlib.md5()hl.update(str.encode(encoding='utf-8'))print('MD5encryptionBefore:'+str)print('MD5encrypted:'+hl.hexdigest())输出:MD5加密前:这是一个md5演示。MD5加密后:b2caf2a298a9254b38a2e33b75cfbe75前面提到,对于MD5加密,通过暴力破解可以降低其安全性,所以在实际操作过程中,我们会加入盐值(Salt)或双重MD5加密来增加其可靠性,代码为如下:#post传入参数params="123456"#加密后要拼接的盐值(Salt)salt="asdfkjalksdncxvm"defmd5_encrypt():m=md5()m.update(params.encode('utf8'))sign1=m。hexdigest()返回sign1defmd5_encrypt_with_salt():m=md5()m.update((md5_encrypt()+salt).encode('utf8'))sign2=m.hexdigest()返回sign24。AES/DES对称加密首先我们说到DES加密,全称是DataEncryptionStandard,即数据加密标准,这是对称加密中常见的一种,即加密和解密过程中使用的密钥是一样的,所以想要破解的话,使用暴力枚举的方式,只要计算能力够强,还是可以破解的。AES的全称是AdvancedEncryptionStandard,是DES算法的替代者,是当今最流行的对称加密算法之一。要理解AES算法,首先要理解三个基本概念:key、padding、mode。密钥我们之前已经谈过很多关于密钥的内容。你可以把它想象成一把钥匙,可以用来上锁和解锁。AES支持三种密钥长度:128位、192位和256位。填充关于填充的概念,我们需要了解一下AES块加密的特点,如下图所示:简单来说,AES算法在加密明文时,并不是把整个明文加密成一整块加密。而是将明文拆分成独立的明文块,每个明文块的长度为128位。这些明文块经过AES加密器处理后,生成独立的密文块,将这些密文块拼接在一起,得到最终的AES加密结果。那么这里就有问题了。如果有一段明文,长度为196位,如果按照128位的明文块拆分,第二个明文块只有64位,小于128位怎么办?这时候就轮到padding发挥作用了。默认的填充方法是PKCS5Padding和ISO10126Padding。但是AES加密中使用了某种填充方式,解密时也必须使用相同的填充方式。模式AES的工作模式体现在将明文块加密成密文块的过程。有五种不同的工作模式,即CBC、ECB、CTR、CFB和OFB模式。同样,如果在AES加密过程中采用了某种工作模式,那么在解密时也必须采用相同的工作模式。最后我们使用Python实现AES加密。importbase64fromCrypto.CipherimportAESdefAES_encrypt(text,key):pad=16-len(text)%16text=text+pad*chr(pad)text=text.encode("utf-8")加密器=AES。new(key.encode('utf-8'),AES.MODE_ECB)encrypt_text=encryptor.encrypt(text)encrypt_text=base64.b64encode(encrypt_text)returnencrypt_text.decode('utf-8')或者你可以看看网上其他AES加密算法的实现过程基本相同。由于篇幅有限,暂时先介绍到这里。后面如果大家有兴趣,我会分享其他加密算法的实现原理和特点。