Automatización de la interfaz Python a través del cifrado y descifrado RSA

Hola a todos. En el artículo anterior, presenté varios métodos de encriptación, como Base64, MD5, Sha1, Secret y RSA. Hoy, presentaré la encriptación RSA en combinación con el proyecto.

contenido

1. Introducción

Tarea 1: El Jefe quiere enviar un mensaje a CoCo, asignándole una tarea de trabajo confidencial.

Tarea 2: Después de que CoCo recibe el mensaje enviado por el Jefe, debe responder "recibido".

El resultado se ve así:


1. Introducción al cifrado del algoritmo RSA

1. Introducción

El algoritmo de cifrado RSA es un 非对称加密algoritmo. La clave cifrada es un par de claves compuesto por una clave pública y una clave privada. Se 公钥utiliza para cifrar 私钥y descifrar mensajes. La clave pública es pública y la clave privada es la del usuario. Reservada. Dado que la clave pública es pública, cualquier persona que obtenga la clave pública puede usar la clave pública para cifrar y enviar contenido falsificado.

Por razones de seguridad, podemos usar para firmar antes de enviar un mensaje . La RSAfirma usa la clave privada para firmar y la clave pública para verificar la firma. A través de la firma, podemos asegurar la unicidad de la identidad del usuario, mejorando así la seguridad.

2. ¿Cuál es la relación entre encriptación y firma?

El cifrado y la firma son ambos por razones de seguridad, pero ligeramente diferentes. En pocas palabras, 加密es para evitar que se filtre información, 签名pero para evitar que la información sea manipulada.


(1) Cifrado

Tarea 1: El Jefe quiere enviar un mensaje a CoCo, asignándole una tarea de trabajo confidencial.

El proceso de cifrado de RSA es el siguiente:

1. CoCo genera un par de claves (clave pública y clave privada), la clave privada no es pública y CoCo la conserva. La clave pública es pública y cualquiera puede obtenerla.

2. CoCo transmite su propia clave pública a Boss y cifra el mensaje con la clave pública de CoCo.

3. CoCo recibe el mensaje cifrado por Boss y utiliza la clave privada de CoCo para descifrar el mensaje.

En este proceso, solo hay 2 transmisiones, la primera vez es para que CoCo pase la clave pública al Boss, y la segunda vez para que el Boss encripte el mensaje a CoCo, incluso si ambos son interceptados por el enemigo, hay no hay peligro porque solo la clave privada de CoCo El mensaje se puede descifrar para evitar la fuga del contenido del mensaje.

(2) Firma

Tarea   2: después de que CoCo recibe el mensaje de Boss, debe responder "Recibido".

El proceso de firma RSA es el siguiente:

1. CoCo genera un par de claves (clave pública y clave privada), la clave privada no es pública y CoCo la conserva. La clave pública es pública y cualquiera puede obtenerla.

2. CoCo firma el mensaje con su propia clave privada para formar una firma y transmite el mensaje firmado al Jefe junto con el mensaje en sí.

3. Después de que el Jefe recibe el mensaje, obtiene la clave pública del CoCo para verificar la firma.Si el contenido de la firma es consistente con el mensaje en sí, prueba que el mensaje fue respondido por el CoCo.

En este proceso, solo hay dos procesos de entrega, la primera vez que CoCo transmite el mensaje firmado y el mensaje en sí al Jefe, la segunda vez que el Jefe obtiene la clave pública de CoCo, incluso si son interceptados por el enemigo, no hay peligro Debido a que solo la clave privada de CoCo puede firmar el mensaje, incluso si se conoce el contenido del mensaje, es imposible falsificar una respuesta firmada al Jefe, evitando la manipulación del contenido del mensaje.

