std.crypto.aes

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);


Konstanten

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

Funktionen

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