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* \gets InitState()
     *state* \gets ExpandKey(*state*, *salt*, *key*)
     **repeat** (2*cost*)
         *state* \gets ExpandKey(state, 0, key)
         *state* \gets ExpandKey(state, 0, salt)
     **return** *state*

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

ExpandKey ֆունկցիա․ 
 ExpandKey(*state*, *salt*, *key*)
     for(*n* = 1..18)
         Pn \gets *key*[32(n-1)..32n-1] \oplus Pn //treat the key as cyclic
     *ctext* \gets Encrypt(*salt*[0..63])
     P1 \gets *ctext*[0..31]
     P2 \gets *ctext*[32..63]
     for(*n* = 2..9)
         *ctext* \gets Encrypt(*ctext* \oplus *salt*[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic
         P2n-1) \gets *ctext*[0..31]
         P2n \gets *ctext*[32..63]
     for(*i* = 1..4)
         for(*n* = 0..127)
             *ctext* \gets Encrypt(*ctext* \oplus *salt*[64(n-1)..64n-1]) //as above
             Si[2n] \gets *ctext*[0..31]
             Si[2n+1] \gets *ctext*[32..63]
     **return** *state*

Հեշի հաշվարկի համար bcrypt-ը մշակում է ներմուծվող տվյալները համարժեք կոդավորմամբ՝ eksblowfish․ 
 bcrypt(*cost*, *salt*, *key*, *input*)
     *state* \gets EksBlowfishSetup(*cost*, *salt*, *key*)
     *ctext* \gets *input*
     **repeat** (64)
         *ctext* \gets EncryptECB(*state*, *ctext*) 
     **return** Concatenate(*cost*, *salt*, *ctext*)

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

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

## Արտաքին հղումներ
* jBCrypt — реализация bcrypt на Java
* py-bcrypt — реализация bcrypt на Python
* BCrypt.Net- реализация bcrypt на C# 
* 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 
* tutanota.com — пример использования bcrypt в сервисе end-to-end шифрованной почты

Կատեգորիա:Գաղտնագրություն