/ / Symetrické šifrovanie v BouncyCastle - c #, šifrovanie, kryptografia, bouncycastle

Symetrické šifrovanie v BouncyCastle - c #, šifrovanie, kryptografia, bouncycastle

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ď č. 1

Takž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:

  1. bloková šifra;
  2. režim;
  3. 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.