2017-12-23 5 views
4

Ich arbeite an einem Firmware-Update-Schema, das eine Ende-zu-Ende-Verschlüsselung eines Firmware-Images erfordert. Das Zielgerät ist ein Bluetooth Low Energy Chip mit Hardware-Unterstützung für die in Blueooth Spec, AES-CCM spezifizierte Kryptographie. Wir möchten diese Hardware nutzen, um die Codegröße und -geschwindigkeit zu minimieren. Daher müssen wir ein Firmware-Image in dem Format verschlüsseln, für das die Hardware gebaut wurde.Wie repliziere ich das CCM-Schema von Bluetooth in .NET?

Also, ich versuche, die NET AesManaged class zu verwenden, so dass ich die Datenbeispiele reproduzieren kann, die in der Bluetooth Spec (S. 1547) angegeben werden, aber ich bekomme nicht die gleichen Ausgaben. Hier sind die Beispieldaten:

Payload-Byte-Länge: 08
K: 89678967 89678967 45234523 45234523
Payload Zähler: 0000bc614e
Null-Länge ACL-U Fortsetzung: 0
Richtung: 0
Initialisierungsvektor aabbccdd 66778899
LT_ADDR: 1
Pakettyp: 3
LLID: 2
Nutzlast: 68696a6b 6c6d6e6f

B0: 494e61bc 0000ddcc bbaa9988 77.660.008
B1: 00190200 00000000 00000000 00000000
B2: 68696a6b 6c6d6e6f 00000000 00000000

Y0: 95ddc3d4 2c9a70f1 61a28ee2 c08271ab
Y1: 418635ff 54.615.443 8aceca41 fe274779
Y2: 08d78b32 9d78ed33 b285fc42 e178d781

T: 08d78b32

CTR0: 014e61bc 0000ddcc bbaa9988 77.660.000
CTR1: 014e61bc 0000ddcc bbaa9988 77660001

S0: b90f2b23 f63717d3 38e0559d 1e7e785e
S1: d8c7e3e1 02050abb 025d0895 17cbe5fb

MIC: b1d8a011
Verschlüsselte Nutzlast: b0ae898a 6e6864d4

Vorerst Ich würde mich freuen, wenn die Verschlüsselung ohne Authentifizierung funktioniert. Ich habe bemerkt, dass MIC und Encrypted Payload T und Payload mit S0 bzw. S1 XOR-verknüpft sind. Mein Ziel ist also einfach S0 zu generieren. Mein Verständnis ist, dass ich im Stande sein sollte, dies zu tun, indem Sie die CTR0 Array mit dem Schlüssel K ECB'ing:

//I've tried a few endian-ness permutations of K, none work 
byte[] sampleKey = { 0x23, 0x45, 0x23, 0x45, 0x23, 0x45, 0x23, 0x45, 
        0x67, 0x89, 0x67, 0x89, 0x67, 0x89, 0x67, 0x89}; 
byte[] sampleCtr0 = { 01, 0x4e, 0x61, 0xbc, 00, 00, 0xdd, 0xcc, 
        0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 00, 00 }; 
byte[] encrypted; 

using (AesManaged aesAlg = new AesManaged()) 
{ 
    aesAlg.Mode = CipherMode.ECB; //CTR implemented as ECB w/ manually-incrementing counter 

    // Create an encrytor to perform the stream transform. 
    ICryptoTransform encryptor = aesAlg.CreateEncryptor(sampleKey, zeros); //zeros is a byte array of 16 0's 

    // Create the streams used for encryption. 
    using (MemoryStream msEncrypt = new MemoryStream()) 
    { 
     using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
     { 
      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
      { 
       //Write all data to the stream. 
       swEncrypt.Write(sampleCtr0); 
      } 
      encrypted = msEncrypt.ToArray(); 
     } 
    } 
} 

Ich erwarte, dass in S0 sehen verschlüsselten, aber ich weiß nicht. Was ist los mit dir?

Antwort

1

Es stellte sich heraus, die Verwendung von StreamWriter war das Problem. Nachdem ich das entfernt und durch csEncrypt.Write() ersetzt habe, bekam ich meine erwartete Ausgabe.

Ich verstehe immer noch nicht wirklich meine Lösung, also war ich dabei, diese Frage zu bearbeiten, aber da das Thema wahrscheinlich nichts mit Kryptographie zu tun hat, denke ich, dass das besser als separate Frage behandelt werden würde. Alternativ, wenn jemand das Update erklären kann, werde ich die akzeptierte Antwort ändern.

Verwandte Themen