SubtleCrypto: encrypt()-Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die encrypt()-Methode der SubtleCrypto-Schnittstelle verschlüsselt Daten.

Sie benötigt als Argumente einen Schlüssel zur Verschlüsselung, einige algorithmenspezifische Parameter und die zu verschlüsselnden Daten (auch als "Klartext" bekannt). Sie gibt ein Promise zurück, das mit den verschlüsselten Daten (auch als "Chiffretext" bekannt) erfüllt wird.

Syntax

js
encrypt(algorithm, key, data)

Parameter

algorithm

Ein Objekt, das den Algorithmus angibt, der verwendet werden soll, sowie alle notwendigen zusätzlichen Parameter:

key

Ein CryptoKey, das den zu verwendenden Schlüssel zur Verschlüsselung enthält.

data

Ein ArrayBuffer, ein TypedArray, oder ein DataView, der die zu verschlüsselnden Daten enthält (auch bekannt als Klartext).

Rückgabewert

Ein Promise, das mit einem ArrayBuffer, das den "Chiffretext" enthält, erfüllt wird.

Ausnahmen

Das Promise wird abgelehnt, wenn die folgenden Ausnahmen auftreten:

InvalidAccessError DOMException

Tritt auf, wenn die angeforderte Operation für den bereitgestellten Schlüssel nicht gültig ist (z.B. ungültiger Verschlüsselungsalgorithmus oder ungültiger Schlüssel für den angegebenen Verschlüsselungsalgorithmus).

OperationError DOMException

Tritt auf, wenn die Operation aus einem operationsspezifischen Grund fehlschlägt (z.B. Algorithmusparameter in ungültigen Größen, oder AES-GCM-Klartext länger als 239−256 Bytes).

Unterstützte Algorithmen

Die Web Crypto API stellt vier Algorithmen zur Verfügung, die die encrypt()- und decrypt()-Operationen unterstützen.

Einer dieser Algorithmen — RSA-OAEP — ist ein Public-Key-Kryptosystem.

Die anderen drei Verschlüsselungsalgorithmen hier sind alle symmetrische Algorithmen, und sie basieren alle auf derselben zugrundeliegenden Chiffre, AES (Advanced Encryption Standard). Der Unterschied zwischen ihnen liegt im Modus. Die Web Crypto API unterstützt drei verschiedene AES-Modi:

  • CTR (Counter Mode)
  • CBC (Cipher Block Chaining)
  • GCM (Galois/Counter Mode)

Es wird dringend empfohlen, authentifizierte Verschlüsselung zu verwenden, die Überprüfungen einschließt, dass der Chiffretext nicht von einem Angreifer verändert wurde. Authentifizierung hilft, sich gegen Chiffretext-basierten Angriffe zu schützen, bei denen ein Angreifer das System bitten kann, beliebige Nachrichten zu entschlüsseln, und das Ergebnis nutzen kann, um Informationen über den geheimen Schlüssel abzuleiten. Obwohl es möglich ist, Authentifizierung zu CTR- und CBC-Modus hinzuzufügen, bieten diese sie nicht standardmäßig und bei manueller Implementierung können leicht kleine, aber schwerwiegende Fehler gemacht werden. GCM bietet eingebaute Authentifizierung und wird aus diesem Grund häufig gegenüber den anderen beiden AES-Modi empfohlen.

RSA-OAEP

Das RSA-OAEP Public-Key-Verschlüsselungssystem ist in RFC 3447 spezifiziert.

AES-CTR

Dies repräsentiert AES im Counter Mode, wie in NIST SP800-38A spezifiziert.

AES ist eine Blockchiffre, was bedeutet, dass sie die Nachricht in Blöcke aufteilt und diese Block für Block verschlüsselt. Im CTR-Modus wird jedes Mal, wenn ein Block der Nachricht verschlüsselt wird, ein zusätzlicher Datenblock hineingemischt. Dieser zusätzliche Block wird als "Counter Block" bezeichnet.

Ein gegebener Counter Block-Wert darf niemals mehr als einmal mit demselben Schlüssel verwendet werden:

  • Bei einer Nachricht mit n Blöcken muss für jeden Block ein anderer Counter Block verwendet werden.
  • Wenn derselbe Schlüssel verwendet wird, um mehr als eine Nachricht zu verschlüsseln, muss ein anderer Counter Block für alle Blöcke über alle Nachrichten hinweg verwendet werden.

