Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung |
gf_informatik:verschluesselung:symmetrisch [2025-04-01 07:44] – [Verkettung ausprobieren] hof | gf_informatik:verschluesselung:symmetrisch [2025-04-01 11:46] (aktuell) – [Vorgehen] hof |
---|
* Statistische Methoden könnten die Entschlüsselung ermöglichen, weil jeder Buchstabe an derselben Block-Position gleich verschlüsselt wird. | * Statistische Methoden könnten die Entschlüsselung ermöglichen, weil jeder Buchstabe an derselben Block-Position gleich verschlüsselt wird. |
* Wiederkehrende Wörter, insbesondere am Anfang der Nachricht, fallen schnell auf. | * Wiederkehrende Wörter, insbesondere am Anfang der Nachricht, fallen schnell auf. |
* Die Enigma konnte im zweiten Weltkrieg auch deshalb geknackt werden, weil einige Wörter immer wieder auftauchten, z.B. `OBERKOMMANDODERWEHRMACHT` | * Die [[wpde>Enigma_(Maschine)#Kryptographische_Schwächen|Enigma]] konnte im zweiten Weltkrieg auch deshalb geknackt werden, weil einige Wörter immer wieder auftauchten, z.B. `OBERKOMMANDODERWEHRMACHT` |
* Ein Angreifer könnte einen verschlüsselten Block in eine Nachricht einfügen, ohne den genauen Klartext zu kennen. Damit könnte er die Nachricht verfälschen. | * Ein Angreifer könnte einen verschlüsselten Block in eine Nachricht einfügen, ohne den genauen Klartext zu kennen. Damit könnte er die Nachricht verfälschen. |
* Fällt dir ein Beispiel ein, wie dies ausgenützt werden könnte? | * Fällt dir ein Beispiel ein, wie dies ausgenützt werden könnte? |
import numpy as np | import numpy as np |
import math | import math |
| import random |
| |
def text_to_bytes(text): | def text_to_bytes(text): |
return xor(two, one) | return xor(two, one) |
| |
def encrypt(plain_bytes, key_bytes, chaining=True, initialization_vector='12345678'): | def encrypt(plain_bytes, key_bytes, chaining=True, block_size=8): |
block_size = len(initialization_vector) | # random initialization vector |
iv = text_to_bytes(initialization_vector) | iv = random.randbytes(block_size) |
| |
# ensure our key material is divisible by block_size | # ensure our key material is divisible by block_size |
return as_np | return as_np |
| |
# Play with different keys | # Play with different keys: |
key = "11110000011001101100010000110101110010111001100100010110000111110001100101000101101110111111000000000011000000111110010111101010111110001110101010101000001111001010110110100111000000000011111111010001111100110111101001111010000001011101010000101111110101001100010101001011011101110101011001110100100001101110110011000110100100111100010011001100100111000000000011011110000100010010001110101100111101010100111100010001010100101100111101101011100110110000000000101000000010100111110010000011101000111001100000101011110000000100110011000001000101001000011101000100100100100010100111110011101011010101010110001011010001001010000111000100100010111001111100011100001000011001100011100110101101111001000110001001111010111111100001111111111111011101100101111100000101000101100101011111111110001010111000101010110011011010111111101111110100000100100101001000100101100111100010101011111111001001101000011001101111000111111110101100001100110110000101100000000010111110001011011010010010000111010010011001101010010100000011101111110100101001111110011010000101001111001111000000010101111001000101100110010111101111001000010110111101000110110101000101110001001011100111110010111001011111111010000010011000011101100110111001001000110001110110011011000011001010001111000101100100001010110011000001011100001011010011010001110101010001111000000111111101110011000010010000111010111000111000110" | #key = "11110000011001101100010000110101110010111001100100010110000111110001100101000101101110111111000000000011000000111110010111101010111110001110101010101000001111001010110110100111000000000011111111010001111100110111101001111010000001011101010000101111110101001100010101001011011101110101011001110100100001101110110011000110100100111100010011001100100111000000000011011110000100010010001110101100111101010100111100010001010100101100111101101011100110110000000000101000000010100111110010000011101000111001100000101011110000000100110011000001000101001000011101000100100100100010100111110011101011010101010110001011010001001010000111000100100010111001111100011100001000011001100011100110101101111001000110001001111010111111100001111111111111011101100101111100000101000101100101011111111110001010111000101010110011011010111111101111110100000100100101001000100101100111100010101011111111001001101000011001101111000111111110101100001100110110000101100000000010111110001011011010010010000111010010011001101010010100000011101111110100101001111110011010000101001111001111000000010101111001000101100110010111101111001000010110111101000110110101000101110001001011100111110010111001011111111010000010011000011101100110111001001000110001110110011011000011001010001111000101100100001010110011000001011100001011010011010001110101010001111000000111111101110011000010010000111010111000111000110" |
key = "1111000001100110110001000011010111001011100110010001011000011111000110010100010110" | key = "1111000001100110110001000011010111001011100110010001011000011111000110010100010110" |
key_bytes = binary_to_bytes(key) | key_bytes = binary_to_bytes(key) |
key_bytes = text_to_bytes("ŘõménshÖRÑ") | #key_bytes = text_to_bytes("rõménshÖRÑ") |
key_bytes = text_to_bytes("ROMANSHORN") | key_bytes = text_to_bytes("ROMANSHORN") |
| |
# Change between ECB and CBC modes | # Change between ECB and CBC modes: |
chaining = False # False: ECB, True: CBC | chaining = False # False: ECB, True: CBC |
| |
img = cv.imread('penguin.png') # adapt path | img = cv.imread('penguin.png') |
img_bytes = img.tobytes() | img_bytes = img.tobytes() |
| |
img_encrypted = encrypt(img_bytes, key_bytes, chaining=chaining) | img_encrypted = encrypt(img_bytes, key_bytes, chaining=chaining) |
| |
# We drop the first block as it only used as initialization vector. | # We drop the first block as it's only used as initialization vector. |
cv.imshow("image", bytes_to_image(img_encrypted[8:], img.shape)) | cv.imshow("image", bytes_to_image(img_encrypted[8:], img.shape)) |
img_decrypted = decrypt(img_encrypted, key_bytes, chaining=chaining) | |
cv.waitKey() | cv.waitKey() |
| |
# Test if decryption works | # Test if decryption works |
| # img_decrypted = decrypt(img_encrypted, key_bytes, chaining=chaining) |
# cv.imshow("image", bytes_to_image(img_decrypted, img.shape)) | # cv.imshow("image", bytes_to_image(img_decrypted, img.shape)) |
# cv.waitKey() | # cv.waitKey() |