créer le chachaengine dans la méthode crypt
This commit is contained in:
parent
3508a71fb0
commit
2d030cdac1
|
@ -5,7 +5,6 @@ import org.bouncycastle.crypto.params.KeyParameter
|
|||
import org.bouncycastle.crypto.params.ParametersWithIV
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.util.concurrent.locks.ReentrantLock
|
||||
|
||||
/**
|
||||
* Classe permettant de chiffrer et déchiffrer les messages de l'application selon l'algorithme ChaCha20.
|
||||
|
@ -26,7 +25,6 @@ class ChaCha constructor(val key: ByteArray) {
|
|||
* Taille du vecteur d'initialisation en octets
|
||||
*/
|
||||
private val IV_SIZE = 8
|
||||
|
||||
/**
|
||||
* Taille des buffers utilisés pendant le chiffrement et le déchiffrement en octets
|
||||
*/
|
||||
|
@ -56,21 +54,11 @@ class ChaCha constructor(val key: ByteArray) {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Instance de la classe effectuant le chiffrement
|
||||
*/
|
||||
private val engine = ChaChaEngine()
|
||||
/**
|
||||
* La clé de chiffrement
|
||||
*/
|
||||
private val keyParameter = KeyParameter(key)
|
||||
|
||||
/**
|
||||
* Verrou empêchant l'utilisation des utilisations concurrentes de la méthode crypt pour une
|
||||
* instance de ChaCha donnée
|
||||
*/
|
||||
private val cryptLock = ReentrantLock()
|
||||
|
||||
/**
|
||||
* Si le encrypt est Vrai alors le message text est chiffré
|
||||
* sinon le message text est déchiffré
|
||||
|
@ -80,51 +68,44 @@ class ChaCha constructor(val key: ByteArray) {
|
|||
* @return Le message chiffré ou déchiffré en fonction de la valeur de encrypt
|
||||
*/
|
||||
private fun crypt(encrypt: Boolean, text: ByteArray): ByteArray {
|
||||
this.cryptLock.lock()
|
||||
val input = ByteArrayInputStream(text)
|
||||
val output = ByteArrayOutputStream()
|
||||
|
||||
try {
|
||||
val input = ByteArrayInputStream(text)
|
||||
val output = ByteArrayOutputStream()
|
||||
val inputBuffer = ByteArray(BUFFER_SIZE)
|
||||
val outputBuffer = ByteArray(BUFFER_SIZE)
|
||||
|
||||
val inputBuffer = ByteArray(BUFFER_SIZE)
|
||||
val outputBuffer = ByteArray(BUFFER_SIZE)
|
||||
|
||||
// instanciation du vecteur d'initialisation
|
||||
val params: ParametersWithIV
|
||||
if (encrypt) {
|
||||
// génèrer le vecteur d'initialisation si le message doit être chiffré
|
||||
val iv = generateIV()
|
||||
output.write(iv)
|
||||
params = ParametersWithIV(keyParameter, iv)
|
||||
} else {
|
||||
// lire le vecteur d'initialisation lors du déchiffrement du message
|
||||
val iv = ByteArray(8)
|
||||
input.read(iv)
|
||||
params = ParametersWithIV(keyParameter, iv)
|
||||
}
|
||||
|
||||
// chiffrement/déchiffrement du message
|
||||
val engine = this.engine
|
||||
engine.init(encrypt, params)
|
||||
|
||||
// lecture de la première partie du message
|
||||
var len = input.read(inputBuffer)
|
||||
while (len != -1) {
|
||||
// chiffrement/déchiffrement de la partie du message
|
||||
engine.processBytes(inputBuffer, 0, len, outputBuffer, 0)
|
||||
// écrire le texte chiffré/déchiffré dans le stream de sortie
|
||||
output.write(outputBuffer, 0, len)
|
||||
// lecture de la prochaine partie du message
|
||||
len = input.read(inputBuffer)
|
||||
}
|
||||
|
||||
// retourner le message chiffré/déchiffré sous forme d'octets
|
||||
return output.toByteArray()
|
||||
|
||||
} finally {
|
||||
// relacher le verrou
|
||||
this.cryptLock.unlock()
|
||||
// instanciation du vecteur d'initialisation
|
||||
val params: ParametersWithIV
|
||||
if (encrypt) {
|
||||
// génèrer le vecteur d'initialisation si le message doit être chiffré
|
||||
val iv = generateIV()
|
||||
output.write(iv)
|
||||
params = ParametersWithIV(keyParameter, iv)
|
||||
} else {
|
||||
// lire le vecteur d'initialisation lors du déchiffrement du message
|
||||
val iv = ByteArray(8)
|
||||
input.read(iv)
|
||||
params = ParametersWithIV(keyParameter, iv)
|
||||
}
|
||||
|
||||
// chiffrement/déchiffrement du message
|
||||
val engine = ChaChaEngine()
|
||||
engine.init(encrypt, params)
|
||||
|
||||
// lecture de la première partie du message
|
||||
var len = input.read(inputBuffer)
|
||||
while (len != -1) {
|
||||
// chiffrement/déchiffrement de la partie du message
|
||||
engine.processBytes(inputBuffer, 0, len, outputBuffer, 0)
|
||||
// écrire le texte chiffré/déchiffré dans le stream de sortie
|
||||
output.write(outputBuffer, 0, len)
|
||||
// lecture de la prochaine partie du message
|
||||
len = input.read(inputBuffer)
|
||||
}
|
||||
|
||||
// retourner le message chiffré/déchiffré sous forme d'octets
|
||||
return output.toByteArray()
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue