Problem bei der Dechiffrierung mit Matrixmultiplikation und ASCII Umwandlung?
Wenn ich in meinen Chiffrierungsprogramm meinen Text als Matrix mit dem Key multipliziere, bekomme ich meinen verschlüsselte matrix als zu große zahl zurück als dass ich sie zurück in ASCII umwandeln kann. Also benutze ich den Modulo 94+ 32.
Beispiel:
1. Input
Input Text: "Hallo Welt!
Input in ASCII Matrix umgewandelt:
[72, 97, 108, 108, 111]
[32, 87, 101, 108, 116]
[33, 33, 33, 10, 0 ]
2. Key
Key Text: "ABCDEFGHI"
Key in ASCII Matrix umgewandelt:
[83, 105, 103]
[109, 97, 32 ]
[66, 111, 121]
3. Output
Key * Input:
[12735, 20585, 22968, 21334, 21393]
[12008, 20068, 22625, 22568, 23351]
[12297, 20052, 22332, 20326, 20202]]
Output mod94 + 32 und in Liste umgewandelt:
[77, 125, 64, 122, 87, 102, 78, 97, 40, 71, 109, 62, 86, 54, 118]
Output in Text umgewandelt: M}@zWfNa(Gm>V6v
Da ich aber nun den Modulo 94 +32 angewandt habe um den Output als Text darzustellen, habe ich nicht mehr den originalen Output der Verschlüsselung und kann den Text deshalb nicht mehr dechiffrieren. Was kann ich anders machen?
1 Antwort
das Problem ist Dein Modulo!
Modulo ermittelt Rest einer ganzzahligen Division. das eigentliche Ergebnis der Division geht jedoch verloren.
9 % 10 = 9
19 % 10 = 9
aus dem Ergebnis "9" kann man jedoch nicht auf die Ursprünglichen Werte zurückführen.
Um binäre Daten reversibel ohne "Sonderzeichen" als String zu speichern oder darzustellen verwende Base64.
Zu Deinen Wertenwieso hat Dein Input 3 Ausrufezeichen und einen Zeilenvorschub? ...während dein String nur eines hat?
'Hallo Welt!' = [72,97,108,108,111,32,87,101,108,116,33]
und dein Key [83, 105, 103,109, 97, 32 ,66, 111, 121] ist "Sigma Boy" und nicht "ABCDEFGHI"
...na egal einen alten Trapper kann man nicht in die Flinte pissen😅
das gravierendste Problem an deiner Verschlüsselung durch Multiplikation ist das Du das Du die Ergebnisse irgendwie wieder in einen Bereich von 0..255 bringen musst ohne Verluste zu erleiden.
Modulo ist verlustbehaftet!
Statt de Multiplikation würde ich Dir XOR-Verknüpfung empfehlen:
72 ^ 65 = 9
9 ^ 65 = 72
Verknüpft man Byte Mit Byte bleibt auch das Ergebnis ein Byte.
Ich bin kein Pythonprogrammierer, deshalb eine keine Demo in Powershell:
$Input='Hallo Welt!'
$InputBytes=[Byte[]][Char[]]$Input
$InputBytes -join ','
''
# Passwort zu ByteArray
$PasswortBytes=[Byte[]][Char[]]'ABCDEFGHI'
$PasswortBytes
''
$BinaryResult=@() #leeres Array
$i=0;
#XOR des Strings reihum mit den Elementen von $PasswortBytes
foreach ($Byte in $InputBytes){
#modulo des fortlaufenden Index (implizit erhöht) mit der Anzahl der Zeichen im Passwort
$PWIndex=$i++ % $PasswortBytes.length;
#Bytes XOR-verknüpfen
$BinaryResult += $Byte -bxor $PasswortBytes[$PWIndex]
}
$BinaryResult
#convert zu Base64-String
$StringResult=[Convert]::ToBase64String($BinaryResult)
$StringResult
Write-Host Rolle Rueckwaerts -fo green
$DecodeBinary=[Convert]::FromBase64String($StringResult)
$DecodeBinary
''
$DecodeResult=@()
#XOR ist "Symetrisch" also einfach nochmal mit den PasswortBytes verknüpfen
$i=0;
foreach ($Byte in $DecodeBinary){
$PWIndex=$i++ % $PasswortBytes.length;
$DecodeResult += $Byte -bxor $PasswortBytes[$PWIndex]
}
$DecodeResult
''
[Char[]]$DecodeResult -join ''
Pause