KeyParameter param = new KeyParameter(password);
cipher.Init(true, param);
PaddedBufferedBlockCipher blockCipher = new PaddedBufferedBlockCipher(cipher, new ZeroBytePadding());
Takto som nastavil svoju šifru v BouncyCastle. Ako to, že nie je IV, aby ste zvolili alebo zablokovali režim? Ako to funguje?
odpovede:
1 pre odpoveď č. 1Takže existuje niekoľko vecí, ktoré by ste mali vedieť o Bouncy Castle. V porovnaní s triedami Java JCE alebo .NET existujú viaceré vrstvy pre každú plnú šifru:
- bloková šifra;
- režim;
- vyrovnávacia pamäť a výplň.
Okrem toho existuje základňa CipherParameters
trieda, ktorá obsahuje prípady, ktoré sú akceptovanévšetkými týmito triedami. Kontroluje sa typovo v rámci rôznych šifrovacích tried a ak je potrebná informácia, potom je extrahovaná, inak je spravidla len odovzdaná rodičovi.
OK, takže to všetko môže byť trochu abstraktné, takže som "vytvoril príklad, v ktorom je najskôr vytvorená inštancia blokovej šifry, ktorá sa používa na generovanie režimu operácie a nakoniec aj vyrovnávacia inštancia, ktorá tiež vykonáva výplň.
Ja som zámerne použil typ rozhrania pre premenné, aby ste mohli vidieť štruktúru dedičstva.
Áno, a ja som používal Java, ale všeobecná štruktúra je samozrejme rovnaká v Java a C # API.
package se.so;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.paddings.ZeroBytePadding;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
public class PaddedBufferedBC {
private static final boolean FOR_ENCRYPTION = true;
public static void main(String[] args) {
byte[] keyData = new byte[16];
CipherParameters key = new KeyParameter(keyData);
byte[] ivData = new byte[16];
CipherParameters keyAndIV = new ParametersWithIV(key, ivData);
// absorbs the key
BlockCipher blockCipher = new AESEngine();
// absorbs the IV (missing in the code of the question)
BlockCipher cbcBlockCipher = new CBCBlockCipher(blockCipher);
// simply passes on the key and IV
PaddedBufferedBlockCipher bufferedBlockCipher =
new PaddedBufferedBlockCipher(cbcBlockCipher, new ZeroBytePadding());
// initialization should be on the last wrapper class
bufferedBlockCipher.init(FOR_ENCRYPTION, keyAndIV);
// just to test that I didn"t make any mistakes
System.out.println(bufferedBlockCipher.getUpdateOutputSize(100));
}
}
Všimnite si, že šifrovanie streamu alebo šifrovanie v režime streamovania (napr. SICBlockCipher
) nemusia byť zabalené a PaddedBufferedBlockCipher
.