IDEA -salausalgoritmin laitteistosynteesi . IDEA on symmetrinen lohkotietojen salausalgoritmi . _ Vuodelle 2019 IDEA on luotettava salausalgoritmi onnistuneiden lineaaristen kryptanalyyttisten hyökkäysten puutteen vuoksi . Sen käyttö kriittisissä sovelluksissa, kuten armeijassa, tai käyttö PGP -salausohjelmistopaketissa edellyttää tehokasta, erittäin turvallista ja oikeaa laitteistototeutusta.
B. Schneier [1] ja A. Tanenbaum [2] pitävät IDEA:ta yhtenä turvallisimmista saatavilla olevista salausalgoritmeista. Itse asiassa IDEA:a vastaan ei ole onnistuneita lineaarisia kryptanalyyttisiä hyökkäyksiä, eikä IDEA:ssa ole muita tunnettuja algebrallisia heikkouksia kuin J Daemenin [3] löytämät . Yoan Dimen suoritti hyökkäyksen käyttämällä 251 heikkoa avainta salauksen aikana, mikä helpotti avaimen löytämistä ja palauttamista. Koska mahdollisia avaimia on kuitenkin suuri määrä, tämä tulos ei vaikuta toimitetun salauksen salauksen käytännön turvallisuuteen.
Tämän salausalgoritmin laitteistototeutus on ollut aktiivisen kehittämisen alue.
Alla on yleisimmät toteutukset:
Esitteli FPGA-ytimen toteutuksen IDEA:lle [4] . He käyttivät yhden ytimen moduulia sisältävää järjestelmää IDEA:n toteuttamiseen, mikä tehtiin Xilinx FPGA :lla .
IDEA:n korkean suorituskyvyn toteutusta tutkittiin käyttäen sekä rinnakkais- että sarjaarkkitehtuuria [6] . He käyttivät Xilinx Virtex XCV300-6- ja XCV1000-6 FPGA:ita suorituskyvyn arviointiin ja analysointiin.
Viite [7] esitti SRC-6E:n ja HC-36:n yleiskäyttöisten tietokoneiden IDEA-toteutuksen vertailun.
Seuraava toteutus on Ali E. Abdallahin ja Issam W. Damajin työtä [8] .
Selvennys: stream on menetelmä arvojen peräkkäiseen välittämiseen. Se tarkoittaa viestisarjaa kanavassa, ja jokainen viesti edustaa eri arvoa. Olettaen, että virta on päättynyt, viimeisen arvon lähettämisen jälkeen raportoidaan lähetyksen loppu (EOT).
Ajattele IDEA -algoritmia kolmena päälohkona. Näiden lohkojen yleinen näkymä näyttäisi salauksen (tai salauksen purkamisen) lohkona, jossa on 2 tuloa, yksityinen avain ja selväteksti (tai salateksti) ja salateksti (tai pelkkä teksti) -lähtö. Kaksi jäljellä olevaa lohkoa ovat salaus- ja salauksenpurkuosien luonti. Salausalaosastojen luomisen tapauksessa lohko hyväksyy yksityiset avaimet saapuvat ja tulostavat halutut alaosastot. Decryptionsubkeys -generaattori ruiskuttaa luodut salauksen aliavaimia ja tulostaa salauksenpurkuavaimet. Määrittelemme joitain tyyppejä, joita käytetään seuraavassa määrittelyssä (Seuraava koodi on kirjoitettu HDL :llä ):
tyyppi Yksityinen = [ Bool ] tyyppi SubKey = Int tyyppi Plaintext = [ Int ] tyyppi Salausteksti = [ Int ] modVal = 65536• Bittikohtainen XOR
• 16-bittisten kokonaislukujen lisääminen modulo 65536 ( )
• Kerro 16-bittiset kokonaisluvut modulo 65537 ( ), jossa koko syötettyjen nollien lohkoa käsitellään muodossa .
52 16-bittistä aliavainta luodaan 128-bittisestä salausavaimesta. Luontialgoritmi on seuraava:
• Ensimmäiset kahdeksan aliavainta valitaan suoraan avaimesta jakamalla avain (128-bittinen luettelo) kahdeksaan samanpituiseen segmenttiin (16-bittinen).
• Käytetään 25-bittisten paikkojen ympyräsiirtoa. edellisen vaiheen avaimeen ja sitten puretaan kahdeksan aliavainta.
• Tätä toimenpidettä toistetaan, kunnes kaikki 52 aliavainta on luotu, eli 8 kertaa ja 4 omistettua avainta viimeisessä vaiheessa.
Seuraavassa määrittelyssä aliavaimien luominen on generEncSubKeys -toiminto, joka ottaa salausavaimen syötteenä ja tulostaa luettelon 52 16-bittisestä aliavaimesta. Se luo vastaavat aliavaimet kullekin vuorolle generoSubKeys-funktion avulla. Luodut avaimet yhdistetään sitten yhdeksi luetteloksi. Tämän jälkeen 52 aliavainta poimitaan luettelosta ja muunnetaan kokonaisluvuiksi, jotka vastaavat kutakin aliavainta edustavaa 16 elementin bool-luetteloa. Muunnos tehdään btoi-funktiolla:
generoEncSubKeys :: Yksityinen -> [ SubKey ] generEncSubKeys avain = kartta ( btoi ) ( ota 52 ( foldr1 ( ++ ) ( map generoSubKeys ( ota 8 ( keyRotation avain ))))))Kaikki siirretyt näppäimet määritetään keyRotation-toiminnolla, joka luo ne toistuvasti. Tämä funktio käyttää toistuvaa polymorfista funktiota , joka ottaa funktion f ja luettelon xs:stä ja käyttää toistuvasti funktiota f funktioon xs. Tässä tapauksessa se palauttaa avaimen toistuvasti 25-bittisin askelin. Siksi arvot ovat 0, 25, 50, 75, 100, 125:
keyRotation :: Yksityinen -> Bool avainKiertonäppäin = ota 8 ( toistuva ( shift 25 ) näppäin ) toistuva :: ( a -> a ) - > a -> [ a ] toistuva fx = x: toistuva f ( f x ) Shift : : Int -> [ a ] -> [ a ] Shift n - näppäin = ( pudota n - näppäin ) ++ ( ota n - näppäin )Jos haluat luoda 16-bittisiä aliavaimia siirretyistä avaimista, käytä generatorEncSubKeys-funktiota siirrettyjen avainten luettelossa olevaan generateSubKeys-funktioon. GenereSubKeys-funktio käyttää segsejä, jotka valitsevat n aliluetteloa luettelosta xs:
generoSubKeys :: Yksityinen -> [ SubKey ] generoSubKeys avain = segs 16 avaimen segs :: Int -> [ a ] -> a segs n [] = [] segs n xs = ( ota n xs ) : segs n ( pudota n xs )Lopuksi tarvittavat aliavaimet pakataan 6 elementin luetteloihin yhdessä funktiopaketin avulla:
pakkaus :: [ a ] - > pakkaus = segs 6Kun olet luonut salauksen, harkitse salauksen purkamisen luomista, jossa jokainen salauksenpurkuosa on jonkin salauksen alaosion funktio. Salaus- ja salauksenpurkuavainten välinen suhde määritellään generateDecSubKeys-funktiossa. Tämä toiminto suoritetaan yhdistämällä toiminto valmisteltuun hakemistoluetteloon. Suorita-funktio käyttää addInv- ja mulInv-funktioita, jotka vastaavat additiivista ja kertovan käänteistä. Tämä toiminto käyttää myös korkeamman asteen toimintoja, jotka ottavat funktioluettelon ja arvoluettelon ja käyttävät (käytä toimintoa) jokaista ensimmäisen luettelon funktiota vastaavaan arvoon toisessa luettelossa (käyttämällä korkeamman asteen funktiota zipWith) :
generDecSubKeys :: [ SubKey ] -> [ SubKey ] generateDecSubKeys eKeys = ota 52 ( foldr1 ( ++ ) ( kartoitetaan indeksit )) , missä indeksit = mapWith fs ( kartta käänteinen ( käänteinen [ l | l < - [ 0 .. 51 ]]))) f1 ( xs ) = siirto 2 xs f2 ( xs ) = zipWith ( + ) ( kopioi ( xs !! 2 ) 6 ) [ 0 , 2 , 1 , 3 , - 2 , - 1 ] f3 = idfs = [ f1 , f2 , f2 , f2 , f2 , f2 , f2 , f2 , f3 ] suorittaa ( as ) = mapWith [ mulInv , addInv , addInv , mulInv , id , id ]( zipWith ( !! ) ( 6 kopiota e ) as ) kopio :: a -> Int -> [ a ] kopio x n = [ x | minä <- [ 1. . n ]] karttaKanssa :: [( a -> b )] -> [ a ] -> [ b ] karttaKanssa fs = zipKanssa ( soveltaa ) fs soveltaa :: ( a -> b ) -> a -> b soveltaa f = fMäärittelemme additiivinen käänteinen aritmeettinen operaatio (modulo ) ja kertova käänteinen aritmeettinen operaatio (modulo ), jotka ovat addInv ja mulInv funktioita. AddInv-funktio syöttää yksinkertaisesti luvun, joka vähennetään modulo-arvosta:
addInv :: Int -> Int addInv a = modVal - aKertovan käänteisen aritmeettisen operaation laskemiseen käytetään laajennettua euklidista algoritmia [9] . Toiminnallinen erittely näyttää tältä:
mulInv :: Int -> IntmulInv 0 = 0 mulInv b = jos ( y < 0 ) sitten (( modVal + 1 ) + y ) else ( y ) missä y = ( laajennettuEucA ( modVal + 1 ) b ) !! 2 laajennettuEucA :: Int -> Int -> [ Int ] laajennettuEucA a b | b == 0 = [ a , 1 , 0 ] | muuten = iterateSteps [ a , b , 0 , 1 , 1 , 0 ] iterateSteps ls = if (( ls [ 1 ]) > 0 ) then ( iterateSteps s2 ) else ([( ls [ 0 ]), ( ls [ 3 ] ), ( ls [ 5 ])]) , jossa s1 = ( vaihe1 ls ) s2 = ( vaihe 2 [( ls [ 1 ]), ( s1 [ 1 ]), ( ls [ 2 ]), ( s1 [ 2 ]), ( ls [ 4 ]), ( s1 [ 3 ])]) vaihe 1 :: [ Int ] -> [ Int ] vaihe1 ls1 = [ q , ( ls1 [ 0 ]) - ( q * ( ls1 [ 1 ])), ( ls1 [ 3 ]) - ( q * ( ls1 [ 2 ])), ( ls1 [ 5 ]) - ( q * ( ls1 [ 4 ]))] missä q = div ( ls1 [ 0 ]) ( ls1 [ 1 ) ]) step2 :: [ Int ] -> [ Int ] step2 ls1 = [( ls1 [ 0 ]), ( ls1 [ 1 ]), ( ls1 [ 3 ]), ( ls1 [ 2 ]), ( ls1 [ 5 ] ), ( ls1 [ 4 ])]Tulokset eri salausrakenteille (salauksen purku) kuvastavat suorituskyvyn muutosta. Ensimmäinen testi on nopein maksimiläpäisynopeudella 21,33 Gbps (keskimääräinen kapasiteetti 21,5 Mbps), joka havaittiin testattaessa satunnaisia syöttövektoreita avaimella = {1, 2, 3, 4, 5, 6, 7, kahdeksan}. Toisella testillä, joka vastaa kierrosten peräkkäistä suorittamista, on odotettu hitain suorituskyky (maksimiläpäisynopeus 5,82 Gbps ja keskimääräinen 19,53 Mbps). On syytä huomata, että modulaaristen aritmeettisten operaatioiden erilaiset toteutukset vaikuttavat merkittävästi IDEA:n suorituskykyyn.
Toteutus Xilinx FPGA : lla (Davor Runje ja Mario Kovač) on suorituskyvyltään paljon huonompi, mikä johtuu myös erillisen virtalähteen käytöstä PCI -paikoissa (I/O-virtajohdot ja laajennuskorttien päälogiikka on erotettu toisistaan estää ohjaimen vahingoittumisen).
KH Tsoi, PHW Leong esitteli tehokkaamman toteutuksen, joka perustuu Xilinx Virtex XCV300-6 FPGA:han. Mutta jälleen kerran, suorituskyky ei ollut korkeimmalla tasolla ja jäi Ali E. Abdallahin ja Issam W. Damajin toteutuksesta suuruusluokkaa MHz, kun taas bittisarjatoteutus tarjoaa 600 Mbps taajuudella 150 MHz. Bittirinnakkais- ja bittisarjatoteutuksen laskettu suorituskyky XCV1000-6-laitteella on 5,25 Gb/s ja 2,40 Gb/s [10] .
Allen Michalski, Kris Gaj ja Tarek El-Ghazawi saivat tulokset 2,5 MB/s - Crypto++-käsittelyn suoritusteho. SRC-alustan laitteiston käsittelynopeus on 18,5 kertaa nopeampi yksittäisille tietoryhmille ja noin 24 kertaa nopeampi jatkuvalle taulukoille.