SaQura Crypto API · REST · v1

SaQura Crypto API

Einführung

Die SaQura Crypto API ist eine gehostete REST-Schnittstelle für Post-Quanten-Kryptographie über HTTPS — ohne SDK, aus jeder Sprache nutzbar. Sie nutzt dieselbe SaQura-Engine (1.0.11) wie die SDKs.

  • Base URL: https://crypto.saqura.de
  • Algorithmen: AES-256-GCM, RSA-4096 (OAEP/PSS), PBKDF2-SHA512, PQC-KEM (FrodoKEM / Classic-McEliece / X25519+ML-KEM FIPS 203), PQC-Signaturen (ML-DSA FIPS 204 / SLH-DSA FIPS 205)
  • Datenschutz: Inhalte werden im Arbeitsspeicher verarbeitet, nicht gespeichert; Klartext/Schlüssel erscheinen weder in Antworten noch in Logs.

Fähigkeiten abfragen (ohne Key): GET /v1/capabilities · GET /health

curl https://crypto.saqura.de/v1/capabilities

Authentifizierung

Alle /v1-Krypto-Endpoints erfordern einen API-Key im Authorization-Header (Bearer, Stripe-Stil):

Authorization: Bearer sk_live_…
  • sk_live_… = Produktion, sk_test_… = Test.
  • Key beziehen über saqura.de/pricing (SaQura-Crypto-Abo).
  • Fehlender/ungültiger Key → 401. Tarif deckt Funktion nicht → 403.

Schnellstart

AES-256-GCM

# Encrypt (key optional — omit and the API returns a fresh key)
curl -X POST https://crypto.saqura.de/v1/aes/encrypt \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"plaintext":"hello"}'
# -> {"ciphertext":"…","key":"…"}

# Decrypt
curl -X POST https://crypto.saqura.de/v1/aes/decrypt \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"ciphertext":"…","key":"…"}'
# -> {"plaintext":"hello"}

Endpoints

Alle Pfade sind relativ zu https://crypto.saqura.de. JSON-Felder in camelCase.

Methode & PfadRequestResponseTarif
GET /v1/usage{plan, period, used, includedPerMonth, remaining, rateLimitPerMinute, overage}Alle
POST /v1/aes/encrypt{plaintext, key?}{ciphertext, key}Standard
POST /v1/aes/decrypt{ciphertext, key}{plaintext}Standard
POST /v1/password/hash{password}{hash}Basic
POST /v1/password/verify{password, hash}{valid}Basic
POST /v1/rsa/keypair{}{publicKey, privateKey}Basic
POST /v1/rsa/encrypt{plaintext, publicKey}{ciphertext}Basic
POST /v1/rsa/decrypt{ciphertext, privateKey}{plaintext}Basic
POST /v1/rsa/sign{data, privateKey}{signature}Basic
POST /v1/rsa/verify{data, signature, publicKey}{valid}Basic
POST /v1/quantum/keypair{strength?, generation?}{publicKey, privateKey, strength, generation}Pro
POST /v1/quantum/encrypt{plaintext, publicKey}{ciphertext, encapsulatedSecret}Pro
POST /v1/quantum/decrypt{ciphertext, privateKey, encapsulatedSecret}{plaintext}Pro
POST /v1/quantum/sign/keypair{strength?, algorithm?}{publicKey, privateKey, strength, algorithm}Pro
POST /v1/quantum/sign{data, privateKey, algorithm?}{signature}Pro
POST /v1/quantum/verify{data, signature, publicKey, algorithm?}{valid}Pro

Eigene Nutzung

GET /v1/usage gibt den Verbrauch des eigenen API-Keys im laufenden Monat zurück (Plan, genutzte Anfragen, Inklusivkontingent, Rest, Limit, Overage). Authentifiziert wie alle /v1-Endpoints, aber selbst NICHT abgerechnet — Sie sehen ausschließlich Ihre eigenen Werte.

# Your own usage for the current month (authenticated, NOT billed)
curl https://crypto.saqura.de/v1/usage \
  -H "Authorization: Bearer sk_live_…"
