입력: 28

과정: 2x8 = 16 => 1+6 = 7

출력: 7



이런게 해시의 원리임.

존나 잘라 가지고 이리저리 막계산하는거임.


"7"이라는 숫자 하나 가지고 "28"을 유추해낼 수 있냐?

가역성이 없어서 해시함수는 "단방향 함수"라고 하는거고,

단방향함수는 역함수가 존재하지 않음.


그럼 암호깨는 프로그램 원리는 뭘까?

그냥 아무거나 존나 대입해보니 결과값이 7이 나오는게

입력값 28이더라 이런식임.

이런 암호깨기 방식을 Brute Force라고 부르며, 그냥 대입노가다라고도 한다.

암호 깨는데 몇백년 걸린다 이런게 바로 이걸 얘기하는거임.



계산이 복잡하지만 규칙성이 있으니까 잘하면 역함수도 나올수 있지 않겠냐 싶겠지만,

해시 계산이 이런식으로도 됨.


입력: 378

과정: 3x7x8 = 168 => 귀찮다 1 버려 => 6+8 = 14 => 4 버려 => 1

출력: 1


이런식으로 중간에 잘라버리고 버리기 때문에,

역함수를 만들래야 만들수가 없음.

물론 계산하는 규칙과 버리는 규칙은 정해져있음.

규칙이 있으니까 역산이 가능하지 않겠냐 싶겠지만,

있는 것은 알아도 없는 것을 알수가 없는 법이야.

단순한 숫자나 문자의 나열인데 그게 원래 뭐가 있었는지 무슨 수로 아냐?



원천적으로 역함수가 없어서,

암호깨기가 아무리 발전해봐야

Brute Force밖에 없음.

즉, 암호깨기 관련해서는

하드웨어 발전과 Brute Force를 효율적으로 병렬처리하는 알고리즘만 발달하는 방향임.

물론 Collision같은 것도 있는데, 애초에 그런건 일부 특수 케이스를 논하는 부분이기에 범용적으로는 별 의미가 없음.

아직은 이론적 연구쪽에나 의미가 있지.


아, 참고로 DES, AES 이런쪽은 또 분야가 다름. 얘네는 복호화가 있음.

그냥 해시가 아니라, 일부러 복호화 가능하게 만들고, 그래도 깨기는 어렵게 만드는 식.

TrueCrypt종류가 이런쪽이지.



뭐 나도 조금 주워듣고

존 더 리퍼나 좀 돌려본게 다라서,

아는게 이정도 밖에 없다.




갑자기 더 생각나서 썰 더 풀자면,


참고로 Dictionary라는게 있는데,

여기에는 사람이 쉽게 생각하는 간단한 암호(ex.1234, abcd1234)가 망라되어 있음.

일단 여기에 있는 암호는 그냥 백퍼 순식간에 뚫림.

물론 딕셔너리에 없어도, 짧으면 금방 뚫림.

그래서 암호를 쉽게 유추할 수 없게끔 복잡하고 길게 하라는거임.


예전에 네이트에서 개인정보 유출 사건이 있었을때(네이트 맞나 모르겠다. 워낙에 사고친 새끼들이 많아서),

주민번호와 아이디, 비번까지 다 털렸다고 그랬었잖아.

그때 네이트 씨발새끼들은 전부 암호화 되어 있어서 상관없다고는 했지만,

비번말고는 개소리임.


주민번호는 누구나 13자리 밖에 없음.

게다가 주민번호는 생성규칙까지 완벽하게 공개되어 있음.

규칙이 너무 뻔한 입력값은 암호화의 의미가 사실상 없음. 그래서 더더욱 주민번호 수집이 위험한거임.

수천만명의 암호화된 주민번호 따위는 하루면 다 깸.

그래서 주민번호를 짱개국 시골 할배도 몇개씩 가질 수 있는거임.


아이디도 보통 비번에 비해 제한적이고,

보통 아이디는 비번믿고 암호화도 안하는 일이 일상다반사임.

"아이디찾기"로 아이디가 뙇 나왔다면 아이디는 암호화 안된거.

(사실 어쩔수 없는 것이기도 함. 아이디를 알아야 가능한 처리도 많으니까.)

(비번찾기로 임시 비번 만들어주는게 아니라 진짜 비번 찾아주는 사이트는 손절해야됨.

복호화 가능한 암호화 썼거나, 암호화를 아예 안했을 가능성마저 있음.

요샌 보안의식이 좀 올라가서 거의 없지만, 예전엔 이런 사이트 존나 많았음.)


즉, 비번만 단순하면, 그 사람의 모든 정보는 해커의 손에 저절로 떨어지지.

그래서 어디 털렸다 하면, 털린 곳과 동일한 아이디 비번은 닥치고 다 바꿔야됨. ㅠㅠ