Kryptografie in Rust: Verschlüsselung und Hashing mit ring und sha2

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kryptografie in Rust: Verschlüsselung und Hashing mit den Bibliotheken ring und sha2



Rust ist eine systemnahe Programmiersprache, die Speichersicherheit und eine mit C/C++ vergleichbare Leistung bietet. Dank ihres strengen Typsystems und des Besitzmodells eignet sich Rust ideal für die Implementierung kryptografischer Algorithmen, bei denen Fehler zu schwerwiegenden Sicherheitslücken führen können. In diesem Artikel betrachten wir, wie die beliebten Bibliotheken ring und sha2 für grundlegende kryptografische Operationen verwendet werden: symmetrische Verschlüsselung, Hashing und HMAC-Berechnung.



Die Bibliothek ring: Ein vielseitiges Werkzeug für die Kryptografie



Die Bibliothek ring ist eine der beliebtesten kryptografischen Bibliotheken für Rust. Sie bietet sichere Implementierungen vieler Algorithmen, darunter AES-GCM für die Verschlüsselung, SHA-256 für das Hashing und HMAC für die Nachrichtenauthentifizierung. ring ist in Rust und C geschrieben, was hohe Leistung und Sicherheit gewährleistet.



Fügen Sie zunächst die Abhängigkeit zu Ihrer Cargo.toml hinzu:



[dependencies]ring = "0.17"


Symmetrische Verschlüsselung mit AES-GCM



AES-GCM (Galois/Counter Mode) ist ein Verschlüsselungsmodus, der sowohl Vertraulichkeit als auch Authentifizierung der Daten bietet. Er wird häufig in modernen Protokollen wie TLS verwendet.



Beispiel für die Ver- und Entschlüsselung einer Zeichenkette mit ring:



use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, AES_256_GCM};use ring::error::Unspecified;use ring::rand::{SecureRandom, SystemRandom};

fn encrypt(plaintext: &[u8], key: &[u8; 32]) -> Result<Vec<u8>, Unspecified> { let rng = SystemRandom::new(); let unbound_key = UnboundKey::new(&AES_256_GCM, key)?; let key = LessSafeKey::new(unbound_key);

// Generierung einer zufälligen Nonce (12 Bytes) let mut nonce_bytes = [0u8; 12]; rng.fill(&mut nonce_bytes)?; let nonce = Nonce::assume_unique_for_key(nonce_bytes);

// Puffer für verschlüsselte Daten + Authentifizierungstag let mut in_out = plaintext.to_vec(); key.seal_in_place_append_tag(nonce, Aad::empty(), &mut in_out)?;

// Rückgabe von Nonce + verschlüsselten Daten let mut result = nonce_bytes.to_vec(); result.extend_from_slice(&in_out); Ok(result)}

fn decrypt(ciphertext: &[u8], key: &[u8; 32]) -> Result<Vec<u8>, Unspecified> { let unbound_key = UnboundKey::new(&AES_256_GCM, key)?; let key = LessSafeKey::new(unbound_key);

// Extraktion der Nonce (erste 12 Bytes) let (nonce_bytes, encrypted) = ciphertext.split_at(12); let nonce = Nonce::assume_unique_for_key(nonce_bytes.try_into().unwrap());

let mut in_out = encrypted.to_vec(); let plaintext = key.open_in_place(nonce, Aad::empty(), &mut in_out)?; Ok(plaintext.to_vec())}

fn main() { let key = b"01234567890123456789012345678901"; // 32 Bytes für AES-256 let data = b"Geheime Nachricht";

let encrypted = encrypt(data, key).unwrap(); println!("Verschlüsselt: {:?}", encrypted);

let decrypted = decrypt(&encrypted, key).unwrap(); println!("Entschlüsselt: {}", String::from_utf8(decrypted).unwrap());}


Dieser Code zeigt den vollständigen Verschlüsselungszyklus: Generierung einer zufälligen Nonce, Verschlüsselung mit Authentifizierungstag und anschließende Entschlüsselung. Beachten Sie, dass die Nonce für jede Verschlüsselung mit demselben Schlüssel eindeutig sein muss.



Hashing mit der Bibliothek sha2



Die Bibliothek sha2 bietet Implementierungen der Algorithmen der SHA-2-Familie, einschließlich SHA-256, SHA-384 und SHA-512. Hashing wird zur Überprüfung der Datenintegrität, zur Speicherung von Passwörtern und zur Erstellung digitaler Signaturen verwendet.



Fügen Sie die Abhängigkeit hinzu:



[dependencies]sha2 = "0.10"


Beispiel für das Hashing einer Zeichenkette mit SHA-256:



use sha2:                    

Empfehlungen