0 Daumen
271 Aufrufe

Aufgabe zum Thema CBC-MAC:

Wir untesuchen die Variante des CBC-MACs, wo al Etikett nicht nur der letzte Block der CBC-Verschlüsselung (wie üblich mit Initialisierungsvektor o^l) sondern alle Blöcke ausgegeben werden. Wir beschränken den MAC auf 2 Blöcke, d.h., es können nur Nachrichten etikettiert werden, die aus genau 2 Blöcken bestehen. Sie hätten gerne ein Etikett zur Nachricht m=m1m2. Geben Sie ein solches an, wenn Sie sich zu allen Nachrichten Etiketten berechnen lassen können, ausser zu m. (Hinweis: Lassen Sie sich zunächst ein Etikett zu m1m2 mit einer beliebigen Nachricht m2!=m2 berechnen.)

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

CBC-MAC Etikettierung für eine Nachricht \( m = m_1 m_2 \):

CBC-MAC (Cipher Block Chaining Message Authentication Code) ist ein Verfahren zur Erstellung einer kryptographischen Prüfsumme (MAC) für Nachrichten. Normalerweise wird nur der letzte Block der Verschlüsselung als Etikett ausgegeben. In dieser Variante jedoch werden alle Blöcke ausgegeben. Hier ist eine genaue Anleitung zur Erstellung eines Etiketts für eine konkrete Nachricht \( m = m_1 m_2 \), wenn ein Etikett für diese spezielle Nachricht nicht berechnet werden kann.

Vorgehensweise

1. Definition der Nachricht und Blöcke:
- Nehmen wir die Nachricht \( m = m_1 m_2 \) an, für die wir das Etikett berechnen wollen.
- \( m_1 \) und \( m_2 \) sind die Blöcke der Nachricht \( m \).

2. Initialisierungsvektor (IV):
- Verwenden wir den Initialisierungsvektor \( IV = 0^l \), wobei \( l \) die Blocklänge in Bits ist.

3. Auswahl einer alternativen Nachricht:
- Wählen Sie eine alternative Nachricht \( m^* = m_1 m_2^* \) aus, wobei \( m_2^* \neq m_2 \).

4. CBC-Verschlüsselung für die alternative Nachricht \( m^* \):
- Um das Etikett der Nachricht \( m^* \) zu erhalten, führen Sie die CBC-Verschlüsselung für \( m^* \) aus. Lassen Sie uns die Details dieser Verschlüsselung durchgehen:

Berechnung der CBC-Verschlüsselung

Angenommen, \( E_k \) sei der Blockchiffre-Verschlüsselungsalgorithmus mit dem Schlüssel \( k \).

Für die Nachricht \( m = m_1 m_2 \) sieht der CBC-MAC Prozess wie folgt aus:

1. Erster Block:
\( C_1 = E_k(m_1 \oplus IV) \)
Da \( IV = 0^l \):
\( C_1 = E_k(m_1) \)

2. Zweiter Block:
\( C_2 = E_k(m_2 \oplus C_1) \)

Nun führen wir diese Berechnung für die alternative Nachricht \( m^* = m_1 m_2^* \) durch:

1. Erster Block:
\( C_1^* = E_k(m_1) \)

2. Zweiter Block:
\( C_2^* = E_k(m_2^* \oplus C_1^*) \)

Etikett-Erstellung

Da wir das Etikett für die Nachricht \( m = m_1 m_2 \) nicht direkt berechnen können, verwenden wir das Etikett der Nachricht \( m^* = m_1 m_2^* \):

Das Etikett für \( m^* = m_1 m_2^* \) ist:
\( \text{Etikett} = (C_1^*, C_2^*) \)

Dieses Etikett verwenden wir als Grundlage für die Identifikation der Nachricht \( m = m_1 m_2 \):
\( \text{Etikett}(m = m_1 m_2) = (C_1^*, C_2^*) \)

Dabei sind \( C_1^* \) und \( C_2^* \) die CBC-MAC Ausgabenblöcke für \( m_1 \) und \( m_2^* \), die wir berechnen können.

Python Code zur Veranschaulichung

Hier ist ein Python-Skript, das die oben beschriebenen Schritte umsetzt:

python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

def cbc_mac(message, key):
    cipher = AES.new(key, AES.MODE_ECB)
    iv = b'\x00' * AES.block_size
    prev_block = iv
    mac = b''
    
    for i in range(0, len(message), AES.block_size):
        block = message[i:i+AES.block_size]
        block = bytes([_a ^ _b for _a, _b in zip(block, prev_block)])
        encrypted_block = cipher.encrypt(block)
        mac += encrypted_block
        prev_block = encrypted_block
    
    return mac

# Example usage
key = b'Sixteen byte key'
m1 = b'block1______'  # Placeholder for m1 (16 bytes)
m2 = b'block2______'  # Placeholder for m2 (16 bytes)
m2_star = b'block2_alt__'  # Placeholder for m2* (alternative block)

message_star = pad(m1 + m2_star, AES.block_size)
etag_star = cbc_mac(message_star, key)

print("Etikett für m1 || m2*:", etag_star)


Zusammenfassung

Für die spezielle Nachricht \( m = m_1 m_2 \) berechnen wir das Etikett einer alternativen Nachricht \( m^* = m_1 m_2^* \) und verwenden dieses statt des eigentlichen Etiketts von \( m = m_1 m_2 \), das wir nicht direkt berechnen können. Das Python-Skript zeigt, wie diese Berechnung praktisch umgesetzt werden kann.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community