データをキャプチャするとき、「トークン」や「署名」などの多くの暗号化されたパラメーターに遭遇すると思います。今日は、これらのパラメーターの棚卸しを行います。データ キャプチャ プロセスにおける主流の暗号化アルゴリズム、その特徴、暗号化方法などを理解することは、暗号化されたパラメータを逆解読するのに非常に役立ちます。
最初に理解する必要があるのは、暗号化と復号化とは何なのかということです。名前が示すように、
暗号化アルゴリズムと復号化アルゴリズムの操作は、通常、以下に示すように、それぞれ暗号化キー (暗号化キー) と復号化キー (復号化キー) である一連のキーの制御下で実行されます。表示:
暗号化アルゴリズムは、対称暗号化、非対称暗号化、およびハッシュ アルゴリズムに分類されます。そのうち
import base64 # 想将字符串转编码成base64,要先将字符串转换成二进制数据 url = "www.baidu.com" bytes_url = url.encode("utf-8") str_url = base64.b64encode(bytes_url)# 被编码的参数必须是二进制数据 print(str_url)出力:
b'd3d3LmJhaWR1LmNvbQ=='その後、同様にデコードすることもできます。コードは次のとおりです:
url = "d3d3LmJhaWR1LmNvbQ==" str_url = base64.b64decode(url).decode("utf-8") print(str_url)出力:
www.baidu.com3. MD5 暗号化MD5 は広く使用されている線形ハッシュ アルゴリズムであり、暗号化結果は固定長 (32 ビットまたは 16 ビット) ) データ。大文字と小文字が統一された文字と数字で構成されます。最終的な暗号化によって生成されたデータは不可逆的です。つまり、総当たりクラッキングをしない限り、暗号化されたデータから元の文字列に簡単に復元することはできません。 Python で MD5 暗号化を実装してみます:
import hashlib str = 'this is a md5 demo.' hl = hashlib.md5() hl.update(str.encode(encoding='utf-8')) print('MD5加密前为 :' + str) print('MD5加密后为 :' + hl.hexdigest())出力:
MD5加密前为 :this is a md5 demo. MD5加密后为 :b2caf2a298a9254b38a2e33b75cfbe75前述したように、MD5 暗号化はブルートフォースで解読される可能性があり、セキュリティが低下するため、実際の運用ではこのプロセスでは、信頼性を高めるためにソルト値 (Salt) または二重の MD5 暗号化を追加します。コードは次のとおりです:
# post传入的参数 params = "123456" # 加密后需拼接的盐值(Salt) salt = "asdfkjalksdncxvm" def md5_encrypt(): m = md5() m.update(params.encode('utf8')) sign1 = m.hexdigest() return sign1 def md5_encrypt_with_salt(): m = md5() m.update((md5_encrypt() + salt).encode('utf8')) sign2 = m.hexdigest() return sign24. AES/DES 対称暗号化 まず最初に、 DES 暗号化について説明します。正式名は Data Encryption Standard で、データ暗号化標準です。これは一般的なタイプの対称暗号化であり、暗号化プロセスと復号化プロセスで使用されるキーは同じです。したがって、必要な場合は、これを解読するには、コンピューティング能力が十分に強力である限り、総当たり列挙によって解読することができます。 AES の正式名は Advanced Encryption Standard で、DES アルゴリズムに代わるものであり、現在最も人気のある対称暗号化アルゴリズムの 1 つです。 AES アルゴリズムを理解するには、まずキー、パディング、モードという 3 つの基本概念を理解する必要があります。 鍵鍵についてはこれまで何度もお話してきましたが、施錠または開錠に使用できる鍵と考えることができます。 AES は、128 ビット、192 ビット、256 ビットの 3 つのキー長をサポートします。
而至于填充这一概念,AES的分组加密的特性我们需要了解,具体如下图所示:
简单来说,AES算法在对明文加密的时候,并不是把整个明文一股脑儿地加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块的长度为128比特。
这些明文块经过AES加密器的复杂处理之后,生成一个个独立的密文块,将这些密文块拼接到一起就是最终的AES加密的结果了。
那么这里就有一个问题了,要是有一段明文的长度是196比特,如果按照每128比特一个明文块来拆分的话,第二个明文块只有64比特了,不足128比特该怎么办呢?这个时候就轮到填充来发挥作用了,默认的填充方式是PKCS5Padding以及ISO10126Padding。
不过在AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。
AES的工作模式,体现在了把明文块加密成密文块的处理过程中,主要有五种不同的工作模式,分别是CBC、ECB、CTR、CFB以及OFB模式,同样地,如果在AES加密过程当中使用了某一种工作模式,解密的时候也必须采用同样地工作模式。最后我们用Python来实现一下AES加密。
import base64 from Crypto.Cipher import AES def AES_encrypt(text, key): pad = 16 - len(text) % 16 text = text + pad * chr(pad) text = text.encode("utf-8") encryptor = AES.new(key.encode('utf-8'), AES.MODE_ECB) encrypt_text = encryptor.encrypt(text) encrypt_text = base64.b64encode(encrypt_text) return encrypt_text.decode('utf-8')
或者大家也可以看一下网上其他的AES加密算法的实现过程,基本上也都是大同小异的,由于篇幅有限,今天暂时就先介绍到这里,后面要是大家感兴趣的话,会去分享一下其他加密算法的实现原理与特征。
以上がPython クローラーの 90% で使用される一般的な暗号化アルゴリズムのインベントリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。