Calcola la dimensione massima per i dati crittografati
-
06-07-2019 - |
Domanda
Esiste un modo per calcolare il risultato più grande da una crittografia Rijndael con una lunghezza dell'array fissa?
Metodo di crittografia: RijndaelManaged
Imbottitura: PKCS7
CipherMode: CBC
BlockSize 128
Dimensione: 128
Ho bisogno di questo come sto convertendo un database in cui tutte le stringhe saranno crittografate, quindi ho bisogno di cambiare la dimensione di tutti i campi di stringa.
Soluzione
Tutto il necessario per provarlo:
public partial class Form1 : Form
{
private SymmetricAlgorithm mEncryptionType;
public Form1()
{
mEncryptionType = new RijndaelManaged();
mEncryptionType.Padding = PaddingMode.PKCS7; //PaddingMode.None;
mEncryptionType.Mode = CipherMode.CBC;
mEncryptionType.BlockSize = 128; // 192; // 256; // Update byte array to IV when changed
mEncryptionType.KeySize = 128; // 192; // 256; // Update byte array to Key when changed
mEncryptionType.IV = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
mEncryptionType.Key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
int encrypted_size = CalculateEncryptedSize(new byte[] { 0x22, 0x23, 0x44 });
// Shows Theran's point about exact block size
encrypted_size = CalculateEncryptedSize(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF });
}
/// <summary>
/// Calculate the encrypted size of input buffer
/// </summary>
/// <param name="inputBuffer">The input buffer</param>
/// <returns>Size of the encrypted buffer</returns>
public int CalculateEncryptedSize(byte[] inputBuffer)
{
int extra_padding = 0;
if (mEncryptionType.Padding != PaddingMode.None)
{
int padding_size = (mEncryptionType.BlockSize / 8);
extra_padding = (padding_size - (inputBuffer.Length % padding_size));
}
return inputBuffer.Length + extra_padding;
}
}
Altri suggerimenti
Sì. Arrotondare la dimensione dell'input al multiplo più vicino della dimensione del blocco (ad esempio 128/8 = 16 byte).
extraBytesNeeded = (16 - (inputSize % 16)) % 16;
maxSize = inputSize + extraBytesNeeded.
La risposta di Jeff è quasi corretta, tranne per il fatto che PKCS7 aggiungerà sempre il riempimento al messaggio, anche se il messaggio si inserisce esattamente in un numero integrale di blocchi. Inoltre, non dimenticare che se si utilizza un IV casuale anche il IV deve essere memorizzato. La formula corretta per la lunghezza di un messaggio imbottito PKCS7 è:
extraBytesNeeded = (16 - (inputSize % 16)); // whole block of padding if input fits exactly
maxSize = inputSize + extraBytesNeeded + IVbytes;