Maskin luontitoiminto - Mask generation function
Maskin muodostamisen toiminto ( MGF ) on salauksen alkeellinen samanlainen tiiviste , paitsi että kun hash-funktion lähtö on kiinteä koko, joka on MGF tukee tuotos vaihtuvamittainen. Tässä suhteessa MGF: ää voidaan pitää kertakäyttöisenä XOR-toimintona: se voi hyväksyä minkä tahansa pituisen syötteen ja prosessoida sen tuottamaan minkä tahansa pituisen lähdön. Maskin luontitoiminnot ovat täysin deterministisiä: millä tahansa syötöllä ja halutulla ulostulon pituudella lähtö on aina sama.
Määritelmä
Maskinmuodostustoiminto ottaa syötteeksi muuttuvan pituisen ja halutun ulostulopituuden oktettijonon ja antaa halutun pituisen oktettijonon. Syöttö- ja lähtö-oktettijonojen pituudelle voi olla rajoituksia, mutta tällaiset rajat ovat yleensä hyvin suuria. Maskin luontitoiminnot ovat deterministisiä; oktettimerkkijonon ulostulo määräytyy kokonaan syötetyn oktettijonon avulla. Maskin luontitoiminnon lähdön tulisi olla näennäissatunnainen, toisin sanoen jos funktion siemen on tuntematon, sen pitäisi olla mahdotonta erottaa lähtö todella satunnaisesta merkkijonosta.
Sovellukset
Maskin luontitoiminnot, kuten hash-toimintojen yleistykset, ovat hyödyllisiä missä tahansa hash-funktiot ovat. MGF: n käyttö on kuitenkin toivottavaa tapauksissa, joissa kiinteäkokoinen hajautus olisi riittämätön. Esimerkkejä ovat täytteen luominen , kertalevyjen tai avainvirtojen tuottaminen symmetrisessä avainkoodauksessa ja lähtöjen tuottaminen näennäissatunnaislukugeneraattoreille .
Pehmustekaaviot
Maskinmuodostustoimintoja ehdotettiin ensin osana täyttöä koskevaa spesifikaatiota RSA-OAEP- algoritmissa. OAEP-algoritmi vaati salauksen hajautusfunktion, joka voisi tuottaa ulostulon, jonka koko olisi yhtä suuri kuin "datalohko", jonka pituus oli verrannollinen mielivaltaisen kokoiseen tulosanomaan.
Satunnaislukugeneraattorit
NIST-erikoisjulkaisu 800-90A määrittelee luokan kryptografisesti suojatut satunnaislukugeneraattorit, joista yksi on "Hash DRBG", joka käyttää hash-toimintoa laskurin kanssa tuottaakseen pyydetyn satunnaisbittien sarjan, joka on kooltaan yhtä suuri kuin pyydetty määrä satunnaiset bitit.
Esimerkkejä
Ehkä yleisin ja suoraviivainen mekanismi MGF: n rakentamiseksi on haser-funktion iteratiivinen soveltaminen yhdessä kasvavan laskurin arvon kanssa. Laskuria voidaan kasvattaa loputtomiin uusien lähtölohkojen tuottamiseksi, kunnes riittävä määrä lähtöä on kerätty. Tätä lähestymistapaa käytetään MGF1: ssä.
MGF1
MGF1 on maskin luontitoiminto, joka on määritelty RSA Laboratoriesin julkaisemassa julkisen avaimen salausstandardissa # 1:
Vaihtoehdot
- hash-funktio ( tarkoittaa hash-funktion ulostulon pituutta oktetteina)
Tulo
- siemen, josta naamio syntyy, oktettijono
- suunniteltu pituus maskin oktetteina, enintään
Tuotos
- naamio, oktetin pituus ; tai "maski liian pitkä"
Askeleet
- Jos , anna "peite liian pitkä" ja lopeta.
- Antaa olla tyhjä oktetti merkkijono.
- Sillä välillä on , toimi seuraavasti:
- Muunna oktetin pituiseksi merkkijonoksi primitiivillä :
- Liitä siemenen hash ja oktettijono :
- Tulosta oktettimerkkijononaamion johtavat oktetit .
Esimerkkikoodi
Alla on Python2-koodi, joka toteuttaa MGF1:
import hashlib
def i2osp(integer: int, size: int = 4) -> str:
return "".join([chr((integer >> (8 * i)) & 0xFF) for i in reversed(range(size))])
def mgf1(input_str: str, length: int, hash=hashlib.sha1) -> str:
"""Mask generation function."""
counter = 0
output = ""
while len(output) < length:
C = i2osp(counter, 4)
output += hash(input_str + C).digest()
counter += 1
return output[:length]
Esimerkkejä MGF1: n lähdöistä:
Python 2.7.6 (default, Sep 9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from mgf1 import mgf1
>>> from binascii import hexlify
>>> from hashlib import sha256
>>> hexlify(mgf1('foo', 3))
'1ac907'
>>> hexlify(mgf1('foo', 5))
'1ac9075cd4'
>>> hexlify(mgf1('bar', 5))
'bc0c655e01'
>>> hexlify(mgf1('bar', 50))
'bc0c655e016bc2931d85a2e675181adcef7f581f76df2739da74faac41627be2f7f415c89e983fd0ce80ced9878641cb4876'
>>> hexlify(mgf1('bar', 50, sha256))
'382576a7841021cc28fc4c0948753fb8312090cea942ea4c4e735d10dc724b155f9f6069f289d61daca0cb814502ef04eae1'