Combinando los dos escenarios, se puede encontrar que en el primer escenario, aunque el mensaje interceptado no se filtre, la clave pública interceptada se puede usar para cifrar la instrucción falsa y luego pasarla a CoCo. En el segundo escenario, aunque el mensaje interceptado no se puede alterar, el contenido del mensaje se puede obtener mediante el uso de la clave pública para verificar la firma, lo que no puede evitar la fuga.

Por lo tanto, en aplicaciones prácticas, debe usarse según la situación, y también se puede usar el cifrado y la firma al mismo tiempo. Por ejemplo, CoCo y Boss tienen sus propias claves públicas y privadas. Cuando CoCo quiere enviar un mensaje a Boss, primero usa el par de claves públicas de Boss, el cifrado de mensajes, y luego usa la clave privada de CoCo para firmar el mensaje cifrado, de modo que no se pueda filtrar ni manipular, y se puede garantizar la seguridad del mensaje.

A saber: cifrado de clave pública, descifrado de clave privada, firma de clave privada, verificación de firma de clave pública.

2. Python implementa el cifrado y descifrado RSA

A continuación, usamos Python para implementar el cifrado y la firma RSA mediante una biblioteca de terceros Crypto.

1. Generar un par de claves Para
crear una clave RSA, los pasos son los siguientes:  

1. Importe RSA del paquete Crypto.PublicKey para crear una contraseña;

2. Generar clave RSA de 1024/2048 bits;  

3. Llame al método exportKey de la instancia de la clave RSA y pase los tres parámetros de la contraseña, el estándar PKCS utilizado y el esquema de cifrado;

4. Escriba la clave privada en un archivo en el disco;

5. Utilice la cadena de métodos para llamar a los métodos publickey y exportKey para generar la clave pública y escribirla en el archivo del disco.

El código de ejemplo es el siguiente:

 La clave privada es la siguiente :

La clave pública es la siguiente :

 2. Cifrado de clave pública y descifrado de clave privada

(1) Cifrado de clave pública


El resultado se ve así: 

luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU=

(2) Descifrado de clave privada

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

def decrypt(en_data):
    '''
    en_data:加密过后的数据,传进来是一个字符串
    '''
    # base64解码
    msg = base64.b64decode(en_data)
    # 获取私钥
    privatekey = open('private.pem').read()
    rsakey = RSA.importKey(privatekey)
    # 进行解密
    cipher = PKCS1_v1_5.new(rsakey)
    data= cipher.decrypt(msg, 'DecryptError')
    # 解密出来的是字节码格式,decode转换为字符串
    return data.decode()

if __name__ == '__main__':
    en_data="luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU="
    print(decrypt(en_data))

El resultado se ve así:

ITester软件测试小栈

3. Firma de clave privada y verificación de clave pública

(1) Firma de clave privada

 El resultado se ve así:

Eb7mtvQGHCuzOR475TPRCR95Qg4GK1Nhbdw2je83JBxPfD0WiZ1Di/vXgQ8eH9fmh5z80epATF0IGT3Lm4DJTgHq+apuvhtjYNKv4wnz7c5seTuqWXTEjA6h/PomqW/yMC5/cbPr7w+aYEpV+2E+NKc/brUS1e6+pN4vHkaOXwM=

(2) Verificación de clave pública

from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as Sig_pk
from Crypto.PublicKey import RSA
import base64

def verify(data,sign) -> bool:
    '''
    :param msg: 明文数据,签名之前的数据
    :param sign:接收到的sign签名
    :return:
    '''
    # base64解码
    data = base64.b64decode(sign)
    # 获取公钥
    key = open('public.pem').read()
    rsakey = RSA.importKey(key)
    # 将签名之前的内容进行hash处理
    sha_name = SHA.new(sign.encode("utf-8"))
    # 验证签名
    signer = Sig_pk.new(rsakey)
    res= signer.verify(sha_name, sign)
    # 验证通过返回True   不通过返回False
    return res

