Modo de trabajo de cifrado AES ECB, CBC, CFB, OFB y estuches

高级加密标准(Advanced Encryption Standard: AES)是美国国家标准与技术研究院(NIST)在2001年建立了电子数据的加密规范。其是对称加解密算法的最经典算法之一,它是一种分组加密标准,每个加密块大小为128位,允许的密钥长度为128、192和256位。这里只介绍ECB、CBC、CFB和OFB四种加密模式

ECB (modo de libro de códigos electrónico)

La razón para utilizar el modo de cifrado en bloque es que el cifrado en bloque solo puede procesar datos de longitud fija. Por ejemplo, AES procesa 128 bits, luego el texto plano se divide en varios 128 bits y se cifra por separado. Este modo es el modo ECB, de hecho, tiene evidentes debilidades y ya no se utiliza.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

El modo ECB es el más simple y tiene un problema serio, es decir, el mismo texto plano obtendrá el mismo texto cifrado. Debido a que cada bloque tiene el mismo método y clave de cifrado, si el texto plano del bloque es el mismo, el texto cifrado también es el mismo.

Entonces necesitamos encontrar un modelo que al menos satisfaga:

  1. El mismo bloque de texto plano está encriptado y el texto cifrado es diferente.
  2. Pequeños cambios en el texto sin formato pueden provocar grandes cambios en el texto cifrado.

Modo CBC (modo de enlace de bloque de cifrado)

El modo CBC fue inventado por IBM en 1976. En el modo CBC, cada bloque de texto plano se XOR con el bloque de texto cifrado anterior antes de ser cifrado. En este método, cada bloque de texto cifrado depende de todos los bloques de texto cifrado anteriores. Al mismo tiempo, para garantizar la singularidad de cada mensaje, es necesario utilizar un vector de inicialización en el primer bloque.

El proceso de cifrado y descifrado es el siguiente:
Inserte la descripción de la imagen aquí

El vector de inicialización IV se introduce aquí, porque el "texto cifrado anterior" no existe en el primer grupo de textos sin formato. Generalmente, se genera un valor aleatorio como vector de inicialización para cada cifrado.

Modo CFB (modo de retroalimentación de texto cifrado)

CFB también se conoce como el modo de retroalimentación de texto cifrado. El grupo de texto cifrado anterior se enviará a la entrada del algoritmo criptográfico, y el resultado de salida se XOR con el texto plano. A diferencia de los modos ECB y CBC que solo pueden cifrar datos de bloque, CFB puede convertir texto de cifrado de bloque (Block Cipher) en texto cifrado de flujo.

El proceso de cifrado y descifrado es el siguiente:
Inserte la descripción de la imagen aquí

Modo OFB (modo de retroalimentación de salida)

OFB también se denomina modo de retroalimentación de salida La salida del conjunto anterior de algoritmos criptográficos se introducirá en la entrada del siguiente conjunto de algoritmos criptográficos. Primero use el cifrado de bloque para generar el flujo de claves, y luego XOR el flujo de claves con el flujo de texto sin formato para obtener el flujo de texto cifrado. El descifrado es generar primero el flujo de claves con el cifrado de bloque y luego XOR el flujo de claves con el flujo de texto cifrado En texto plano, debido a la simetría de la operación XOR, el proceso de cifrado y descifrado es exactamente el mismo.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

El efecto de cambiar un grupo de texto claro en los cuatro modos de trabajo

  • BCE: solo afecta al grupo actual, pero el mismo grupo de texto plano produce el mismo texto cifrado. La característica del grupo es a veces una debilidad de seguridad grave
  • CBC: el grupo actual y los grupos posteriores se ven afectados y se pueden utilizar como código de autenticación
  • OFB: solo afecta al grupo actual, se puede utilizar en comunicaciones por satélite
  • CFB: el grupo actual y los grupos posteriores se ven afectados y se pueden utilizar como código de autenticación

Caso de trabajo

Ingrese los dos últimos dígitos del número de estudiante n y los dos últimos dígitos del año de nacimiento m (99 años después de 00).

x1 = n módulo 64,
x2 = (n + 20) módulo 64,
x3 = (n + 40) módulo 64,

Vector inicial IV = m mod 64,
K = (1 0 0 1 1 0), Ek (z) = z ⊕ k

Encuentra y1, y2, y3 en los cuatro modos.

La versión de Python es la siguiente:

# ECB模式
def ecb_enc():
    return x1^key, x2^key, x3^key


# CBC模式
def cbc_enc():
    return (iv^x1)^key, (((iv^x1)^key)^x2)^key, (((((iv^x1)^key)^x2)^key)^x3)^key


# OFB模式
def ofb_enc():
    return x1^(iv^key), x2^((iv^key)^key), x3^(((iv^key)^key)^key)


# CFB模式
def cfb_enc():
    return x1^(iv^key), x2^(x1^(iv^key)^key), x3^(x2^(x1^(iv^key)^key)^key)


# 输入学号后两位数字 n,出生年份后两位数字 m (00后取99年)。
print('请输入学号后两位数字 n:')
n = int(input())
print('请输入出生年份后两位数字 m:')
m = int(input())

x1, x2, x3 =  n % 64, (n + 20) % 64, (n + 40) % 64
iv = m % 64
k = '100110'

key = int(k,2)
print('x1={}, x2={}, x3={}'.format(x1,x2,x3))
# 转为二进制后
print('转为二进制后: x1={}, x2={}, x3={}'.format(bin(x1),bin(x2),bin(x3)))

# ECB模式下
ecb_y1, ecb_y2, ecb_y3 = ecb_enc()
print('ECB模式下: y1={}, y2={}, y3={}, 二进制: y1={}, y2={}, y3={}'.format(ecb_y1, ecb_y2, ecb_y3, bin(ecb_y1), bin(ecb_y2), bin(ecb_y3)))

# CBC模式下
cbc_y1, cbc_y2, cbc_y3 = cbc_enc()
print('CBC模式下: y1={}, y2={}, y3={}, 二进制: y1={}, y2={}, y3={}'.format(cbc_y1, cbc_y2, cbc_y3, bin(cbc_y1), bin(cbc_y2), bin(cbc_y3)))

# OFB模式下
ofb_y1, ofb_y2, ofb_y3 = ofb_enc()
print('OFB模式下: y1={}, y2={}, y3={}, 二进制: y1={}, y2={}, y3={}'.format(ofb_y1, ofb_y2, ofb_y3, bin(ofb_y1), bin(ofb_y2), bin(ofb_y3)))

# CFB模式下
cfb_y1, cfb_y2, cfb_y3 = cfb_enc()
print('CFB模式下: y1={}, y2={}, y3={}, 二进制: y1={}, y2={}, y3={}'.format(cfb_y1, cfb_y2, cfb_y3, bin(cfb_y1), bin(cfb_y2), bin(cfb_y3)))

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Pioo_/article/details/110878905
Recomendado
Clasificación