[[oktatas:programozás:algoritmusok|< Algoritmusok]] ====== AES ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Szerkesztve: 2014, 2020 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Az AES algoritmusról ===== Advanced Encryption Standard Az AES szimmetrikus kulcsú titkosítás. A U.S. National Institute of Standards and Technology által meghirdetett versenyre beküldött eljárás, 2001-ben. A blokkméret szigorúan 128 bit, a kulcs pedig 128, 192, vagy 256 bit. A titkosítás során a használt ciklusok: * 10 ciklus 128 bites kulcs esetén * 12 ciklus 192 bites kulcs esetén * 14 ciklus 256 bites kulcs esetén ===== Lépések ===== A következő lépések keverve kerülnek alkalmazásra: * AddRoundKey - minden bájton bitenkénti XOR művelet * SubBytes - minden bájt helyettesítése egy helyettesítési tábla egy értékére * ShiftRows - soronként különböző mértékkel eltolás * MixColumns - minden oszlopot invertálható lineáris transzformáció szerint változtatunk ===== Lépések ===== - kulcs előállítása - Rijndael-féle módszer - előkészítés - AddRoundKey - több ciklusban - SubBytes - ShiftRows - Mixcolumns - AddRoundKey - befejezés - SubBytes - ShiftRows - AddRoundKey ===== Oszlopkeverés Perl nyelven ===== #!/usr/bin/perl my @bOszlop = (); my @aOszlop = (0xd4, 0xbf, 0x5d, 0x30); @bOszlop[0] = &szoroz(0x2, @aOszlop[0]) ^ &szoroz(0x3, @aOszlop[1]) ^ &szoroz(0x1, @aOszlop[2]) ^ &szoroz(0x1, @aOszlop[3]); @bOszlop[1] = &szoroz(0x1, @aOszlop[0]) ^ &szoroz(0x2, @aOszlop[1]) ^ &szoroz(0x3, @aOszlop[2]) ^ &szoroz(0x1, @aOszlop[3]); @bOszlop[2] = &szoroz(0x1, @aOszlop[0]) ^ &szoroz(0x1, @aOszlop[1]) ^ &szoroz(0x2, @aOszlop[2]) ^ &szoroz(0x3, @aOszlop[3]); @bOszlop[3] = &szoroz(0x3, @aOszlop[0]) ^ &szoroz(0x1, @aOszlop[1]) ^ &szoroz(0x1, @aOszlop[2]) ^ &szoroz(0x2, @aOszlop[3]); foreach $hexSzam (@bOszlop) { printf("%02x\n", $hexSzam); } sub szoroz { $matrixElement = @_[0]; $szam = @_[1]; if($matrixElement eq 1) { return $szam; }elsif($matrixElement eq 2) { my $eltoltSzam = $szam << 1; if($eltoltSzam> 0xff) { $eltoltSzam = $eltoltSzam ^ 0x11b; } return $eltoltSzam; }elsif($matrixElement eq 3) { my $eltoltSzam = $szam << 1; if($eltoltSzam > 0xff) { $eltoltSzam = $eltoltSzam ^ 0x11b; } return $eltoltSzam ^ $szam; }else { print("Hiba! Rossz szorzó!\n"); } }