Bcrypt

bcrypt, ադապտացված կրիպտոգրաֆիկական հեշ-ֆունկցիա, որը նախատեսված է գաղտանաբառերի կոդավորման համար։ Ֆունկցիան ստեղծվել է Նիլս Պրովոսի և David Mazières-ի կողմից։ Ֆունկցիան հիմնված է Blowfish-ի վրա, որը առաջին անգամ ներկայացվել է USENIX-ին 1999 թվականին։ Ֆունկցիան համարվում է ադապտացված՝ իր աշխատանքի ժամանակ կարելի է դադաղեցնել գործընթացը, որպեսզի դժվարացնում հաքերիների կատարած հարձակումները։
Blowfish-ն տարբերվում է շատ ալգորիթմներից իր կոդավորման բարդ բանալիներով։
Պրովոսը և Mazières-ը օգտագործեցին այս յուրահատկությունը, սակայն փոփոխեցին այդ բանալիները, ստանալով «Eksblowfish» (expensive key schedule Blowfish) կոդավորումը։
Առաջին տարբերակը ստեղծվեց crypt ֆունկցիայով OpenBSD-ով։ Գոյություն ունեն նաև տարբերակներ Java, Python, Nim, C#, Ruby, Perl, PHP 5.3, Node.js, Go և մի քանի այլ տարբերակների համար։


== Ալգորիթմ ==
bcrypt ալգորիթը օգտոգործում է Eksblowfish բանալին․

EksBlowfishSetup(cost, salt, key)
    state 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   InitState()
    state 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ExpandKey(state, salt, key)
    repeat (2cost)
        state 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ExpandKey(state, 0, key)
        state 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ExpandKey(state, 0, salt)
    return state

InitState ֆունկցիան համապատասխանում է Blowfish օրիգինալ ֆունկցիային՝ P և S-box զանգվածը լրացնելու համար օգտագործվում է թվի 
  
    
      
        π
      
    
    {\displaystyle \pi }
   մասը։
ExpandKey ֆունկցիա․ 

ExpandKey(state, salt, key)
    for(n = 1..18)
        Pn 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   key[32(n-1)..32n-1] 
  
    
      
        ⊕
      
    
    {\displaystyle \oplus }
   Pn //treat the key as cyclic
    ctext 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   Encrypt(salt[0..63])
    P1 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[0..31]
    P2 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[32..63]
    for(n = 2..9)
        ctext 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   Encrypt(ctext 
  
    
      
        ⊕
      
    
    {\displaystyle \oplus }
   salt[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic
        P2n-1) 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[0..31]
        P2n 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[32..63]
    for(i = 1..4)
        for(n = 0..127)
            ctext 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   Encrypt(ctext 
  
    
      
        ⊕
      
    
    {\displaystyle \oplus }
   salt[64(n-1)..64n-1]) //as above
            Si[2n] 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[0..31]
            Si[2n+1] 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   ctext[32..63]
    return state

Հեշի հաշվարկի համար bcrypt-ը մշակում է ներմուծվող տվյալները համարժեք կոդավորմամբ՝ eksblowfish․ 

bcrypt(cost, salt, key, input)
    state 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   EksBlowfishSetup(cost, salt, key)
    ctext 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   input
    repeat (64)
        ctext 
  
    
      
        ←
      
    
    {\displaystyle \gets }
   EncryptECB(state, ctext) 
    return Concatenate(cost, salt, ctext)


== Թերություններ ==
bcrypt-ը մշակվել է 1999 թվականին և պաշտպանված է եղել այն ժամանակների հարձակումների հանդեպ։ Ներկա պահին այն ստացել է ծրագրավորման լոգիկա, որոնց շնորհիվ այն շարունակում է մնալ պաշտշանված։ 2009 թվականին ստեղծվել էր scrypt ալգորիթմը, որի աշխատանքի համար անհրաժեշտ էր հիշողության մեծ ծավալ։


== Արտաքին հղղումներ ==
jBCrypt — реализация bcrypt на Java
py-bcrypt — реализация bcrypt на Python
BCrypt.Net- реализация bcrypt на C# Archived 2014-07-01 at the Wayback Machine.
JFBCrypt — реализация bcrypt на Objective C
bcrypt-ruby — реализация bcrypt на Ruby
Crypt::Eksblowfish::Bcrypt — реализация bcrypt на Perl
bcrypt.js — реализация bcrypt на JavaScript
twin-bcrypt — реализация bcrypt на JavaScript / asm.js
bcrypt.go — реализация bcrypt на Go Archived 2014-10-04 at the Wayback Machine.
tutanota.com — пример использования bcrypt в сервисе end-to-end шифрованной почты


== Ծանոթագրություններ ==