**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** (2*cost*)
        *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 шифрованной почты

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

1. ↑  *Provos, Niels; Mazières, David* A Future-Adaptable Password Scheme (und) // *Proceedings of 1999 USENIX Annual Technical Conference*. — 1999. — С. 81—92.
2. ↑  «Package bcrypt» (անգլերեն)։ godoc.org։ Վերցված է 2020 թ․ հունվարի 10
3. ↑   «Not only does scrypt give you more theoretical safety than bcrypt per unit compute time, but it also allows you to configure the amount of space in memory needed to compute the result.»