Maison >développement back-end >Tutoriel Python >Inventaire des algorithmes de chiffrement courants utilisés dans 90 % des robots Python

Inventaire des algorithmes de chiffrement courants utilisés dans 90 % des robots Python

王林
王林avant
2023-04-13 10:52:041849parcourir

Inventaire des algorithmes de chiffrement courants utilisés dans 90 % des robots Python

Je crois que lorsque vous capturez des données, vous rencontrerez de nombreux paramètres cryptés, tels que « jeton », « signe », etc. Aujourd'hui, l'éditeur vous amènera à faire le point sur ces paramètres lors du processus de capture de données. Algorithmes de chiffrement grand public, quelles sont leurs caractéristiques, quelles sont les méthodes de chiffrement, etc. Les connaître nous sera d'une grande aide pour déchiffrer ces paramètres de chiffrement à l'envers !

1. Le bon sens de base

La première chose que nous devons comprendre est : que sont le cryptage et le décryptage ? Comme son nom l'indique

  • Cryptage : le processus de conversion des données en clair en texte chiffré
  • Déchiffrement : le processus inverse de cryptage, c'est-à-dire le processus de récupération du texte brut d'origine à partir du texte chiffré.

Les opérations des algorithmes de cryptage et de décryptage sont généralement effectuées sous le contrôle d'un ensemble de clés, qui sont respectivement la clé de cryptage (Encryption Key) et la clé de déchiffrement (Decryption Key), comme le montre la figure ci-dessous :

Inventaire des algorithmes de chiffrement courants utilisés dans 90 % des robots Python

Les algorithmes de cryptage sont divisés en algorithmes de cryptage symétrique, de cryptage asymétrique et de hachage, parmi lesquels

  • Cryptage symétrique : c'est-à-dire que la même clé est utilisée pour le cryptage et le déchiffrement, comme RC4, AES, DES et d'autres algorithmes de cryptage
  • Cryptage asymétrique : c'est-à-dire utiliser différentes clés pour le cryptage et le déchiffrement, telles que l'algorithme de cryptage RSA, etc.
  • Algorithme de hachage : également connu sous le nom de fonction de hachage. Produit une sortie fixe pour les messages d'entrée de différentes longueurs, et la valeur de sortie est la valeur de hachage

2 Le pseudo-cryptage Base64

Base64 n'est pas strictement un algorithme de cryptage, c'est juste une méthode de codage. à savoir A-Z, a-z, 0-9, +, /, pour coder des données, et peut être utilisé pour transmettre des informations d'identification plus longues dans un environnement HTTP. Le codage Base64 est illisible et doit être décodé avant de pouvoir être lu. Nous utilisons Python pour effectuer l'encodage Base64 sur n'importe quelle URL. Le code est le suivant :

import base64
# 想将字符串转编码成base64,要先将字符串转换成二进制数据
url = "www.baidu.com"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url)# 被编码的参数必须是二进制数据
print(str_url)

Sortie :

b'd3d3LmJhaWR1LmNvbQ=='

De même, nous pouvons également le décoder, le code est le suivant :

url = "d3d3LmJhaWR1LmNvbQ=="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)

Sortie :

www.baidu.com

3 . chiffrement

MD5 est un algorithme de hachage linéaire largement utilisé, et le cryptage généré est une donnée de longueur fixe (32 bits ou 16 bits), composée de lettres et de chiffres, avec des majuscules et des minuscules uniformes. Les données générées par le cryptage final sont irréversibles, ce qui signifie qu'elles ne peuvent pas être facilement restaurées dans la chaîne d'origine via les données cryptées, sauf par craquage par force brute.

Implémentons le cryptage MD5 en Python :

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())

Sortie :

MD5加密前为 :this is a md5 demo.
MD5加密后为 :b2caf2a298a9254b38a2e33b75cfbe75

Comme mentionné ci-dessus, le cryptage MD5 peut être craqué par force brute pour réduire sa sécurité, donc pendant l'opération réelle, nous ajouterons du sel ou doublerons le cryptage MD5 pour augmenter son fiabilité. Le code est le suivant :

# 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. Cryptage symétrique AES/DES

Tout d'abord, parlons du cryptage DES, le nom complet est Data Encryption Standard, c'est-à-dire que la norme de cryptage des données est courante parmi les cryptages symétriques. , c'est-à-dire que les clés utilisées dans les processus de cryptage et de déchiffrement sont les mêmes. Par conséquent, si vous souhaitez le déchiffrer, vous pouvez utiliser l'énumération par force brute tant que la puissance de calcul est suffisamment puissante.

Le nom complet d'AES est Advanced Encryption Standard, qui remplace l'algorithme DES et l'un des algorithmes de chiffrement symétrique les plus populaires aujourd'hui. Pour comprendre l'algorithme AES, vous devez d'abord comprendre trois concepts de base : clé, remplissage et mode.

Clé

Nous avons beaucoup parlé de la clé auparavant. Vous pouvez la considérer comme une clé qui peut être utilisée pour verrouiller ou déverrouiller. AES prend en charge trois longueurs de clé : 128 bits, 192 bits et 256 bits.

填充

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

Inventaire des algorithmes de chiffrement courants utilisés dans 90 % des robots Python

简单来说,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加密算法的实现过程,基本上也都是大同小异的,由于篇幅有限,今天暂时就先介绍到这里,后面要是大家感兴趣的话,会去分享一下其他加密算法的实现原理与特征。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer