He estado escribiendo una clase que cifra y descifra con cifrados de bloques. Quiero usar el modo de contador (CTR / CM). Sabemos que el modo de contador genera una secuencia de teclas basándose en contadores, luego XOR la secuencia de teclas con texto sin formato para producir texto cifrado. Por lo tanto, uno puede descifrar mientras pueda reproducir el flujo de claves, es decir, reproducir el contador y obtener la clave correcta.
Observé que el método de descifrado de un cifrado no es necesario en el modo CTR, ya que para reproducir el flujo de claves solo necesitamos cifrar los bloques de contador nuevamente.
Entonces, ¿por qué no puedo reemplazar el cifrado ordinario con una función hash (por lo tanto, hacer parte clave del contador) o una función HMAC (que acepta una tecla)? ¿Las funciones hash no son tan pseudoaleatorias en comparación con los sistemas de cifrado en la generación de cadenas de claves, o hay más razones?
p.s .: Esta pregunta también funciona con el modo OFB: la aplicación de una IV con o sin una clave una y otra vez también produce algo que parece una secuencia de teclas.
p.s.2: un ejemplo:
1) Construyamos un contador de 16 bytes:
aPADDING00000000
aPADDING00000001
aPADDING00000002
Aquí obtenemos 3 bloques.
2) Luego use HMAC de MD5 para generar el flujo de claves:
key = 'This is a key.'
stream[0] = HMAC('This is a key.','aPADDING00000000').hexdigest()
stream[1] = HMAC('This is a key.','aPADDING00000001').hexdigest()
stream[2] = HMAC('This is a key.','aPADDING00000002').hexdigest()
# now stream is:
# ['73f2e665c30aaec5bbead51166aaa85f',
# '91392d0755638fbce5c689f96b02494f',
# '1d18a81751179858d151dd86179385f9']
stream_str = "".join(stream).decode('hex') # stream_str = '73f2 ... 85f9'.decode('hex')
3) Ahora stream_str se parece mucho a una secuencia de teclas. Para encriptar:
plaintext = 'This is a plaintext that has length of 48 bytes.'
ciphertext = stream_xor(plaintext,stream_str) # stream_xor XORs the two inputs bit by bit.
o, para descifrar:
decrypted = stream_xor(ciphertext,stream_str) # ciphertext produced before.