Polsterung im-AES-CBC
Ich versuche zu testen CBC mit Zufalls-IV mit (128-bit AES) in C#.
In meiner Frage zu lösen, habe ich 12-byte-input-Nachricht. Die Bedingung ist, dass, wenn der Klartext ist weniger als der block-Größe (16-Byte) die Polsterung verwendet werden, beginnt mit 0x01 und dann bis zu 6 0x00.
Beispiel:
in ASCII PT = Pay Bob 100%
in hex PT = 50 61 79 20 42 6f 62 20 31 30 30 24
PT with Padding = 50 61 79 20 42 6f 62 20 31 30 30 24 01 00 00 00
Ich bin anscheinend nicht in der Lage sein, diese zu finden PaddingMode in RijndaelManaged.
Kann irgend jemand mir empfehlen, wie das folgende zu tun?
- Variable-Länge-Polsterung
EDIT:
public class CBC
{
public CBC()
{
}
private static readonly byte[] SALT = new byte[]
{0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c};
public static byte[] EncryptCBC(string plainText, string passPhrase, PaddingMode paddingMode )
{
byte[] result;
using (RijndaelManaged cryptoProvider = new RijndaelManaged())
{
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(passPhrase, SALT);
cryptoProvider.Mode = CipherMode.CBC;
cryptoProvider.GenerateIV(); //generate random IV
cryptoProvider.Padding = paddingMode;
cryptoProvider.Key = derivedKey.GetBytes(cryptoProvider.KeySize / 8);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (ICryptoTransform encryptor = cryptoProvider.CreateEncryptor(cryptoProvider.Key, cryptoProvider.IV))
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
}
}
//concatenate iv to ciphertext
result = cryptoProvider.IV.Concat(msEncrypt.ToArray()).ToArray();
}
cryptoProvider.Clear();
}
return result;
}
public static string DecryptCBC(byte[] cipherTextBytes, string passPhrase, PaddingMode paddingMode)
{
string result = null;
using (RijndaelManaged cryptoProvider = new RijndaelManaged())
{
Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(passPhrase, SALT);
cryptoProvider.Mode = CipherMode.CBC;
//take the iv off the beginning of the ciphertext message
cryptoProvider.IV = cipherTextBytes.Take(cryptoProvider.BlockSize / 8).ToArray();
cryptoProvider.Padding = paddingMode;//PaddingMode.ANSIX923;
cryptoProvider.Key = derivedKey.GetBytes(cryptoProvider.KeySize / 8);
using (MemoryStream msEncrypt = new MemoryStream(cipherTextBytes.Skip(cryptoProvider.BlockSize / 8).ToArray())) //skip the IV bytes
{
using (ICryptoTransform encryptor = cryptoProvider.CreateDecryptor(cryptoProvider.Key, cryptoProvider.IV))
{
using (CryptoStream cryptoStream = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Read))
{
byte[] plainTextBytes = new byte[cipherTextBytes.Length - cryptoProvider.BlockSize / 8];
int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
result = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
cryptoStream.Close();
}
}
}
cryptoProvider.Clear();
}
return result;
}
}
Mein Polsterung Funktion
private byte[] PaddPlainTextBytes(byte[] plainTextBytes )
{
byte[] padding = utils.HexToBytes("01000000");
MemoryStream s = new MemoryStream();
s.Write(plainTextBytes, 0, plainTextBytes.Length);
s.Write(padding, 0, padding.Length);
byte[] paddedPt = s.ToArray();
return paddedPt;
}
- Methode zu testen, meine CBC
private void btnTestCBC_Click(object sender, EventArgs e)
{
string plainText = "Pay Bob 100%";
string passPhrase = "Thisismypassphrase";
ShowMessage(@"Plain Text = " + plainText);
byte[] pBytes = PaddPlainTextBytes(Encoding.ASCII.GetBytes(plainText));
string message = Encoding.ASCII.GetString(pBytes);
byte[] encryptedBytes = CBC.EncryptCBC(plainText: message, passPhrase: passPhrase, paddingMode: PaddingMode.None);
ShowMessage("Encrypted String = " + Encoding.ASCII.GetString(encryptedBytes));
ShowMessage("Encrypted HEX = " + utils.BytesToHex(encryptedBytes));
string decryptedString = CBC.DecryptCBC(encryptedBytes, passPhrase, PaddingMode.None);
ShowMessage("Deccrypted String = " + decryptedString);
}
- Sie könnte auch ein Modus der operation, die erfordert keine Polsterung, wie CTR. Nicht integriert, leider.
- Sie scheinen anzunehmen, die Polsterung ist immer eine Feste Länge hat, und nicht eine alignment-Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Polsterung Schema, das Sie beschrieben haben sieht viel wie "ISO/IEC 7816-4 Polsterung" , siehe die Wikipedia-Seite auf Polstern (das habe ich gerade bearbeitet) für die padding-Methode. Normalerweise beginnen Sie mit einem einzelnen bit auf eins gesetzt, nicht ein byte, also wäre 0x80 statt 0x01 für das erste byte.
Diese Polsterung Knoten ist wahrscheinlich nicht bauen. Wenn Sie Experimentieren wollen, würde ich empfehlen, die Hüpfburg libs, sonst Umschalten auf den fast allgegenwärtigen PKCS#7-Auffüllung.
Ich bin nicht vertraut mit Ihrer Polsterung System, aber es ist nicht .net sicher. Sie sollten in der Lage sein, die
PaddingMode
zuNone
- und post-pend Ihr pad, um Ihre Eingabe Nachricht, sollte das gleiche Ergebnis für was auch immer ist, ihn zu entschlüsseln. Wenn Sie ihn zu entschlüsseln, Sie müssen entfernen Sie das pad selbst...
" in der100..00
.