In che modo è sicuro per l'implementazione OTP utilizzare pagine più piccole del payload?

1

Mi chiedo come sia possibile implementare la crittografia one-time pad nel mio codice.

Io uso le pagine a 16 byte al momento e l'implementazione in Golang dalla pagina: link (la riga 83 è il metodo Encrypt() ).

Tuttavia, i dati che ho bisogno di crittografare a volte (non sempre) sono più grandi di 16 byte.

// Page must be at least as long as plain text
if len(page) < len(payload) {
    return nil, fmt.Errorf("otp: insufficient page size")
}

result := make([]byte, len(payload))

for i := 0; i < len(payload); i++ {
    plainText := int(payload[i])
    secretKey := int(page[i]) // ln 95
    cipherText := (plainText + secretKey) % 255
    result[i] = byte(cipherText)
}

Quello che ho fatto è stato il controllo della lunghezza della pagina, quindi la crittografia ora ignora il problema della lunghezza; utilizzando il modulo durante l'indicizzazione di page (riga 95):

secretKey := int(page[i % len(page)])

Quindi, se cifro il buffer dei dati dice 10 megabyte, è ancora sicuro, e in caso contrario, perché?

    
posta Tany 07.04.2018 - 19:40
fonte

2 risposte

8

Questa è una pessima idea veramente , veramente , davvero . Prima di tutto, questo non è un one-time pad, poiché stai utilizzando lo stesso pad per crittografare più blocchi di dati. È esattamente come inviare più messaggi separatamente crittografati con lo stesso pad.

Ci sono molti attacchi banali contro questo schema:

  1. Se si dispone di un testo in chiaro noto, l'utente malintenzionato può xor byte del testo in chiaro noto rispetto al testo cifrato e recuperare i byte del pad. Quindi possono spostarsi in ogni posizione in cui viene riutilizzato quel byte pad (cioè, +/- len(page) ), xor il byte pad e recuperare più testo normale.
  2. L'analisi della frequenza in ciascuna posizione è potenzialmente banale.
  3. Poiché il valore di ogni byte di pad influisce solo sui byte di output corrispondenti, gli attacchi di forza bruta sono possibili su ciascun byte separatamente (anche se sarà più difficile per sapere quale valore è corretto, sarà comunque possibile).
risposta data 07.04.2018 - 19:56
fonte
5

Se utilizzi un byte più di una volta, non è più un time-pad.

Se la tua chiave si ripete, il risultato può essere rotto, perché i dati sottostanti probabilmente contengono ridondanze. Googling per qualcosa come "rompendo la chiave ripetuta xor" ti farà iniziare sulle tecniche.

    
risposta data 07.04.2018 - 19:50
fonte

Leggi altre domande sui tag