AES (Advanced Encryption Standard, NIST FIPS 197) ist der weltweit meistgenutzte symmetrische Blockverschlüsselungsalgorithmus. Die Unit implementiert AES-128 (16-Byte-Schlüssel, 10 Runden) und AES-256 (32-Byte-Schlüssel, 14 Runden) im CBC-Modus (Cipher Block Chaining) mit PKCS#7-Padding. Der CBC-Modus verkettet aufeinanderfolgende Blöcke, sodass identische Klartextblöcke zu unterschiedlichen Chiffretextblöcken führen – ein zufälliger Initialisierungsvektor (IV) muss für jede Verschlüsselung neu generiert werden.
Typische Einsatzbereiche sind Dateiverschlüsselung, verschlüsselte Datenbankfelder, sichere Konfigurationsdateien, Protokollimplementierungen und der Schutz sensibler Nutzdaten im Speicher oder bei der Übertragung.
import std.crypto.aes;
var key: pchar := "0123456789abcdef"; // 16 Byte für AES-128
var iv: pchar := "abcdef0123456789"; // 16 Byte IV
var plaintext: pchar := "Geheime Nachricht";
var encSize: int64 := AESEncryptOutputSize(18);
var ciphertext: pchar := alloc(encSize);
AES128CBCEncrypt(key, iv, plaintext, 18, ciphertext);
| Name | Typ | Wert | Sichtbarkeit |
|---|---|---|---|
AES_BLOCK_SIZE | int64 | 16 | pub |
AES_128_KEY_SIZE | int64 | 16 | pub |
AES_256_KEY_SIZE | int64 | 32 | pub |
AES_128_ROUNDS | int64 | 10 | pub |
AES_256_ROUNDS | int64 | 14 | pub |
AES_128_ROUND_KEYS | int64 | 11 | pub |
AES_256_ROUND_KEYS | int64 | 15 | pub |
| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
GF_mul(a: int64, b: int64): int64 | pub | Multiplikation im Galois-Körper GF(2⁸) |
GF_inv(x: int64): int64 | priv | Inverses Element im Galois-Körper |
GF_inv_simple(x: int64): int64 | pub | Einfaches GF-Inverses ohne Tabelle |
InvSubByteFromForward(sbox_val: int64): int64 | pub | Invertiert S-Box-Wert aus Vorwärtsrichtung |
SubByte(x: int64): int64 | pub | AES-S-Box-Substitution eines Bytes |
InvSubByte(x: int64): int64 | pub | Inverse S-Box-Substitution eines Bytes |
xtime(x: int64): int64 | priv | Multiplikation mit 2 in GF(2⁸) |
times3(x: int64): int64 { return xtime(x) ^ x; } | priv | Multiplikation mit 3 in GF(2⁸) |
SubBytes(state: pchar): pchar | priv | S-Box auf alle 16 State-Bytes anwenden |
InvSubBytes(state: pchar): pchar | priv | Inverse S-Box auf alle State-Bytes |
ShiftRows(state: pchar): pchar | priv | Zyklische Zeilenverschiebung des State |
InvShiftRows(state: pchar): pchar | priv | Inverse Zeilenverschiebung des State |
MixColumns(state: pchar): pchar | priv | Spaltenmischung im Galois-Körper |
InvMixColumns(state: pchar): pchar | priv | Inverse Spaltenmischung des State |
Rcon(i: int64): int64 | priv | Rundenkonstante für Schlüsselexpansion |
RotWord(w: int64): int64 | priv | Rotiert Word um ein Byte links |
BytesToWord(b0: int64, b1: int64, b2: int64, b3: int64): int64 | priv | Vier Bytes zu 32-Bit-Word zusammensetzen |
WordByte(w: int64, idx: int64): int64 | priv | Byte an Position idx aus Word lesen |
SetWordByte(w: int64, idx: int64, b: int64): int64 | priv | Byte an Position idx im Word setzen |
AES128KeyExpand(key: pchar, expanded_key: pchar): int64 | pub | Schlüsselexpansion für AES-128 |
AES256KeyExpand(key: pchar, expanded_key: pchar): int64 | pub | Schlüsselexpansion für AES-256 |
AddRoundKey(state: pchar, expanded_key: pchar, round: int64): pchar | priv | XOR-Verknüpfung State mit Rundenschlüssel |
AESEncryptBlockWithKey(block: pchar, expanded_key: pchar, rounds: int64): pchar | pub | Verschlüsselt einzelnen 16-Byte-Block |
AESDecryptBlockWithKey(block: pchar, expanded_key: pchar, rounds: int64): pchar | pub | Entschlüsselt einzelnen 16-Byte-Block |
XORBlocks(block1: pchar, block2: pchar, dest: pchar): pchar | priv | XOR zweier 16-Byte-Blöcke |
AES128CBCEncrypt(key: pchar, iv: pchar, input: pchar, input_len: int64, output: pchar): int64 | pub | AES-128-CBC-Verschlüsselung mit PKCS#7 |
AES128CBCDecrypt(key: pchar, iv: pchar, input: pchar, input_len: int64, output: pchar): int64 | pub | AES-128-CBC-Entschlüsselung mit PKCS#7 |
AES256CBCEncrypt(key: pchar, iv: pchar, input: pchar, input_len: int64, output: pchar): int64 | pub | AES-256-CBC-Verschlüsselung mit PKCS#7 |
AES256CBCDecrypt(key: pchar, iv: pchar, input: pchar, input_len: int64, output: pchar): int64 | pub | AES-256-CBC-Entschlüsselung mit PKCS#7 |
AESEncryptOutputSize(input_len: int64): int64 | pub | Berechnet Ausgabegröße nach Verschlüsselung |
AESDecryptOutputSize(input_len: int64): int64 | pub | Berechnet Ausgabegröße nach Entschlüsselung |