Come rompere il mio giocattolo? [duplicare]

-2

Quando ero bambino adoravo giocare con i blocchi Lego, era magico. Non posso dire che sono cambiato completamente. Oggi stavo giocando con le funzioni di hash e ho deciso di costruire il mio ToyCipher , spero che nessuno abbia un marchio su di esso ... Produce un valore a 256 bit che è xored con il testo normale. Il valore è prodotto da hash uno stato e una chiave.

Ora che ci ho giocato e mi sono divertito, è tempo di buttarlo giù e ricominciare da capo, ma non so come. Qualcuno di voi estranei gentili, per favore, aiutami a trovare il modo più semplice per romperlo?

Il codice sorgente dell'intestazione:

#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

e l'implementazione:

#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;
  }
}
    
posta Douglas 23.09.2016 - 20:55
fonte

1 risposta

0

Sembra un'implementazione della crittografia utilizzando modalità di feedback cifrario . Ha alcuni pro e contro, ma raggiunge l'obiettivo fondamentale di impedire a qualcuno di decodificare un testo cifrato senza una chiave. (Continuerò comunque a utilizzare librerie consolidate e ben recensite sul proprio codice per gli algoritmi di crittografia in codebase reali.)

Si noti che CFB non è una modalità di crittografia autenticata e offre una / poca protezione di integrità. Dato un testo cifrato, qualcuno può creare un testo cifrato modificato valido che cambierà il testo in chiaro in modi prevedibili. Questo può essere inaccettabile e portare a vulnerabilità in alcuni scenari. Ecco una situazione in cui mi sono imbattuta una volta in cui la crittografia non autenticata ha creato più vulnerabilità , che per coincidenza coinvolge un algoritmo di crittografia molto simile al tuo ma con MD5 invece di SHA256 (MD5 ha alcuni problemi ma non penso che sia un problema qui).

    
risposta data 23.09.2016 - 22:54
fonte

Leggi altre domande sui tag