한글패치를 찾아보다 보면 정말 자주 나오는 단어가 있습니다.
CRC32, MD5, SHA1.
처음 보면 무슨 암호 같은 숫자와 영어가 길게 적혀 있어서 괜히 어렵게 느껴집니다.
저도 처음에는 그랬습니다.
그런데 ROM 한글패치를 몇 번 해보고 패치가 실패하는 경험도 하다 보니 결국 이 값을 먼저 확인하게 됐습니다.
쉽게 생각하면 해시는 파일의 지문입니다.
내가 가지고 있는 ROM이 패치 제작자가 사용한 ROM과 정말 같은 파일인지 확인하는 용도로 사용합니다.
파일 이름이 같아도 같은 파일은 아닙니다
예를 들어 이런 파일이 있다고 해보겠습니다.
Game (Japan).nds
그리고 다른 곳에서도 똑같은 이름의
Game (Japan).nds
를 가지고 있습니다.
파일명만 보면 같은 파일 같습니다.
하지만 실제 내부 데이터가 동일하다는 보장은 없습니다.
국가가 다를 수도 있고,
게임 버전이 다를 수도 있고,
초기판과 수정판의 차이가 있을 수도 있습니다.
누군가 파일 이름만 바꿔놓았을 수도 있습니다.
그래서 파일 이름만으로는 한글패치에 필요한 정확한 원본인지 판단하기 어렵습니다.
이때 사용하는 것이 해시입니다.
해시는 파일 전체를 계산해서 만든 값
해시는 파일의 내용을 일정한 방식으로 계산해서 하나의 값으로 만드는 방식입니다.
예를 들어 어떤 ROM을 계산했더니
CRC32 : 12345678
MD5 : A1B2C3...
SHA1 : 123ABC...
같은 값이 나왔다고 생각하면 됩니다.
그리고 같은 파일을 다시 계산하면 같은 값이 나옵니다.
반대로 파일 내부가 변경되면 해시도 달라집니다.
Microsoft의 Get-FileHash 설명에서도 파일 이름이나 확장자가 바뀌어도 내용이 같으면 해시는 유지되지만, 파일 내부의 문자 하나만 달라져도 해시가 바뀐다고 설명하고 있습니다.
그래서 해시를 파일의 지문이라고 표현하는 경우가 많습니다.
정말 글자 하나만 달라도 다른 해시가 나올까?
네.
ROM을 구성하고 있는 데이터 가운데 한 부분이라도 달라지면 해시는 달라질 수 있습니다.
사람 눈에는 똑같은 게임이고,
용량도 같고,
파일명도 같고,
실행해봤을 때 차이를 못 느끼더라도
실제 내부 데이터가 조금이라도 다르면 다른 해시가 나올 수 있습니다.
한글패치를 할 때는 이게 중요합니다.
패치 제작자는 자신이 사용한 특정 ROM을 기준으로 패치를 만들기 때문입니다.
그래서 제작자가
CRC32 : ABCD1234
라고 적어두었다면,
제가 가지고 있는 ROM에서도 똑같은 값이 나오는지를 확인하는 것입니다.
다르면 일단 패치를 진행하기 전에 원본부터 다시 확인하는 것이 좋습니다.
엄밀히 말하면 해시가 다르다고 모든 패치가 무조건 실패하는 것은 아닙니다. 패치 형식과 변경된 위치에 따라 우연히 적용되는 경우도 있을 수 있습니다.
하지만 한글패치에서는 제작자가 지정한 해시와 다르면 다른 원본으로 보는 것이 가장 안전합니다.
CRC32는 무엇일까?
한글패치나 고전게임 ROM을 보다 보면 가장 자주 보이는 값 중 하나가 CRC32입니다.
CRC32는 원래 데이터 전송이나 저장 과정에서 오류가 생겼는지 빠르게 확인하기 위한 체크섬 방식입니다.
결과는 32비트 값이라 비교적 짧습니다.
예를 들면
CRC32 : C681F9DA
처럼 표시됩니다.
장점은 계산이 빠르고 값이 짧아서 확인하기 쉽다는 점입니다.
그래서 오래된 ROM 데이터베이스나 한글패치 설명에서도 많이 사용됩니다.
다만 32비트밖에 되지 않기 때문에 서로 다른 파일이 우연히 같은 CRC32를 가질 가능성은 MD5나 SHA1보다 높습니다.
그래도 일반적인 ROM 버전 확인에는 지금도 꽤 많이 사용됩니다.
MD5는 무엇일까?
MD5는 CRC32보다 훨씬 긴 128비트 해시를 만듭니다.
보통 이런 식입니다.
MD5 : B1C1A09BA81C48F2EC05A12A878DAFE2
CRC32보다 길기 때문에 다른 파일이 우연히 같은 값을 가질 가능성은 훨씬 낮습니다.
다만 MD5는 오래된 알고리즘이고 보안 목적으로는 더 이상 안전한 해시로 보지 않습니다.
Microsoft도 MD5와 SHA1은 공격에 대한 보안 목적으로 사용해서는 안 되고, 단순한 변경 확인 정도에 사용하는 것이 적합하다고 안내합니다.
그런데 ROM 확인에서는 이야기가 조금 다릅니다.
우리가 MD5를 사용하는 목적은 비밀번호를 보호하거나 전자서명을 만드는 것이 아니라
내 파일과 제작자의 파일이 같은가
를 비교하는 것입니다.
그래서 지금도 ROM 확인에서는 MD5를 많이 볼 수 있습니다.
SHA1은 무엇일까?
SHA1은 160비트 해시입니다.
MD5보다 더 긴 값을 만듭니다.
예를 들어
SHA1 : 98ADF7CBDF1067ED7B88B7350659F244A587376A
같은 형태입니다.
SHA1도 현재 보안 목적으로는 안전한 알고리즘으로 평가되지 않습니다.
하지만 ROM 식별처럼 이미 알려진 파일과 내가 가진 파일을 비교하는 용도로는 여전히 많이 사용됩니다.
결국 한글패치에서 CRC32, MD5, SHA1을 볼 때는
어느 것이 가장 강력한 암호인가
보다
제작자가 적어둔 값과 내 파일의 값이 일치하는가
가 더 중요합니다.
CRC32, MD5, SHA1 중 무엇을 확인하면 될까?
가장 간단합니다.
제작자가 적어둔 것을 확인하면 됩니다.
제작자가 CRC32만 제공했다면 CRC32를 비교하고,
MD5를 제공했다면 MD5를 비교합니다.
CRC32, MD5, SHA1을 모두 제공했다면 가능하면 모두 비교하는 편이 좋습니다.
예를 들어
제작자 ROM:
CRC32 : 85C509AF
내 ROM:
CRC32 : 85C509AF
라면 일치합니다.
대소문자는 신경 쓰지 않아도 됩니다.
abcdef12
와
ABCDEF12
는 같은 값입니다.
반대로 한 자리라도 다르면 다른 해시입니다.
해시는 어떻게 확인할까?
방법은 여러 가지가 있습니다.
가장 간단한 방법 중 하나는 해시 확인 프로그램을 사용하는 것입니다.
ROM 패치 프로그램 자체에서 보여주는 경우도 있습니다.
예를 들어 Rom Patcher JS는 ROM을 불러오면 CRC32, MD5, SHA-1을 모두 표시해줍니다. IPS, UPS, BPS, PPF, xdelta 같은 여러 패치 형식도 지원합니다.
그래서 패치를 하기 전에 ROM을 불러오고 해시부터 확인하는 방법도 편합니다.
Windows에서는 PowerShell로도 확인할 수 있습니다
별도 프로그램을 설치하기 싫다면 Windows PowerShell을 사용할 수도 있습니다.
파일을 준비하고 PowerShell에서 다음과 같이 입력합니다.
MD5 확인:
Get-FileHash "C:\ROM\game.nds" -Algorithm MD5
SHA1 확인:
Get-FileHash "C:\ROM\game.nds" -Algorithm SHA1
기본값은 SHA256입니다.
Get-FileHash "C:\ROM\game.nds"
Microsoft 공식 문서상 Get-FileHash는 MD5, SHA1, SHA256, SHA384, SHA512를 지원합니다. 다만 CRC32는 지원하지 않습니다.
그래서 CRC32까지 같이 보고 싶다면 별도의 해시 프로그램이나 ROM 패처를 사용하는 것이 더 편합니다.
저는 결국 이 과정이 귀찮아졌습니다
한두 개의 게임만 확인할 때는 별문제가 없습니다.
ROM 하나 불러오고,
CRC32 보고,
MD5 보고,
제작자 게시글과 비교하면 됩니다.
그런데 게임이 많아지면 이야기가 달라집니다.
기종도 많아지고,
ROM도 많아지고,
패치 형식도 달라집니다.
어떤 패치는 CRC32를 요구하고,
어떤 패치는 MD5를 적어두고,
어떤 곳은 SHA1까지 제공합니다.
여기에 xdelta, BPS, IPS 같은 패치 형식도 섞입니다.
그러다 보니
그냥 ROM을 넣으면 알아서 해시를 계산하고 원본을 확인해주는 프로그램이 있으면 편하겠다
는 생각을 하게 됐습니다.
그래서 AI를 이용해서 프로그램을 만들고 있습니다
저는 직접 코딩을 할 수 있는 사람은 아닙니다.
필요한 기능이 무엇인지 설명하고,
이렇게 동작했으면 좋겠다는 내용을 계속 요청하면서 AI의 도움을 받아 프로그램을 만들고 있습니다.
현재 목표는 ROM을 등록하면
CRC32,
MD5,
SHA1
같은 값을 자동으로 계산하고,
게임 정보를 확인하고,
한글패치가 있다면 필요한 원본과 비교하고,
가능하면 패치까지 이어서 처리할 수 있게 만드는 것입니다.
처음에는 단순히 ROM을 정리하는 프로그램으로 시작했는데 이것저것 하다 보니 점점 기능이 늘어나고 있습니다.
완벽한 프로그램을 만드는 것이 목표라기보다는
제가 실제로 사용할 때 번거로운 작업을 줄여주는 정도
까지 만들어지면 좋겠다고 생각하고 있습니다.
사실 직접 코드를 작성할 수 없는데 프로그램을 만들고 있다는 것 자체가 예전이라면 조금 이상한 이야기였을 것 같습니다.
그런데 요즘은 AI에게 필요한 기능을 설명하고,
만들어진 결과를 테스트하고,
문제가 생기면 다시 원인을 찾아 수정하는 과정을 반복하면서 실제로 사용할 만한 프로그램까지 만드는 것이 가능해지고 있습니다.
이 과정도 어느 정도 정리가 되면 따로 기록해볼 생각입니다.
해시는 어렵게 생각할 필요가 없습니다
CRC32,
MD5,
SHA1.
처음 보면 뭔가 복잡한 개발자 용어처럼 보입니다.
하지만 한글패치를 하는 입장에서는 아주 단순하게 생각해도 됩니다.
해시 = 파일의 지문
입니다.
제작자가 적어둔 지문과
내가 가지고 있는 파일의 지문이
같으면 됩니다.
파일 이름이 같다고 믿는 것보다 훨씬 정확합니다.
특히 한글패치에서
패치 프로그램은 정상인데 계속 실패하거나,
원본 ROM이 맞는지 확신이 없다면
가장 먼저 해시부터 확인해보는 것이 좋습니다.
아무튼 CRC32, MD5, SHA1이라는 긴 숫자가 보이더라도 어렵게 생각할 필요는 없습니다.
결국 확인하려는 것은 하나입니다.
“내가 가진 ROM이 제작자가 사용한 ROM과 같은 파일인가?”
그것을 가장 간단하게 확인하는 방법이 해시입니다.

