Wie kann ich Bytes mit dem TPM-Modul eines Computers verschlüsseln?
CryptProtectData
Windows bietet eine (relativ) einfache API zum Verschlüsseln eines Blobs mit dem CryptProtectData
API, mit der wir eine benutzerfreundliche Funktion umschließen können:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//...
}
Die Details von ProtectBytes
sind weniger wichtig als die Idee, dass Sie es ganz einfach verwenden können:
- Hier sind die Bytes, die mit einem geheimen Schlüssel verschlüsselt werden sollen
System
- Gib mir den verschlüsselten Blob zurück
Der zurückgegebene Blob ist nicht dokumentiert Dokumentationsstruktur , die alles enthält, was zum Entschlüsseln und Zurückgeben der Originaldaten erforderlich ist (Hash-Algorithmus, Verschlüsselungsalgorithmus, Salt, HMAC-Signatur usw.).
Der Vollständigkeit halber ist hier die Beispiel-Pseudocode-Implementierung ProtectBytes
, die Crypt API
zum Schutz von Bytes verwendet:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//Setup our n-byte plaintext blob
DATA_BLOB dataIn;
dataIn.cbData = plaintext.Length;
dataIn.pbData = Addr(plaintext[0]);
DATA_BLOB dataOut;
//dataOut = EncryptedFormOf(dataIn)
BOOL bRes = CryptProtectData(
dataIn,
null, //data description (optional PWideChar)
null, //optional entropy (PDATA_BLOB)
null, //reserved
null, //prompt struct
CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE,
ref dataOut);
if (!bRes) then
{
DWORD le = GetLastError();
throw new Win32Error(le, "Error calling CryptProtectData");
}
//Copy ciphertext from dataOut blob into an actual array
bytes[] result;
SetLength(result, dataOut.cbData);
CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);
//When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}
Wie mache ich dasselbe mit dem TPM?
Der obige Code ist nur zum Verschlüsseln von Daten für den lokalen Computer nützlich. Die Daten werden mit dem System
Konto als Schlüsselgenerator verschlüsselt ( Details sind zwar interessant, aber unwichtig ). Das Endergebnis ist, dass ich Daten (z. B. einen Festplattenverschlüsselungs-Hauptschlüssel) verschlüsseln kann, die nur vom lokalen Computer entschlüsselt werden können.
Jetzt ist es Zeit, noch einen Schritt weiter zu gehen. Ich möchte einige Daten verschlüsseln (z. B. einen Hauptschlüssel für die Festplattenverschlüsselung), die nur vom lokalen TPM entschlüsselt werden können. Mit anderen Worten, ich möchte die TEE (Qualcomm Trusted Execution Environment ) im folgenden Blockdiagramm für Android durch das TPM in Windows ersetzen :
Hinweis : Mir ist klar, dass das TPM keine Datensignatur ausführt (oder wenn dies der Fall ist, garantiert es nicht, dass das Signieren derselben Daten jedes Mal dieselbe Binärausgabe liefert). Aus diesem Grund wäre ich bereit, "RSA-Signatur" durch "Verschlüsselung eines 256-Bit-Blobs mit einem hardwaregebundenen Schlüssel" zu ersetzen. .
Wo ist der Code?
Das Problem ist, dass die TPM-Programmierung auf MSDN vollständig undokumentiert ist . Es ist keine API verfügbar, um Vorgänge auszuführen. Stattdessen müssen Sie sich eine Kopie des Software Stack (auch bekannt als TSS) der Trusted Computing Group suchen , herausfinden, welche Befehle mit Nutzdaten in welcher Reihenfolge an das TPM gesendet werden sollen, und die Tbsip_Submit_Command- Funktion von Window aufrufen , um Befehle direkt zu senden:
TBS_RESULT Tbsip_Submit_Command(
_In_ TBS_HCONTEXT hContext,
_In_ TBS_COMMAND_LOCALITY Locality,
_In_ TBS_COMMAND_PRIORITY Priority,
_In_ const PCBYTE *pabCommand,
_In_ UINT32 cbCommand,
_Out_ PBYTE *pabResult,
_Inout_ UINT32 *pcbOutput
);
Windows verfügt über keine übergeordnete API zum Ausführen von Aktionen.
Dies ist das moralische Äquivalent zum Versuch, eine Textdatei zu erstellen, indem SATA-E / A-Befehle an Ihre Festplatte ausgegeben werden .
Warum nicht einfach Hosen benutzen?
Die Trusted Computing Group (TCG) hat eine eigene API definiert: TCB Software Stack (TSS) . Eine Implementierung dieser API wurde von einigen Personen erstellt und heißt TrouSerS . Ein Mann hat das Projekt dann auf Windows portiert .
Das Problem mit diesem Code ist, dass er nicht in die Windows-Welt portierbar ist. Sie können es beispielsweise nicht in Delphi oder in C # verwenden. Es benötigt:
- OpenSSL
- pThread
Ich möchte nur, dass der Code etwas mit meinem TPM verschlüsselt.
Das Obige CryptProtectData
erfordert nichts anderes als das, was sich im Funktionskörper befindet.
Was ist der entsprechende Code zum Verschlüsseln von Daten mit dem TPM? Wie andere angemerkt haben, müssen Sie wahrscheinlich die drei TPM-Handbücher konsultieren und die Blobs selbst erstellen . Es handelt sich wahrscheinlich um den TPM_seal
Befehl. Obwohl ich denke , dass ich Daten nicht versiegeln möchte , denke ich, dass ich sie binden möchte :
Bindung - verschlüsselt Daten mit dem TPM-Bindeschlüssel, einem eindeutigen RSA-Schlüssel, der von einem Speicherschlüssel abstammt. Versiegeln - verschlüsselt Daten auf ähnliche Weise wie das Binden, gibt jedoch zusätzlich einen Zustand an, in dem sich TPM befinden muss, damit die Daten entschlüsselt (entsiegelt) werden können.
Ich versuche, die drei erforderlichen Bände zu lesen, um die 20 benötigten Codezeilen zu finden:
Aber ich habe keine Ahnung, was ich lese. Wenn es irgendeine Art von Tutorial oder Beispielen gäbe, könnte ich eine Chance haben. Aber ich bin völlig verloren.
Also fragen wir Stackoverflow
Auf die gleiche Weise konnte ich Folgendes bereitstellen:
Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
//...
CryptProtectData(...);
//...
}
kann jemand das entsprechende Äquivalent liefern:
Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
//...
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
//...snip...
Tbsip_Submit_Command(...);
//...
}
das macht das gleiche, außer dass ein in System
LSA gesperrter Schlüssel im TPM gesperrt ist?
Beginn der Forschung
Ich weiß nicht genau, was Binden bedeutet. Wenn man sich jedoch TPM Main - Teil 3 Befehle - Spezifikation Version 1.2 ansieht, wird bind erwähnt :
10.3 TPM_UnBind
TPM_UnBind nimmt den Daten-Blob, der das Ergebnis eines Tspi_Data_Bind-Befehls ist, und entschlüsselt ihn für den Export an den Benutzer. Der Anrufer muss die Verwendung des Schlüssels autorisieren, der den eingehenden Blob entschlüsselt. TPM_UnBind arbeitet blockweise und hat keine Ahnung von einer Beziehung zwischen einem Block und einem anderen.
Was verwirrend ist, ist, dass es keinen Tspi_Data_Bind
Befehl gibt.
Forschungsaufwand
Es ist schrecklich, wie niemand sich jemals die Mühe gemacht hat, das TPM oder seinen Betrieb zu dokumentieren. Es ist, als hätten sie ihre ganze Zeit damit verbracht, sich dieses coole Ding auszudenken , mit dem sie spielen wollten, wollten sich aber nicht mit dem schmerzhaften Schritt befassen, es für etwas nutzbar zu machen.
Beginnend mit dem (jetzt) kostenlosen Buch Ein praktischer Leitfaden für TPM 2.0: Verwenden des Trusted Platform-Moduls im neuen Zeitalter der Sicherheit :
Kapitel 3 - Kurzanleitung zu TPM 2.0
Das TPM hat Zugriff auf einen selbst generierten privaten Schlüssel, sodass es Schlüssel mit einem öffentlichen Schlüssel verschlüsseln und den resultierenden Blob dann auf der Festplatte speichern kann. Auf diese Weise kann das TPM eine praktisch unbegrenzte Anzahl von Schlüsseln zur Verwendung bereithalten, ohne jedoch wertvollen internen Speicher zu verschwenden. Auf der Festplatte gespeicherte Schlüssel können gelöscht, aber auch gesichert werden, was den Designern als akzeptabler Kompromiss erschien.
Wie kann ich einen Schlüssel mit dem öffentlichen Schlüssel des TPM verschlüsseln?
Kapitel 4 - Bestehende Anwendungen, die TPMs verwenden
Anwendungen, die das TPM verwenden sollten, dies aber nicht tun
In den letzten Jahren hat die Anzahl der webbasierten Anwendungen zugenommen. Dazu gehören webbasierte Sicherung und Speicherung. Eine große Anzahl von Unternehmen bietet inzwischen solche Dienste an. Soweit uns bekannt ist, lässt jedoch keiner der Clients für diese Dienste den Benutzer den Schlüssel für den Sicherungsdienst für ein TPM sperren. In diesem Fall wäre es sicherlich schön, wenn der TPM-Schlüssel selbst durch Duplizieren auf mehreren Computern gesichert würde. Dies scheint eine Chance für Entwickler zu sein.
Wie sperrt ein Entwickler einen Schlüssel für das TPM?
Kapitel 9 - Erben
GEBRAUCHSFALL: SPEICHERPASSWÖRTER SPEICHERN
In einer typischen Kennwortdatei werden gesalzene Kennwort-Hashes gespeichert. Die Überprüfung besteht darin, ein angegebenes Kennwort zu salzen, zu hashen und mit dem gespeicherten Wert zu vergleichen. Da die Berechnung kein Geheimnis enthält, wird die Kennwortdatei offline angegriffen.
In diesem Anwendungsfall wird ein TPM-generierter HMAC-Schlüssel verwendet. In der Kennwortdatei wird ein HMAC des gesalzenen Kennworts gespeichert. Die Überprüfung besteht darin, das angegebene Passwort zu salzen und zu HMACen und es mit dem gespeicherten Wert zu vergleichen. Da ein Offline-Angreifer nicht über den HMAC-Schlüssel verfügt, kann der Angreifer durch Ausführen der Berechnung keinen Angriff starten.
Das könnte funktionieren. Wenn das TPM einen geheimen HMAC-Schlüssel hat und nur mein TPM den HMAC-Schlüssel kennt, könnte ich "Sign (auch bekannt als TPM-Verschlüsselung mit privatem Schlüssel)" durch "HMAC" ersetzen. Aber dann kehrt er sich in der nächsten Zeile komplett um:
TPM2_Create, Angabe eines HMAC-Schlüssels
Es ist kein TPM-Geheimnis, wenn ich den HMAC-Schlüssel angeben muss. Die Tatsache, dass der HMAC-Schlüssel nicht geheim ist, ist sinnvoll, wenn Sie feststellen, dass dies das Kapitel über kryptografische Dienstprogramme ist, das das TPM bereitstellt. Anstatt SHA2, AES, HMAC oder RSA selbst schreiben zu müssen, können Sie das, was das TPM bereits herumliegen hat, wiederverwenden.
Kapitel 10 - Tasten
Als Sicherheitsgerät ist die Fähigkeit einer Anwendung, Schlüssel zu verwenden und sie gleichzeitig in einem Hardwaregerät zu schützen, die größte Stärke des TPM. Das TPM kann extern generierte Schlüssel sowohl generieren als auch importieren. Es unterstützt sowohl asymmetrische als auch symmetrische Tasten.
Ausgezeichnet! Wie machst du das!?
Schlüsselgenerator
Die wohl größte Stärke des TPM ist seine Fähigkeit, einen kryptografischen Schlüssel zu generieren und sein Geheimnis innerhalb einer Hardwaregrenze zu schützen. Der Schlüsselgenerator basiert auf dem TPM-eigenen Zufallszahlengenerator und ist nicht auf externe Zufallsquellen angewiesen. Dadurch werden Schwachstellen aufgrund schwacher Software mit unzureichender Entropiequelle beseitigt.
Kann das TPM kryptografische Schlüssel generieren und seine Geheimnisse innerhalb einer Hardwaregrenze schützen? Ist so, wie?
Kapitel 12 - Plattformkonfigurationsregister
PCRs zur Autorisierung
GEBRAUCHSFALL: VERSIEGELN EINES SCHLÜSSELSCHEIBENSCHLÜSSELS FÜR DEN PLATTFORMZUSTAND
Verschlüsselungsanwendungen auf der gesamten Festplatte sind weitaus sicherer, wenn ein TPM den Verschlüsselungsschlüssel schützt, als wenn er auf derselben Festplatte gespeichert ist und nur durch ein Kennwort geschützt ist. Erstens verfügt die TPM-Hardware über einen Anti-Hammering-Schutz (eine detaillierte Beschreibung des TPM-Wörterbuch-Angriffsschutzes finden Sie in Kapitel 8), wodurch ein Brute-Force-Angriff auf das Kennwort unpraktisch wird. Ein Schlüssel, der nur durch Software geschützt ist, ist weitaus anfälliger für ein schwaches Passwort. Zweitens ist ein auf der Festplatte gespeicherter Softwareschlüssel viel einfacher zu stehlen. Nehmen Sie die Festplatte (oder ein Backup der Festplatte) und Sie erhalten den Schlüssel. Wenn ein TPM den Schlüssel enthält, muss die gesamte Plattform oder zumindest die Festplatte und das Motherboard gestohlen werden.
Durch das Versiegeln kann der Schlüssel nicht nur durch ein Passwort, sondern auch durch eine Richtlinie geschützt werden. Eine typische Richtlinie sperrt den Schlüssel für PCR-Werte (den Softwarestatus), die zum Zeitpunkt des Versiegelns aktuell sind. Dies setzt voraus, dass der Status beim ersten Start nicht beeinträchtigt wird. Jegliche vorinstallierte Malware, die beim ersten Start vorhanden ist, wird in den PCRs gemessen, und somit wird der Schlüssel für einen gefährdeten Softwarestatus versiegelt. Ein weniger vertrauenswürdiges Unternehmen verfügt möglicherweise über ein Standard-Disk-Image und ein Siegel für PCRs, die dieses Image darstellen. Diese PCR-Werte würden auf einer vermutlich vertrauenswürdigeren Plattform vorberechnet. Ein noch anspruchsvolleres Unternehmen würde TPM2_PolicyAuthorize verwenden und mehrere Tickets bereitstellen, die eine Reihe vertrauenswürdiger PCR-Werte autorisieren. In Kapitel 14 finden Sie eine detaillierte Beschreibung der Richtlinienautorisierung und ihrer Anwendung zur Lösung des PCR-Sprödigkeitsproblems.
Obwohl ein Passwort auch den Schlüssel schützen könnte, gibt es auch ohne ein TPM-Schlüsselpasswort einen Sicherheitsgewinn. Ein Angreifer konnte die Plattform ohne Angabe eines TPMkey-Kennworts starten, sich jedoch nicht ohne den Benutzernamen und das Kennwort des Betriebssystems anmelden. Die OSsecurity schützt die Daten. Der Angreifer kann ein alternatives Betriebssystem starten, z. B. von einer Live-DVD oder einem USB-Stick anstatt von der Festplatte, um die Anmeldesicherheit des Betriebssystems zu umgehen. Diese unterschiedliche Startkonfiguration und Software würde jedoch die PCR-Werte ändern. Da diese neuen PCRs nicht mit den versiegelten Werten übereinstimmen würden, würde das TPM den Entschlüsselungsschlüssel nicht freigeben und die Festplatte könnte nicht entschlüsselt werden.
Ausgezeichnet! Dies ist genau der Anwendungsfall, den ich zufällig möchte. Dies ist auch der Anwendungsfall, für den Microsoft das TPM verwendet. Wie mache ich es!?
Also habe ich das ganze Buch gelesen und es hat nichts Nützliches geliefert. Das ist ziemlich beeindruckend, weil es 375 Seiten umfasst. Sie fragen sich, was das Buch enthielt - und wenn ich zurückblicke, habe ich keine Ahnung.
Deshalb geben wir die endgültige Anleitung zur Programmierung des TPM auf und wenden uns stattdessen einer Dokumentation von Microsoft zu:
Aus dem Microsoft TPM Platform Crypto-Provider Toolkit . Es wird genau erwähnt, was ich tun möchte:
Der Endorsement Key oder EK
Der EK wurde entwickelt, um eine zuverlässige kryptografische Kennung für die Plattform bereitzustellen. Ein Unternehmen verwaltet möglicherweise eine Datenbank der Endorsement Keys, die zu den TPMs aller PCs in seinem Unternehmen gehören, oder ein Rechenzentrums-Fabric-Controller verfügt möglicherweise über eine Datenbank der TPMs in allen Blades. Unter Windows können Sie den im Abschnitt „Platform Crypto Provider in Windows 8“ beschriebenen NCrypt-Anbieter verwenden, um den öffentlichen Teil des EK zu lesen.
Irgendwo im TPM befindet sich ein privater RSA-Schlüssel. Dieser Schlüssel ist dort eingesperrt - von der Außenwelt nie zu sehen. Ich möchte, dass das TPM etwas mit seinem privaten Schlüssel signiert (dh es mit seinem privaten Schlüssel verschlüsselt).
Ich möchte also die grundlegendste Operation, die es möglicherweise geben kann:
Verschlüsseln Sie etwas mit Ihrem privaten Schlüssel. Ich frage (noch) nicht einmal nach den komplizierteren Sachen:
- "Versiegeln" basierend auf dem PCR-Zustand
- Erstellen eines Schlüssels und Speichern in einem flüchtigen oder nichtflüchtigen Speicher
- Erstellen eines symmetrischen Schlüssels und Versuch, ihn in das TPM zu laden
Ich frage nach der grundlegendsten Operation, die ein TPM ausführen kann. Warum ist es unmöglich, Informationen darüber zu erhalten?
Ich kann zufällige Daten bekommen
Ich schätze, ich war glitschig, als ich sagte, dass die RSA-Signierung das grundlegendste ist, was das TPM tun kann. Die meisten grundlegende Sache , die TPM gefragt werden kann , tun , ist mir zufälliges Bytes geben. Dass ich herausgefunden habe, wie es geht:
public Byte[] GetRandomBytesTPM(int desiredBytes)
{
//The maximum random number size is limited to 4,096 bytes per call
Byte[] result = new Byte[desiredBytes];
BCRYPT_ALG_HANDLE hAlgorithm;
BCryptOpenAlgorithmProvider(
out hAlgorithm,
BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG"
MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" i.e. the TPM
0 //Flags
);
try
{
BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0);
}
finally
{
BCryptCloseAlgorithmProvider(hAlgorithm);
}
return result;
}
Die schicke Sache
Mir ist klar, dass die Anzahl der Personen, die das TPM verwenden, sehr gering ist. Deshalb hat niemand auf Stackoverflow eine Antwort. Ich kann also nicht zu gierig werden, um eine Lösung für mein gemeinsames Problem zu finden. Aber das, was ich wirklich tun möchte, ist, einige Daten zu "versiegeln" :
- Präsentieren Sie dem TPM einige Daten (z. B. 32 Byte Schlüsselmaterial).
- Lassen Sie das TPM die Daten verschlüsseln und geben Sie eine undurchsichtige Blob-Struktur zurück
- Bitten Sie später das TPM, den Blob zu entschlüsseln
- Die Entschlüsselung funktioniert nur, wenn die PCR-Register des TPM dieselben sind wie während der Verschlüsselung.
Mit anderen Worten:
Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
//...
}
Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
//...
}
Kryptographie Next Gen (Cng, auch bekannt als BCrypt) unterstützt TPM
Die ursprüngliche Kryptographie-API in Windows wurde als Krypto-API bezeichnet.
Ab Windows Vista wurde die Crypto-API durch die Cryptography-API: Next Generation (intern als BestCrypt , abgekürzt als BCrypt , nicht zu verwechseln mit dem Kennwort-Hashing-Algorithmus ) ersetzt.
Windows wird mit zwei BCrypt- Anbietern ausgeliefert :
- Microsoft Primitive Provider (
MS_PRIMITIVE_PROVIDER
) Standard : Standard-Software-Implementierung aller Grundelemente (Hashing, symmetrische Verschlüsselung, digitale Signaturen usw.) - Microsoft Platform Crypto Provider (
MS_PLATFORM_CRYPTO_PROVIDER
): Anbieter, der TPM-Zugriff bietet
Der Platform Crypto- Anbieter ist nicht auf MSDN dokumentiert, verfügt jedoch über Dokumentation von einer Microsoft Research-Website 2012:
TPM Platform Crypto-Provider Toolkit
Der TPM Platform Crypto Provider und das Toolkit enthalten Beispielcode, Dienstprogramme und Dokumentation für die Verwendung von TPM-bezogenen Funktionen in Windows 8. Zu den beschriebenen Subsystemen gehören der TPM-gestützte Crypto-Next-Gen (CNG) -Plattform-Crypto-Provider und die Anbieter von Attestierungsdiensten kann die neuen Windows-Funktionen verwenden. Es werden sowohl TPM1.2- als auch TPM2.0-basierte Systeme unterstützt.
Es scheint, dass Microsoft beabsichtigt, die TPM-Kryptofunktionalität mit dem Microsoft Platform Crypto Provider der Cryptography NG API zu erweitern.
Verschlüsselung mit öffentlichem Schlüssel mit Microsoft BCrypt
Vorausgesetzt, dass:
- Ich möchte eine asymmetrische RSA-Verschlüsselung durchführen (mit dem TPM).
- Microsoft BestCrypt unterstützt die asymmetrische RSA-Verschlüsselung
- Microsoft BestCrypt verfügt über einen TPM-Anbieter
Ein Weg in die Zukunft könnte darin bestehen, herauszufinden, wie das digitale Signieren mithilfe der Microsoft Cryptography Next Gen-API durchgeführt wird .
Mein nächster Schritt wird darin bestehen, den Code für die Verschlüsselung in BCrypt mit einem öffentlichen RSA-Schlüssel unter Verwendung des Standardanbieters ( MS_PRIMITIVE_PROVIDER
) zu erstellen . Z.B:
modulus
: 0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 4F 40 9F D2 D1 69 FB 995D 85 0C 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 DE 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55publicExponent
: 65537
Wenn dieser Code funktioniert, kann ich möglicherweise zur Verwendung des TPM-Anbieters ( MS_PLATFORM_CRYPTO_PROVIDER
) wechseln .
22.02.2016: Und da Apple gezwungen ist, beim Entschlüsseln von Benutzerdaten zu helfen, besteht erneut Interesse daran, wie das TPM die einfachste Aufgabe ausführen kann, für die es erfunden wurde - etwas zu verschlüsseln.
Es ist ungefähr gleichbedeutend mit jedem, der ein Auto besitzt, aber niemand weiß, wie man eines startet. Es kann wirklich nützliche und coole Dinge tun, wenn wir nur Schritt 1 überwinden könnten .