bcrypt 요약짤

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의 페이스텔 네트워크와 동일합니다.

*여기서 blowifsh 보세요

 

출처1(위키페디아) & 출처2(usenix) & 출처3(usenix)

'알고리즘' 카테고리의 다른 글

[대칭 키] blowfish 알고리즘  (0) 2023.10.04
[대칭 키] DES 알고리즘  (0) 2023.09.26

blowfish 요약 짤 (위키페디아 출처)

blowfish는 DES의 대안으로 1993년에 나왔습니다. 생일 공격에 취약해, 대안으로 TwoFish가 나왔습니다.
위키백과 보고 밑에 읽어보세요~
 
[P 배열, S box 초기화 (키 스케줄) ]
1) 키(32~448비트)를 임의로 만들고 K 배열[14]에 넣습니다.
 
2) P 배열[18], S box 배열[4, 256]을 만들고 파이(3.14)의 16진수로 초기화합니다.
*P 배열, S box의 원소는 모두 32비트입니다.
초기화한 P, S는 여기서 보세요
 
3) P 배열과 K 배열의 원소를 XOR하고 P 배열에 넣습니다.
*K는 P와 배열 크기가 달라서, XOR할때 K는 [14] 이후 [0]부터 다시 씁니다.
 
4) 64비트짜리 0을 밑의 페이스텔 네트워크로 암호화하여 P 배열과 S Box에 할당합니다.
*평문외에도 암호화를 하는게 신기하네요
할당법은 여기서 보세요
 
[페이스텔 네트워크 (암호화 방법) ]
1) 평문(64비트)를 반으로 나눠 L(32비트), R(32비트)를 만듭니다.
 
2) L(32비트)과 P1(32비트)를 XOR
 
3) XOR값(32비트)을 4개의 S box에 8비트씩 분할하고, 각각 S box 원소 한개(32비트)를 매핑합니다.
매핑법은 여기서 보세요 (근데 의견이 많아서 뭐가 맞는지  모르겠어요)
 
4) S0과 S1를 더하고 2^32로 나머지 연산(%) 합니다.
*S0, S1, S2, S3는 매핑한 원소입니다.
 
5) 나머지 연산값(32비트)과 S2를 XOR
 
6) 5번의 XOR값(32비트)과 S3을 더하고 2^32로 나머지 연산(%) 합니다.
 
7) 6번의 나머지 연산값과 R(32비트)를 XOR
 
8) 7번의 XOR값을 L로 하고, R을 기존의 L로 합니다.

9) 2~8 과정를 15번 더 반복합니다. 근데 마지막 반복(16번째)엔 8과정를 안합니다.
 
10) L과 P18을 XOR하고, R과 P17을 XOR 합니다. 두 XOR 값을 합쳐 암호문을 완성합니다.
 
대칭 키라서 복호화는 암호화의 역순입니다. 
-끝-

'알고리즘' 카테고리의 다른 글

[비대칭 키] bcrypt 알고리즘  (0) 2023.10.10
[대칭 키] DES 알고리즘  (0) 2023.09.26

DES는 1975년  암호화 알고리즘입니다.  현재는 안씁니다.
이유는 여기서 보세요

DES는 두번의 치환, 페이스텔 암호화를 거칩니다.

1) 초기 치환
2) 페이스텔 암호
3) 후기 치환

[초기 치환, 후기치환]
표를 이용해, 평문 비트(64비트)의 순서를 바꾼다.
*순서는 표에 써있고, 64비트가 아니면 그만큼 채운다.
표는 여기서 보세요

[페이스텔 암호]
1) 초기 치환을 한 평문 비트를 반으로 나눈다.
*이 둘을 L(32비트), R(32비트)이라 한다.

2) 확장 P box로 비트를 복사하여 R을 48비트로 확장한다.

3) R(48비트)과 서브키(48비트)를 XOR 한다.
*XOR값은 48비트다.
서브키는 평문을 원형 이동하여 매 반복마다 만든다.
서브키 만드는 방법은 여기서 보세요

4) S box를 사용해 XOR값(48비트)을 32비트로 축소한다.
*8개의 S box에 각각 6비트를 분배하고, 각각 4비트로 축소해서 총 32비트가 된다.
축소 방법은 여기서 보세요

5) Straight P box를 사용해 XOR값(32비트)의 비트 순서를 바꾼다.
*초기 치환이랑 같은 방법이다.

6) XOR값과 L(32비트)를 XOR 한다.
*기존의 XOR값과 햇갈려서 새로운 XOR값은 ☆XOR 이라 하겠습니다.

7) ☆XOR을 R로 하고, 기존의 R을 L로 한다.

8) 1~7 과정을 16번 반복한다. 마지막 반복엔, 7번 과정을 안한다.

9) L과R을 합쳐 64비트를 만든다.

암호화 서브키와 복호화 서브키는 동일해서, 복호화는 암호화의 역순입니다.
증명은 여기서 보세요

'알고리즘' 카테고리의 다른 글

[비대칭 키] bcrypt 알고리즘  (0) 2023.10.10
[대칭 키] blowfish 알고리즘  (0) 2023.10.04

+ Recent posts