카드번호의 비밀.rtf
DINKIssTyle

Lv.1 DINKIssTyle (61.♡.73.102)

2025년 7월 22일 PM 03:37 · 수정됨(16:22)

조회 2,968 공감 0


저는 25년 동안 기업들이 지구상에서 가장 진보된 AI 및 자동화 시스템을 구현하도록 도왔습니다.하지만 제가 접해본 가장 강력한 알고리즘 중 하나는 1954년에 만들어졌습니다. Luhn 알고리즘이라고 불리는 이 알고리즘은 전 세계의 거의 모든 신용카드를 조용히 검증합니다. AI도 없고, 데이터도 없고, 클라우드도 없습니다. 순수한 인간의 천재성만 있습니다. 작동 방식은 다음과 같습니다.

1️⃣ 오른쪽에서 두 번째 자리까지 두 배로 늘립니다.

2️⃣ 결과가 9보다 크면 숫자를 나누고 더합니다(14 → 1+4).

3️⃣ 모든 숫자를 더합니다.

4️⃣ 0으로 끝나면 카드가 유효합니다.간단합니다. 눈에 띄지 않습니다. 그리고 여전히 글로벌 규모로 실행됩니다. 제가 자주 말하는 것을 떠올리게 합니다.

---







다행입니다.. 저는 검증 못해요...



import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox
)


def calculate_luhn_checksum(number: str) -> int:
digits = [int(d) for d in number if d.isdigit()]
checksum = 0
double = False


for d in reversed(digits):
if double:
d = d * 2
if d > 9:
d -= 9
checksum += d
double = not double


return checksum % 10


def is_luhn_valid(number: str) -> bool:
return calculate_luhn_checksum(number) == 0


class LuhnChecker(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("룬 알고리즘 체크섬 확인기")
self.init_ui()


def init_ui(self):
layout = QVBoxLayout()


self.label = QLabel("번호를 입력하세요:")
self.input_field = QLineEdit()
self.check_button = QPushButton("체크")
self.result_label = QLabel("")


self.check_button.clicked.connect(self.check_luhn)


layout.addWidget(self.label)
layout.addWidget(self.input_field)
layout.addWidget(self.check_button)
layout.addWidget(self.result_label)


self.setLayout(layout)


def check_luhn(self):
number = self.input_field.text().strip()


if not number.isdigit():
QMessageBox.warning(self, "입력 오류", "숫자만 입력해 주세요.")
return


checksum = calculate_luhn_checksum(number)
valid = is_luhn_valid(number)


if valid:
self.result_label.setText(f"✅ 유효한 번호입니다 (체크섬: {checksum})")
else:
self.result_label.setText(f"❌ 유효하지 않은 번호입니다 (체크섬: {checksum})")


if __name__ == "__main__":
app = QApplication(sys.argv)
window = LuhnChecker()
window.show()
sys.exit(app.exec_())


채찍피티로 파이썬 스크립트를 짜보았습니다. 재미있네요 ㅎㅎ

당연하겠지만 주민등록번호는 체크섬 유효하군요 ㅋㅋㅋ

댓글 (13)

  • 효도르는효도를

    효도르는효도를 Lv.1

    25.07.22 · 211.♡.66.45

    밑에 분이 설명해주실겁니다.
  • DINKIssTyle

    DINKIssTyle Lv.1 작성자

    25.07.22 · 61.♡.73.102

    #include // atoi
    #include // strlen
    #include // bool

    bool checkLuhn(const char *pPurported)
    {
    int nSum = 0;
    int nDigits = strlen(pPurported);
    int nParity = (nDigits-1) % 2;
    char cDigit[2] = "\0";
    for (int i = nDigits; i > 0 ; i--)
    {
    cDigit[0] = pPurported[i-1];
    int nDigit = atoi(cDigit);

    if (nParity == i % 2)
    nDigit = nDigit * 2;

    nSum += nDigit/10;
    nSum += nDigit%10;
    }
    return 0 == nSum % 10;
    }

    개발자 분들 읽기 편하게 C국어로 번역한 것도 올려드립니다.
  • LegenD

    LegenD Lv.1

    25.07.22 · 222.♡.87.4

    아멕스는 알고리즘을 다른거 쓰나보네요 15자리던데.. ㄷㄷ
  • DINKIssTyle

    DINKIssTyle Lv.1 → LegenD 작성자

    25.07.22 · 61.♡.73.102

    한번 계산해봐주세요! 0으로 끝나나 궁금합니다!
  • LegenD

    LegenD Lv.1 → DINKIssTyle

    25.07.22 · 222.♡.87.4

    현재 아멕스카드가 없어서.. 사실 있어도 계산 못할거 같지만요 ㅠㅠ
  • 케이엠8

    케이엠8 Lv.1 → DINKIssTyle

    25.07.22 · 14.♡.58.74

    잘 됩니다. 오른쪽부터 세어서 second digit에 2배하는 것만 유념하면 15자리 카드번호도 통과합니다.
  • DINKIssTyle

    DINKIssTyle Lv.1 → 케이엠8 작성자

    25.07.22 · 61.♡.73.102

    파이썬으로 짜서 해보니 재미있네요. 자릿수는 상관이가 없네요. ㅎㅎ
  • A350

    A350 Lv.1

    25.07.22 · 104.♡.68.24

    주민등록번호도 마지막이 체크섬이었죠
  • 0sRacco

    0sRacco Lv.1

    25.07.22 · 164.♡.222.147

    네 저는 현금만 씁니다.
  • 비읍

    비읍 Lv.1

    25.07.22 · 116.♡.148.36

    장동민은 지니어스 게임에서 16자리 번호 3개 보여주고 공통점을 찾으라고 하면 저공식 찾아낼 것같아요 ㄷㄷ

댓글을 작성하려면 이 필요합니다.