# -> {"plan":"Pro","period":"2026-06","used":1234,
#     "includedPerMonth":2000000,"remaining":1998766,
#     "rateLimitPerMinute":1200,"overage":{"requests":null,"per1000":1,"note":"…"}}

Post-Quanten (KEM + Signaturen)

KEM-Verschlüsselung (Pro+). Generationen: Gen4–7 (BSI-Profil) und Gen8 (X25519 + ML-KEM, FIPS 203). Entschlüsseln benötigt ciphertext UND encapsulatedSecret.

# 1) key pair  (Gen4 default; Gen8 = X25519 + ML-KEM / FIPS 203)
curl -X POST https://crypto.saqura.de/v1/quantum/keypair \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"strength":"Highest","generation":"Gen8"}'
# -> {"publicKey":"…","privateKey":"…","strength":"Highest","generation":"Gen8"}

# 2) encrypt to the public key
curl -X POST https://crypto.saqura.de/v1/quantum/encrypt \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"plaintext":"secret","publicKey":"…"}'
# -> {"ciphertext":"…","encapsulatedSecret":"…"}

# 3) decrypt  (needs both ciphertext and encapsulatedSecret)
curl -X POST https://crypto.saqura.de/v1/quantum/decrypt \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"ciphertext":"…","privateKey":"…","encapsulatedSecret":"…"}'
# -> {"plaintext":"secret"}

Signaturen (ML-DSA / SLH-DSA)

# ML-DSA (FIPS 204) — pass "SLH-DSA" for FIPS 205
curl -X POST https://crypto.saqura.de/v1/quantum/sign/keypair \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"strength":"Highest","algorithm":"ML-DSA"}'

curl -X POST https://crypto.saqura.de/v1/quantum/sign \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"data":"document","privateKey":"…","algorithm":"ML-DSA"}'
# -> {"signature":"…"}

curl -X POST https://crypto.saqura.de/v1/quantum/verify \
  -H "Authorization: Bearer sk_live_…" -H "Content-Type: application/json" \
  -d '{"data":"document","signature":"…","publicKey":"…","algorithm":"ML-DSA"}'
# -> {"valid":true}

Tarife & Kontingente

Funktionen werden pro Tarif freigeschaltet. Es gibt zwei Limits: ein Durchsatz-Limit pro Minute (pro API-Key, anonym pro IP) und — bei Monatstarifen — ein Inklusivkontingent pro Monat.

TarifFunktionenKontingent (Anf./Min.)Inkl./Monat
BasicRSA · Password30050.000
Standard+ AES600250.000
Pro+ Quantum (KEM · ML-DSA · SLH-DSA)12002 Mio.
Scale+ Quantum (hohes Volumen)600010 Mio.
Enterprisealle12000individuell
kein/ungültiger Key— (401)60

Bei Monatstarifen wird Nutzung über dem monatlichen Inklusivkontingent nutzungsbasiert abgerechnet: 1 € je 1.000 Anfragen (in der gewählten Währung entsprechend). Jahrestarife haben keine nutzungsbasierten Zusatzkosten. Werte sind Startkontingente und können angepasst werden.

Hinweis: Rechenintensive Schlüsselerzeugung (RSA-/Post-Quantum-Keypair, Passwort-Hashing) ist zusätzlich in der Gleichzeitigkeit begrenzt, damit der Dienst unter Last stabil bleibt. Bei Lastspitzen kann eine solche Anfrage daher auch innerhalb deines Minuten-Kontingents mit 429 (Header Retry-After) beantwortet werden — kurz warten und mit exponentiellem Backoff erneut versuchen.

Fehler

Fehler folgen dem Problem-Details-Format (RFC 7807):

  • 400ungültige Eingabe (z. B. "Invalid base64 input."). Payload wird nie zurückgespiegelt.
  • 401Key fehlt/ungültig.
  • 403Tarif deckt die Funktion nicht.
  • 429Kontingent überschritten (Header Retry-After).

Fragen? Kontaktformular. Niemals Schlüssel/Klartext in Tickets mitsenden.