Typischerweise wird dies erreicht, indem der anfängliche Counter Block-Wert in zwei verkettete Teile aufgeteilt wird:

  • Eine Nonce (d.h. eine Zahl, die nur einmal verwendet werden darf). Der Nonce-Teil des Blocks bleibt für jeden Block in der Nachricht gleich. Jedes Mal, wenn eine neue Nachricht verschlüsselt werden soll, wird eine neue Nonce gewählt. Nonces müssen nicht geheim gehalten werden, dürfen aber nicht mit demselben Schlüssel erneut verwendet werden.
  • Ein Zähler. Dieser Teil des Blocks wird jedes Mal inkrementiert, wenn ein Block verschlüsselt wird.

Im Wesentlichen: Die Nonce sollte sicherstellen, dass Counter Blocks nicht von einer Nachricht zur nächsten wiederverwendet werden, während der Zähler sicherstellen sollte, dass Counter Blocks innerhalb einer einzelnen Nachricht nicht wieder verwendet werden.

Hinweis: Weitere Informationen finden Sie in Anhang B des NIST SP800-38A Standards.

AES-CBC

Dies repräsentiert AES im Cipher Block Chaining Mode, wie in NIST SP800-38A spezifiziert.

AES-GCM

Dies repräsentiert AES im Galois/Counter Mode, wie in NIST SP800-38D spezifiziert.

Ein wesentlicher Unterschied zwischen diesem Modus und den anderen besteht darin, dass GCM ein "authentifizierter" Modus ist, was bedeutet, dass er Überprüfungen beinhaltet, dass der Chiffretext nicht von einem Angreifer verändert wurde.

Beispiele

Hinweis: Sie können die funktionierenden Beispiele auf GitHub ausprobieren.

RSA-OAEP

Dieser Code ruft den Inhalt eines Textfelds ab, kodiert ihn zur Verschlüsselung und verschlüsselt ihn mit RSA-OAEP. Siehe den vollständigen Code auf GitHub.

js
function getMessageEncoding() {
  const messageBox = document.querySelector(".rsa-oaep #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(publicKey) {
  let encoded = getMessageEncoding();
  return window.crypto.subtle.encrypt(
    {
      name: "RSA-OAEP",
    },
    publicKey,
    encoded,
  );
}

AES-CTR

Dieser Code ruft den Inhalt eines Textfelds ab, kodiert ihn zur Verschlüsselung und verschlüsselt ihn mit AES im CTR-Modus. Siehe den vollständigen Code auf GitHub.

js
function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-ctr #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // counter will be needed for decryption
  counter = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CTR",
      counter,
      length: 64,
    },
    key,
    encoded,
  );
}
js
let iv = window.crypto.getRandomValues(new Uint8Array(16));
let key = window.crypto.getRandomValues(new Uint8Array(16));
let data = new Uint8Array(12345);
// crypto functions are wrapped in promises so we have to use await and make sure the function that
// contains this code is an async function
// encrypt function wants a cryptokey object
const key_encoded = await window.crypto.subtle.importKey(
  "raw",
  key.buffer,
  "AES-CTR",
  false,
  ["encrypt", "decrypt"],
);
const encrypted_content = await window.crypto.subtle.encrypt(
  {
    name: "AES-CTR",
    counter: iv,
    length: 128,
  },
  key_encoded,
  data,
);

// Uint8Array
console.log(encrypted_content);

AES-CBC

Dieser Code ruft den Inhalt eines Textfelds ab, kodiert ihn zur Verschlüsselung und verschlüsselt ihn mit AES im CBC-Modus. Siehe den vollständigen Code auf GitHub.

js
function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-cbc #message");
  let message = messageBox.value;
  let enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  let encoded = getMessageEncoding();
  // iv will be needed for decryption
  iv = window.crypto.getRandomValues(new Uint8Array(16));
  return window.crypto.subtle.encrypt(
    {
      name: "AES-CBC",
      iv: iv,
    },
    key,
    encoded,
  );
}

AES-GCM

Dieser Code ruft den Inhalt eines Textfelds ab, kodiert ihn zur Verschlüsselung und verschlüsselt ihn mit AES im GCM-Modus. Siehe den vollständigen Code auf GitHub.

js
function getMessageEncoding() {
  const messageBox = document.querySelector(".aes-gcm #message");
  const message = messageBox.value;
  const enc = new TextEncoder();
  return enc.encode(message);
}

function encryptMessage(key) {
  const encoded = getMessageEncoding();
  // iv will be needed for decryption
  const iv = window.crypto.getRandomValues(new Uint8Array(12));
  return window.crypto.subtle.encrypt(
    { name: "AES-GCM", iv: iv },
    key,
    encoded,
  );
}

Spezifikationen

Specification
Web Cryptography API
# SubtleCrypto-method-encrypt

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch