Bcrypt: Perbedaan antara revisi
Konten dihapus Konten ditambahkan
k Bot: Perubahan kosmetika |
Wahyudi1983 (bicara | kontrib) algoritma |
||
Baris 4:
bcrypt dapat diimplementasikan pada bahasa pemrograman PHP, Python, JavaScript, C, C ++, C #, Go, <ref>{{Cite web|url=https://godoc.org/golang.org/x/crypto/bcrypt|title=Package bcrypt|website=godoc.org}}</ref> Java, <ref>{{Cite web|url=http://www.mindrot.org/projects/jBCrypt/|title=jBCrypt - strong password hashing for Java|website=www.mindrot.org|language=en|access-date=2017-03-11}}</ref> <ref>{{Cite web|url=https://github.com/patrickfav/bcrypt|title=bcrypt - A Java standalone implementation of the bcrypt password hash function|website=github.com|language=en|access-date=2018-07-19}}</ref> Elixir, <ref>{{Cite web|url=https://github.com/riverrun/bcrypt_elixir|title=Bcrypt Elixir: Bcrypt password hashing algorithm for Elixir.|last=Whitlock|first=David|website=GitHub|publisher=riverrun}}</ref> Perl, <ref>{{Cite web|url=https://github.com/pyca/bcrypt/|title=bcrypt: Modern password hashing for your software and your servers|last=Stufft|first=Donald|publisher=}}</ref> Ruby dan bahasa lain
== Algortima ==
<span data-segmentid="94" class="cx-segment">Algoritma bcrypt adalah hasil dari enkripsi teks ''"OrpheanBeholderScryDoubt"'' 64 kali menggunakan [[Blowfish (penyandian)|Blowfish]] .</span> <span data-segmentid="96" class="cx-segment">Dalam bcrypt fungsi biasa key setup pada Blowfish digantikan dengan fungsi expensive key setup (EksBlowfishSetup)</span>
'''Function''' bcrypt
'''Input:'''
cost: Number (4..31) log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations
salt: array of Bytes (16 bytes) random salt
password: array of Bytes (1..72 bytes) UTF-8 encoded password
'''Output:'''
hash: array of Bytes (24 bytes)
//Initialize Blowfish state with expensive key setup algorithm
''state'' <- EksBlowfishSetup(''cost'', ''salt'', ''password'')
//Repeatedly encrypt the text "OrpheanBeholderScryDoubt" 64 times
''ctext'' <- ''"OrpheanBeholderScryDoubt"'' //24 bytes ==> three 64-bit blocks
'''repeat''' (64)
''ctext'' EncryptECB(''state'', ''ctext'') //encrypt using standard Blowfish in ECB mode
//24-byte <- ''ctext'' is resulting password hash
'''return''' Concatenate(''cost'', ''salt'', ''ctext'')
=== Expensive key setup ===
Algoritma bcrypt sangat bergantung pada algoritma key setup "Eksblowfish", berikut algoritmanya:
'''Function''' EksBlowfishSetup
'''Input:'''
cost: Number (4..31) log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations
salt: array of Bytes (16 bytes) random salt
password: array of Bytes (1..72 bytes) UTF-8 encoded password
'''Output:'''
state: opaque BlowFish state structure
''state'' <- InitialState()
''state'' <- ExpandKey(''state'', ''salt'', ''password'')
'''repeat''' (2<sup>''cost''</sup>)
''state'' <- ExpandKey(state, 0, password)
''state'' <- ExpandKey(state, 0, salt)
'''return''' ''state''
=== Expand key ===
Berikut algoritma fungsi ExpandKey
'''Function''' ExpandKey(''state'', ''salt'', ''password'')
'''Input:'''
state: Opaque BlowFish state structure Internally contains P-array and S-box entries
salt: array of Bytes (16 bytes) random salt
password: array of Bytes (1..72 bytes) UTF-8 encoded password
'''Output:'''
state: opaque BlowFish state structure
//Mix password into the internal P-array of ''state''
'''for''' ''n'' <- 1 '''to''' 18 '''do'''
P<sub>n</sub> <- P<sub>n</sub> xor ''password''[32(n-1)..32n-1] //treat the password as cyclic
//Encrypt state using the lower 8 bytes of salt, and store the 8 byte result in P<sub>1</sub>|P<sub>2</sub>
''block'' <- Encrypt(''state'', ''salt''[0..63])
P<sub>1</sub> <- ''block''[0..31] //lower 32-bits
P<sub>2</sub> <- ''block''[32..63] //upper 32-bits
//Continue encrypting state with salt, and storing results in remaining P-array
'''for''' ''n'' <- 2 '''to''' 9 '''do'''
''block'' <- Encrypt(''state'', ''block'' '''xor''' ''salt''[64(n-1)..64n-1]) //encrypt using the current key schedule and treat the salt as cyclic
P<sub>2n-1</sub> <- ''block''[0..31] //lower 32-bits
P<sub>2n</sub> <- ''block''[32..63] //upper 32-bits
//Mix encrypted state into the internal S-boxes of ''state''
'''for''' ''i'' <- 1 '''to''' 4 '''do'''
'''for''' ''n'' <- 0 '''to''' 127 '''do'''
''block'' <- Encrypt(''state'', ''block'' '''xor''' ''salt''[64(n-1)..64n-1]) //as above
S<sub>i</sub>[2n] <- ''block''[0..31] //lower 32-bits
S<sub>i</sub>[2n+1] <- ''block''[32..63] //upper 32-bits
'''return''' ''state''
== Referensi ==
{{reflist}}
|