if __name__ == '__main__':
    # 签名之前的内容
    data= "CoCo"
    # 签名数据
    sign="X3Gg+wd7UDh4X8ra+PGCyZFUrG+6jDeQt6ajMA0EjwoDwxlddLzYoS4dtjQ2q5WCcRhxcp8fjEyoPXBmJE9rMKDjEIeE/VO0sskbJiO65fU8hgcqdWdgbVqRryhOw+Kih+I6RIeNRYnOB8GkGD8Qca+n9JlOELcxLRdLo3vx6dw="
    print(verify(data, sign)) 

El resultado se ve así:

False

3. Combine el proyecto para realizar el cifrado y descifrado RSA

Requisito: la interfaz requiere la autenticación de la marca de tiempo y los primeros 50 dígitos del token, y obtiene la cadena de firma a través del cifrado de clave pública RSA.

1.  Encapsulación RSA

El paquete rsa se puede recibir respondiendo " " en el fondo de la cuenta pública de WeChat de pequeña pila de prueba de software ITester rsa.

2. Combinado con la implementación del proyecto
(1) Procesamiento de información de autenticación

Genere los primeros 50 dígitos del token y empalme con la marca de tiempo:

from time import time
def generator_sign(token):
    # 获取token的前50位
    token_50 = token[:50]
    # 生成时间戳
    timestamp = int(time())
    # print(timestamp)
    # 接拼token前50位和时间戳
    msg = token_50 + str(timestamp)
    print(msg)
    # 进行RSA加密
    sign = rsaEncrypt(msg)
    return sign,timestamp

(2) Información de solicitud de configuración

La URL de la solicitud y el encabezado de la solicitud se almacenan en el archivo de configuración. El siguiente ejemplo se almacena en el archivo .ini:

[server]
url=http://ITester.com/xxx
auth_type=xxx.itester

(3) Procesamiento de la solicitud

La evaluación se realiza cuando se inicia la solicitud. Si auth_type es el tipo especificado en el archivo de configuración y el token no está vacío, se incluirá la información de autenticación cifrada. (requests_handler.py otro código omitido)

    if conf.get("server","auth_type") == "xxx.itester" and token is not None:
        from Common.handle_rsa import generator_sign
        sign,timestamp = generator_sign(token)
        data["sign"] = sign
        data["timestamp"] = timestamp

Resumen: Hoy, presento principalmente el cifrado y descifrado RSA RSA se usa ampliamente en el cifrado y descifrado, así como en el campo de la comunicación de firmas digitales. En el uso del algoritmo de clave pública/privada,  加密se usa principalmente la clave pública de la otra parte, se usa 解密la clave privada, 签名se usa la clave privada 验签y se usa la clave pública de la otra parte.

Gracias a todos los que leyeron mi artículo detenidamente, observando el aumento y la atención de los fanáticos en todo momento, siempre existe la necesidad de un intercambio de regalos, aunque no es algo muy valioso, si puede usarlo, puede tomarlo directamente. :

 ① Más de 2000 libros electrónicos de Python (los libros convencionales y clásicos deberían estar disponibles)

② Información de la biblioteca estándar de Python (la versión china más completa)

③ Código fuente del proyecto (cuarenta o cincuenta proyectos de capacitación y código fuente interesantes y clásicos)

④ Vídeos sobre introducción básica a Python, rastreador, desarrollo web y análisis de big data (adecuado para el aprendizaje de principiantes)

 

 ⑤ Hoja de ruta de aprendizaje de Python (di adiós al aprendizaje inexperto)

La información en la imagen de arriba está en mi grupo de intercambio técnico QQ (intercambio técnico y uso compartido de recursos, los anuncios llegan para interrumpirlo)

Te lo puedes llevar tú mismo.La información gratuita en el número de grupo 953306497 (nota "csdn111") es la esencia de los más de diez años de carrera testadora del autor. También hay dioses compañeros para intercambiar tecnología juntos.

Supongo que te gusta

Origin blog.csdn.net/ZangKang1/article/details/122990382
Recomendado
Clasificación