Con GPG, puoi "decodificare" un file che non è stato crittografato?

2

Nel leggere sulla crittografia asimmetrica qualche tempo fa, ricordo di aver letto che potresti "decodificare" un file non criptato con la tua chiave privata, poi altri (chiunque) potrebbero "criptarlo" con la tua chiave pubblica per recuperare il file originale e assicurati che fosse da te. Ovviamente, il modo corretto per farlo è firmando, che GPG gestisce. Tuttavia ... È possibile con GPG?

Sto provando il seguente comando.

gpg --output decrypted.jpg --decrypt --local-user my-email-address original.jpg

Non emette alcun commento o errore, ma non viene creato decrypted.jpg .

    
posta lukejanicke 20.08.2016 - 20:00
fonte

2 risposte

9

Differenza tra la firma e la decrittografia

Penso che la tua confusione derivi dal fatto che la firma in teoria in effetti è in qualche modo simile alla decifratura per alcuni algoritmi (ad esempio RSA).

Wikipedia ad esempio frasi come questa:

Suppose Alice wishes to send a signed message to Bob. She can use her own private key to do so. She produces a hash value of the message, raises it to the power of d (modulo n) (as she does when decrypting a message), and attaches it as a "signature" to the message.

Questo è tuttavia non come viene fatto nella pratica , ed è per questo che il tuo approccio non funziona.

Per una spiegazione più approfondita della firma e della decrittazione, vedi ad esempio qui :

In the abstract world of textbooks, RSA signing and RSA decryption do turn out to be the same thing. In the real world of implementations, they are not. So don't ever use a real-world implementation of RSA decryption to compute RSA signatures. In the best case, your implementation will break in a way that you notice. In the worst case, you will introduce a vulnerability that an attacker could exploit.

Furthermore, don't make the mistake of generalizing from RSA to conclude that any encryption scheme can be adapted as a digital signature algorithm. That kind of adaptation works for RSA and El Gamal, but not in general.

Riguardo a PGP, non firma il messaggio stesso, ma invece firma un hash digest del messaggio :

PGP uses a cryptographically strong hash function on the plaintext the user is signing. This generates a fixed-length data item known as a message digest. (Again, any change to the information results in a totally different digest.)

Then PGP uses the digest and the private key to create the "signature." PGP transmits the signature and the plaintext together. Upon receipt of the message, the recipient uses PGP to recompute the digest, thus verifying the signature. PGP can encrypt the plaintext or not; signing plaintext is useful if some of the recipients are not interested in or capable of verifying the signature.

Ecco un'immagine che descrive il processo:

Perchénonpuoisemplicementedecodificareunmessaggioperfirmarlo

Quantosopraètuttomoltobello,esappiamochenondovremmodecodificareimessaggiperfirmarliinpratica,maperchénonpossiamofarlosoloperdivertimento?

PerchénonècosìchefunzionanoPGPoGPG.Unaspiegazionecompletadelfunzionamentointernosarebbeprobabilmentetroppoperquestadomanda,masivedaadesempio In che modo GPG verifica la corretta decrittazione? .

In breve, PGP non si limita a eseguire operazioni mod sui dati di decodifica, il formato .pgp è ben definito e contiene varie informazioni. Si noti inoltre che PGP non utilizza effettivamente la crittografia asimmetrica come RSA sul messaggio stesso, ma su una chiave che viene quindi utilizzata per crittografare simmetricamente il messaggio.

Conclusione

Per riassumere, se dovessi usare un semplice RSA, potresti usare la decrittazione per firmare un messaggio (ma non dovresti), ma PGP e GPG non sono semplici RSA, quindi non puoi semplicemente decifrare un messaggio per firmalo.

    
risposta data 20.08.2016 - 23:08
fonte
1

Sembra che tu ricordi le basi di come funzionano le firme digitali nel caso del libro di testo RSA (che è un po 'troppo semplificato da RSA).

La chiave pubblica RSA è composta da N (il modulo) che è il prodotto di due numeri primi grandi (ad esempio, in RSA 2048 bit, N è un prodotto a 2048 bit di due numeri primi 1024 bit ) e l'esponente pubblico, e , che di solito è impostato su 65537. La chiave privata è composta in modo simile da N e d , l'esponente privato.

(Se conosci i numeri primi peq, puoi calcolare rapidamente l'esponente privato, d, tramite l'algoritmo esteso di Euclid , dove d viene scelto per garantire che (m^e)^d mod N = m trovando d = e^-1 mod (p-1)(q-1) che funziona a causa di teorema di Eulero In generale, non esiste un modo pubblicamente noto per trovare d dato N ed e che è asintoticamente più efficiente del factoring N.)

Criptazione RSA di libri di testo lascia che chiunque con la tua chiave pubblica prenda un messaggio m (che si presume sia codificato in un intero minore di N) e crei un testo cifrato c calcolando c = m^e mod N (esponenziazione modulare) , che può essere decifrato solo da persone che possiedono la chiave privata. La decifratura RSA dei libri di testo è la stessa procedura di esponenziazione modulare, ma, anziché agire sul messaggio e utilizzare l'esponente pubblico, agisce sul testo cifrato con l'esponente privato. Ciò significa che se hai la chiave privata e il testo cifrato, puoi calcolare m tramite m = c^d mod N .

Le firme nel libro di testo RSA sono talvolta chiamate "crittografia con la chiave privata" e funzionano in modo molto simile, con la differenza principale che è l'ordine. La persona che firma il messaggio all'inizio utilizza l'esponenziazione modulare con la chiave privata (simile alla decrittazione RSA) per creare una firma S = m^d mod N . Quindi quando dai a qualcuno un messaggio firmato (cioè m e S insieme), possono verificare che il messaggio non sia stato alterato eseguendo l'esponenziazione modulare sulla firma con la chiave pubblica e verificando che S^e mod N sia uguale al messaggio originale.

La principale differenza tra RSA da manuale e RSA reale per la crittografia è che in RSA reale non usi RSA per crittografare il messaggio che intendi inviare. Invece, si crea una chiave simmetrica casuale (ad esempio, una chiave AES a 128 bit) e si usa quella chiave simmetrica casuale per crittografare il proprio messaggio di dimensioni arbitrarie (che può essere molto più grande di 2048 bit che è grosso modo la dimensione di N), e quindi utilizzare il manuale RSA per crittografare questa chiave simmetrica casuale. Cioè tu passi il ciphertext c_aes = AES(k, m) (che sarà il numero di blocchi del messaggio in chiaro) e la chiave AES criptata RSA c_key = k^e mod N a qualcuno quando vuoi inviare un messaggio cifrato. Quindi decodificano la chiave AES con la loro chiave privata RSA e usano la chiave decrittografata per decrittografare c_aes .

Allo stesso modo, la principale differenza tra RSA da manuale e RSA reale per la firma è che in RSA reale non si esegue l'esponenziazione modulare sul messaggio, che potrebbe essere molto più grande del modulo N. Invece, si esegue un hash crittografico funzione sul messaggio (come SHA-256 ), quindi creare una firma su questo valore di hash. Ciò significa firmare prima il messaggio hash h = sha256(m) , quindi generare la firma S = h^d mod N . Per verificare, qualcuno con la tua chiave pubblica, la tua firma e il messaggio in chiaro può controllare che S^e mod N sia uguale al loro calcolo del valore di hash del messaggio di testo in chiaro associato.

    
risposta data 21.08.2016 - 07:22
fonte

Leggi altre domande sui tag