← home

Алгоритм вычисления CVV/CVV2

2015-01-13

CSC/CVV

CVV – Card Verification Value (в терминологии Visa), оно же CSC – Card Verification Code (в терминологии MasterCard) состоит из трех цифр и хранится на магнитной полосе карты.

Для вычисления CVV/CSC требуются следующие данные:

Expiration Date и Service Code последовательно соединяются друг с другом, дополняются нулями до длины в 16 символов. Получается Block2:

0916 101 000000000

Для операций шифрования используется ключ двойной длины:

CVVKey: 4C37C8319D76ADAB 58D9431543C2165B
CVVKeyL: 4C37C8319D76ADAB
CVVKeyR: 58D9431543C2165B

Алгоритм вычисления CSC/CVV таков:

  1. PAN шифруется алгоритмом DES (именно DES, а не Triple DES) с помощью ключа CVVKeyL:
des(CVVKeyL, PAN) = des(4C37C8319D76ADAB, 4433678298261175) = C19F07316463054E
  1. Результат этой операции XOR-ится с Block2:
xor(0916101000000000, C19F07316463054E) = C88917216463054E
  1. Результат операции 2 шифруется алгоритмом 3DES с помощью ключа CVVKey:
3des(4C37C8319D76ADAB 58D9431543C2165B, C88917216463054E) = B4C78A032A4F6551
  1. Из результата операции 3 слева направо последовательно выбираются три цифры, которые и формируют значение CVV данной карты. В нашем случае это 478.

CVV2/CSC2

CVV2 (в случае Visa) и CSC2 (в случае MasterCard) – это три цифры, которые наносятся на обратную сторону карты. CSC2/CVV2 предназначен для выполнения операций “Card Not Present” – например, покупок в интернете. Вводя значение CVV2, вы тем самым подтверждаете, что карта физически находится у вас в руках. Алгоритм вычисления CSC2 идентичен алгоритму вычисления CSC/CVV, за исключением того, что сервис-код имеет значение 000:

Для операций шифрования также используется ключ двойной длины (в моём примере ключи CVVKey и CVV2Key совпадают, в реальном мире они конечно же различны):

CVV2Key: 4C37C8319D76ADAB 58D9431543C2165B
CVV2KeyL: 4C37C8319D76ADAB
CVV2KeyR: 58D9431543C2165B

Здесь всё то же самое:

  1. PAN шифруется алгоритмом DES с помощью ключа CVV2KeyL:
des(CVV2KeyL, PAN) = des(4C37C8319D76ADAB, 4433678298261175) = C19F07316463054E
  1. Результат этой операции XOR-ится с Block2:
xor(0916000000000000, C19F07316463054E) = C88907316463054E
  1. Результат операции 2 шифруется алгоритмом 3DES с помощью ключа CVV2Key:
3des(4C37C8319D76ADAB 58D9431543C2165B, C88907316463054E) = D00AA1E607A144BE
  1. Из результата операции 3 слева направо последовательно выбираются три цифры, которые и формируют значение CVV2 данной карты – 001 в нашем примере.