¿Cómo romper mi juguete? [duplicar]

-2

Cuando era niño me encantaba jugar con los bloques de Lego, fue mágico. No puedo decir que haya cambiado por completo. Hoy jugaba con funciones hash y decidí crear mi propio ToyCipher , espero que nadie tenga una marca registrada ... Produce un valor de 256 bits que es xored con el texto plano. El valor se produce mediante hashing de un estado y una clave.

Ahora que he jugado con él y me he divertido, es hora de derribarlo y comenzar de nuevo, pero no sé cómo. ¿Alguno de ustedes, extraños, me ayudaría a encontrar la forma más sencilla de romperlo?

El código fuente del encabezado:

#ifndef TOY_CIPHER_H
#define TOY_CIPHER_H

typedef struct {
  unsigned char state[32];
  unsigned char key[32];
} ToyCtx;

void toycipher_init(ToyCtx* tc, unsigned char const* key,
                    unsigned char const* iv);

// must be a multiple of 32
void toycipher_encrypt(ToyCtx* tc, unsigned char const* in, int in_size,
                       unsigned char* out);
void toycipher_decrypt(ToyCtx* tc, unsigned char const* in, int in_size,
                       unsigned char* out);

#endif

y la implementación:

#include "toy_cipher.h"
#include <stdint.h>
#include <string.h>
#include <openssl/sha.h>
#include <assert.h>

// Private
static void _xor32(uint64_t* dest, uint64_t const* in, uint64_t const* key)
{
  for(int i = 0; i < 4; ++i)
    *dest++ = *in++ ^ *key++;
}

// Public
void toycipher_init(ToyCtx* tc, unsigned char const* key,
                    unsigned char const* iv)
{
  memcpy(tc->state, iv, 32);
  memcpy(tc->key, key, 32);
}

// must be a multiple of 32
void toycipher_encrypt(ToyCtx* tc, unsigned char const* in, int in_size,
                       unsigned char* out)
{
  assert((in_size % 32) == 0);

  int n = in_size >> 5; // in_size / 32
  while(n){
    uint64_t k[4];
    SHA256((unsigned char const*)tc, 64, (unsigned char*)k);
    _xor32((uint64_t*)out, (uint64_t*)in, k);
    memcpy(tc->state, out, 32);
    in += 32;
    out += 32;
    --n;
  }
}

void toycipher_decrypt(ToyCtx* tc, unsigned char const* in, int in_size,
                       unsigned char* out)
{
  assert((in_size % 32) == 0);

  int n = in_size >> 5; // in_size / 32
  while(n){
    uint64_t k[4];
    SHA256((unsigned char const*)tc, 64, (unsigned char*)k);
    memcpy(tc->state, in, 32);
    _xor32((uint64_t*)out, (uint64_t*)in, k);
    in += 32;
    out += 32;
    --n;
  }
}
    
pregunta Douglas 23.09.2016 - 20:55
fuente

1 respuesta

0

Esto parece una implementación de cifrado usando modo de retroalimentación de cifrado . Tiene algunas ventajas y desventajas, pero cumple con el objetivo básico de evitar que alguien descifre un texto cifrado sin una clave. (Todavía recomendaría el uso de bibliotecas establecidas y bien revisadas sobre su propio código para algoritmos de cifrado en bases de código reales).

Tenga en cuenta que CFB no es un modo de cifrado autenticado y ofrece una protección de integridad nula o nula. Dado un texto cifrado, alguien puede crear un texto cifrado modificado válido que cambiará el texto simple de manera predecible. Esto puede ser inaceptable y provocar vulnerabilidades en algunos escenarios. Aquí hay una situación en la que me encontré una vez, donde el cifrado no autenticado creó múltiples vulnerabilidades , que coinciden con un algoritmo de cifrado muy similar al suyo pero con MD5. de SHA256 (MD5 tiene algunos problemas, pero no creo que sea un problema aquí).

    
respondido por el Macil 23.09.2016 - 22:54
fuente

Lea otras preguntas en las etiquetas