Voglio utilizzare uno schema di crittografia ibrido per la crittografia dei file. Lo schema deve utilizzare PKCS # 1 v1.5 - che è vulnerabile a riempire gli attacchi di Oracle - perché molte smartcard (ad esempio la scheda OpenPGP) supportano solo PKCS # 1 v1.5.
Quindi ho trovato il seguente schema (le chiavi RSA sono grandi 4096-bit, l'algoritmo simmetrico è AES-256-CTR o ChaCha-20 con chiavi a 256 bit e ovviamente vengono utilizzate chiavi diverse per la firma e la crittografia E, naturalmente, so che per i codici di streaming assolutamente IV devono essere usati con la stessa chiave):
Crittografia:
var privateSigningKey;
var publicEncryptionKey;
--- var encryptedBlock = encryptAsym(sessionKey, iV) + encryptSym(data + hash(data));
+++ var encryptedBlock = encryptAsym(sessionKey, iV) + encryptSym(data + sign(data));
var signatureBlock = sign(encryptedBlock);
var encryptedData = encryptedBlock + signatureBlock;
return encryptedData;
Decodifica:
var trustedPublicKeys[];
var signatureBlock = encryptedData.getSignatureBlock();
var encryptedBlock = encryptedData.getEncryptedBlock();
var sender = "";
for each trustedPublicKey do {
bool signatureValid = verifySignature(encryptedBlock, signatureBlock, trustedPublicKeys[i].getSigningKey();
if (signatureValid) sender = trustedPublicKeys[i].getName();
}
if (sender == "") exit("Untrusted signature; stopping to prevent padding oracle attacks.");
var plainDataBlock = decryptHybrid(encryptedBlock);
--- var hash = plainDataBlock.getHash();
+++ var signature = plainDataBlock.getHash();
var plainData = plainDataBlock.getPlainData();
--- if (hash != hash(plainData)) exit("Decryption failed.");
+++ if (signature != sign(plainData)) exit("Decryption failed; untrusted signature.");
return plainData;
Questo schema può essere considerato sicuro? O ci sono problemi di sicurezza o alternative migliori?
So che di solito non giri la tua cripto; ma non posso usare il formato OpenPGP perché non impedisce gli attacchi di riempimento (guarda questa domanda ) e non conosco alternative migliori.
Modifica: Schema aggiornato