Python クローラーの 90% で使用される一般的な暗号化アルゴリズムのインベントリ

王林
リリース: 2023-04-13 10:52:04
転載
1817 人が閲覧しました

Python クローラーの 90% で使用される一般的な暗号化アルゴリズムのインベントリ

データをキャプチャするとき、「トークン」や「署名」などの多くの暗号化されたパラメーターに遭遇すると思います。今日は、これらのパラメーターの棚卸しを行います。データ キャプチャ プロセスにおける主流の暗号化アルゴリズム、その特徴、暗号化方法などを理解することは、暗号化されたパラメータを逆解読するのに非常に役立ちます。

1. 基本的な常識

最初に理解する必要があるのは、暗号化と復号化とは何なのかということです。名前が示すように、

  • 暗号化: 平文データを暗号文に変換するプロセス
  • 復号化: 暗号化の逆のプロセス、つまり暗号文から元の平文を復元するプロセス。

暗号化アルゴリズムと復号化アルゴリズムの操作は、通常、以下に示すように、それぞれ暗号化キー (暗号化キー) と復号化キー (復号化キー) である一連のキーの制御下で実行されます。表示:

Python クローラーの 90% で使用される一般的な暗号化アルゴリズムのインベントリ

暗号化アルゴリズムは、対称暗号化、非対称暗号化、およびハッシュ アルゴリズムに分類されます。そのうち

  • 対称暗号化:同じキーが暗号化と復号化に使用されます (RC4、AES、DES、その他の暗号化アルゴリズムなど)
  • 非対称暗号化: つまり、暗号化と復号化に異なるキーが使用されます (RSA 暗号化アルゴリズムなど)。
  • ##ハッシュ アルゴリズム: ハッシュ関数とも呼ばれます。異なる長さの入力メッセージに対して固定出力を生成し、出力値はハッシュ値です。
2.Base64 擬似暗号化

Base64 は、厳密には暗号化アルゴリズムではありません。単なるエンコード方式です。64 文字、つまり A ~ Z、a ~ z、0 ~ 9、、/ を使用します。これらの 64 文字は、データのエンコードに使用されます。HTTP 環境で長い識別子を送信するために使用できます。 Base64 エンコードは読み取ることができないため、読み取る前にデコードする必要があります。 Python を使用して、任意の URL で Base64 エンコードを実行します。コードは次のとおりです:

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.com
ログイン後にコピー

3. 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 sign2
ログイン後にコピー

4. AES/DES 対称暗号化

まず最初に、 DES 暗号化について説明します。正式名は Data Encryption Standard で、データ暗号化標準です。これは一般的なタイプの対称暗号化であり、暗号化プロセスと復号化プロセスで使用されるキーは同じです。したがって、必要な場合は、これを解読するには、コンピューティング能力が十分に強力である限り、総当たり列挙によって解読することができます。

AES の正式名は Advanced Encryption Standard で、DES アルゴリズムに代わるものであり、現在最も人気のある対称暗号化アルゴリズムの 1 つです。 AES アルゴリズムを理解するには、まずキー、パディング、モードという 3 つの基本概念を理解する必要があります。

鍵についてはこれまで何度もお話してきましたが、施錠または開錠に使用できる鍵と考えることができます。 AES は、128 ビット、192 ビット、256 ビットの 3 つのキー長をサポートします。

填充

而至于填充这一概念,AES的分组加密的特性我们需要了解,具体如下图所示:

Python クローラーの 90% で使用される一般的な暗号化アルゴリズムのインベントリ

简单来说,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 サイトの他の関連記事を参照してください。

ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート