
bycrpt는 blowfish 알고리즘을 이용합니다. 다른 점은 salt로 레인보우 테이블을 방지합니다. 그리고
의도적으로 암호화 횟수(cost)를 늘려서 무차별 공격을 더디게 합니다.
[P box, S box 초기화 (키 스케줄) ]
1) P, S박스 초기화 및 할당을 위해 EksblowFishSetup() 함수를 실행한다.
a) 16진수 파이로 P, S 박스를 초기화 한다.
2) P, S박스 할당을 위해 ExpandKey() 함수를 실행한다.
a) P[0] = P[0] xor password[0] 부터 P[17] = P[17] xor password[17] 까지 한다.
b) salt를 절반(64비트)으로 나눈다.
c) block을 0(64비트)로 초기화 한다.
2-1) 아래는 P박스 할당을 위한 작업입니다. 첫번째 반복위주로 설명하겠습니다
a) block = block xor saltHalf[0] // 현재 block은 0이라서 saltHalf와 xor하면 결과값은 salt입니다
b) block = encrypt(state, salt) // P박스(비밀번호와 xor한 P), S박스(파이로 초기화한 S)를 사용해 salt를 blowfish
방식으로 암호화합니다. 이때 salt가 평문역할을 합니다.
c) p[0] = block[0..31] , p[1] = block[32..63] // block(암호화 마침)을 절반씩 p배열에 할당합니다.
두번째 반복의 block은 첫번째 반복에서 암호화한 block입니다. 이런식으로 p[18] 까지 할당합니다.
3) S박스 할당 차례입니다. P박스 할당과 과정이 동일합니다. 눈 여겨볼점은 첫번째 반복의 block입니다.
이 block은 P박스 마지막 할당때 암호화한 block 입니다.
4) ExpandKey(state, 0, password), ExpandKey(state, 0, salt)를 2^cost 만큼 반복한다.
4-1) ExpandKey(state, 0, password)
a) ExpandKey(state, 0, password)의 매개변수는 step3에서 할당한 state, 0(salt), password(key) 이다.
b) P[0] = P[0] xor password[0] 부터 P[17] = P[17] xor password[17] 까지 한다.
c) 첫번째 반복의 block은 block(0) xor salt(0)로 0이다
4-2) ExpandKey(state, 0, salt)
a) ExpandKey(state, 0, salt)의 매개변수는 step4-1에서 할당한 state, 0(salt), salt (key) 이다.
b) P[0] = P[0] xor salt[0] 부터 P[17] = P[17] xor salt 17] 까지 한다 //salt는 128비트라 모자라 순환해서 사용합니다
c) 첫번째 반복의 block은 block(0) xor salt(0)로 0이다
[암호화]
1) step 4-2에서 할당한 state로 ctext(평문)을 64번 암호화한다.
2) $2a $cost $salt $ctext 형태로 합쳐 반환합니다.
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
- $1: MD5-based crypt ('md5crypt')
- $2: Blowfish-based crypt ('bcrypt')
- $5: SHA-256-based crypt ('sha256crypt')
[페이스텔 네트워크 (암호화 방법) ]
blowfish의 페이스텔 네트워크와 동일합니다.
'알고리즘' 카테고리의 다른 글
[대칭 키] blowfish 알고리즘 (0) | 2023.10.04 |
---|---|
[대칭 키] DES 알고리즘 (0) | 2023.09.26 |