Dopo quasi 4 giorni di lavoro, ho finalmente ottenuto Libsodium crypto_aead_xchacha20poly1305_ietf_encrypt
per lavorare e produrre lo stesso risultato in JavaScript e PHP .
Ma sono confuso.
Il PHPDoc descrive i parametri come:
* @param string $plaintext Message to be encrypted
* @param string $assocData Authenticated Associated Data (unencrypted)
* @param string $nonce Number to be used only Once
* @param string $key Encryption key
* @return string
Mentre JSDoc richiede questi parametri:
/**
* @param {string | Uint8Array} message
* @param {string | Uint8Array} additional_data
* @param {string | Uint8Array} secret_nonce
* @param {Uint8Array} public_nonce
* @param {Uint8Array} key
* @param {uint8array} outputFormat
* @returns {Uint8Array}
*/
Le mie domande:
- Sembra che un nonce sia un tipo di sale di una dimensione specifica che può essere utilizzato una sola volta perché altrimenti possono verificarsi attacchi di riproduzione. Potete aiutarmi a capirlo ulteriormente? Wikipedia e altri siti sono diventati troppo complicati.
- Per un laico, come descriveresti AEAD e come usare il parametro "Authenticated Associated Data (non criptato)"?
- Nella funzione PHP (che ho copiato da link ), utilizza il nonce non solo come nonce ma anche come I "Dati associati autenticati" riducono la sicurezza rispetto ad altri approcci in cui il mittente potrebbe aggiungere qualche valore qui e comunicare offline al ricevitore ciò che il ricevente dovrebbe aspettarsi che questo valore sia?
- Perché la versione JavaScript accetta parametri diversi? JS chiede un secret_nonce separato da public_nonce e, per far corrispondere i risultati alla funzione di PHP, ho bisogno di fornire valori identici per secret_nonce e public_nonce. Allora, qual è il punto?
P.S. Ecco le funzioni:
JavaScript:
/**
* @param {string} message
* @param {Uint8Array} key
* @returns {Uint8Array}
*/
function encryptAndPrependNonce(message, key) {
let nonce = sodium.randombytes_buf(nonceBytes);
var encrypted = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(message, nonce, nonce, nonce, key);
var nonce_and_ciphertext = concatTypedArray(Uint8Array, nonce, encrypted);
return nonce_and_ciphertext;
}
PHP:
/**
* @link https://paragonie.com/b/kIqqEWlp3VUOpRD7 (from the 'simpleEncrypt' function)
* @param string $message
* @param string $keyAsBinary
* @return string
*/
public static function encryptAndPrependNonce($message, $keyAsBinary) {
$nonce = random_bytes(self::NONCE_BYTES); // NONCE = Number to be used ONCE, for each message
$encrypted = ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt($message, $nonce, $nonce, $keyAsBinary);
return $nonce . $encrypted;
}