⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 descheck.c

📁 银行使用加密算法源码及举例
💻 C
字号:
#include <stdio.h>
#include <io.h>
#include <dos.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include "ansides.ch"

#define BIOS

#ifdef BIOS
  #include <bios.h>
  #define DATA_READY 0x100
  enum HandShake   {SOH = 0x01, STX = 0x02, ETX = 0x03, EOT = 0x04,
                    ENQ = 0x05, ACK = 0x06, NAK = 0x15, ESC = 0x1B};
#else
  #define  QSIZE 200
  #include "queue.ch"

  #include "commdrv.ch"
#endif

#define TOC 3

int           Port, TempChar, Step, DataLen, Index;
unsigned char R_Data[1000], S_Data[1000], T_Data[1000],
              DesKey[8], AKeyIndex, lrc;
unsigned char abMasterKey[8], abWorkingKey[8], abPinData[8], abPan[25], abPin[8];
unsigned char abWorkingBuf[8], abPinBuf[8], abBuffer[40], abKbdBuf[40];
struct date   CDate;
struct time   CTime;
time_t        Time1, Time2;

const unsigned char AKey[10][8] = {
  "\x46\x10\x48\x03\x42\x35\x17\x62",
  "\x10\x16\x86\x74\x88\x41\x29\x47",
  "\x57\x11\x38\x42\x34\x79\x62\x59",
  "\x21\x26\x17\x12\x72\x85\x91\x60",
  "\x68\x22\x55\x50\x18\x81\x23\x52",
  "\x33\x27\x07\x27\x24\x19\x66\x66",
  "\x70\x23\x55\x98\x69\x25\x98\x78",
  "\x44\x21\x04\x66\x05\x23\x30\x50",
  "\x81\x26\x56\x03\x41\x39\x63\x61",
  "\x55\x22\x24\x74\x86\x68\x05\x86"
};

void split(unsigned char abTarget[], unsigned char abSource[], int wLen)
{
  int i;
  int bJ;
  for (i = 0; i < wLen; i++) {
    bJ = abSource[i] / 16;
    if (bJ > 9)
      abTarget[i*2] = bJ + 'A' - 10;
    else
      abTarget[i*2] = bJ + '0';
    bJ = abSource[i] % 16;
    if (bJ > 9)
      abTarget[i*2+1] = bJ + 'A' - 10;
    else
      abTarget[i*2+1] = bJ + '0';
  }
}


void compress(unsigned char abTarget[], unsigned char abSource[], unsigned int wLen)
{
  unsigned int wI;
  unsigned char bT1, bT2;

  for (wI = 0; wI < wLen; wI++) {
    bT1 = abSource[wI*2];
    bT1 = (bT1 >= 'A') ? bT1-7 : bT1;
    bT2 = abSource[wI*2+1];
    bT2 = (bT2 >= 'A') ? bT2-7 : bT2;
    abTarget[wI] = ((bT1&0x0f)<<4) | (bT2&0x0f);
  }
}

void encrypt(void)
{
  int bJ;
    memset(abBuffer, '0', 16);

    if (abPan[0] > 16) {
      memcpy(&abBuffer[1], &abPan[abPan[0]-15], 15);
      abBuffer[0] = abPan[abPan[0]];
    } else {
      memcpy(&abBuffer[17-abPan[0]], &abPan[1], abPan[0]-1);
      abBuffer[0] = abPan[abPan[0]];
    }

    compress(&abBuffer[16], abBuffer, 8);
    abBuffer[16] = 0;
    abBuffer[17] = 0;

    abBuffer[0] = 6;
    memset(&abBuffer[1], 0xff, 7);
    compress(&abBuffer[1], abPin, abBuffer[0]/2);

    for (bJ = 0; bJ < 8; bJ++)
      printf(" %02x", abBuffer[16+bJ]);

    for (bJ = 0; bJ < 8; bJ++)
      abBuffer[bJ+16] ^= abBuffer[bJ];

    for (bJ = 0; bJ < 8; bJ++)
      printf(" %02x", abBuffer[16+bJ]);


    memcpy(abPinData, &abBuffer[16], 8);

    des(abPinData, abPinBuf, abWorkingKey, 1);

    printf("\nPin Data:\n");

    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abPinBuf[bJ]);


}

void unencrypt(void)
{
  int bJ;
    des(abPinBuf, abPinData, abWorkingKey, 0);

    if (abPan[0] > 16) {
      memcpy(&abBuffer[1], &abPan[abPan[0]-15], 15);
      abBuffer[0] = abPan[abPan[0]];
    } else {
      memcpy(&abBuffer[17-abPan[0]], &abPan[1], abPan[0]-1);
      abBuffer[0] = abPan[abPan[0]];
    }

    compress(&abBuffer[16], abBuffer, 8);
    abBuffer[16] = 0;
    abBuffer[17] = 0;

    abBuffer[0] = 6;
/*
    memset(&abBuffer[1], 0xff, 7);
    compress(&abBuffer[1], abPin, abBuffer[0]/2);
*/
    for (bJ = 0; bJ < 8; bJ++)
      abBuffer[bJ+16] ^= abPinData[bJ];
    memcpy(abPin, &abBuffer[16], 8);


}

void main(void)
{
  int bJ;
  unsigned char abPinData[8];

  system("cls");
/****
    des("\xFB\x73\xD5\x3C\x41\xF9\xCF\x8C", abBuffer, "\x11\x11\x11\x11\x11\x11\x11\x11",
0);

    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abBuffer[bJ]);

    printf("\n");

    des("\x13\xFC\xCA\xDD\x5D\xB0\x46\x50", &abBuffer[16], abBuffer, 1);

    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abBuffer[16+bJ]);

    printf("\n\nPlease input card no len : ");
    scanf("%d", &abPan[0]);
    printf("Please input card no     : ");
    scanf("%s", &abPan[1]);
    abPan[0] = 16;
    memcpy(&abPan[1], "4580643022125969", 16);
    printf("Please input pin         : ");
    scanf("%s", abPin);
    printf("Please input master key(16)  : ");
    scanf("%s", abBuffer);
    compress(abMasterKey, abBuffer, 8);

    printf("Please input working key(16) : ");
    scanf("%s", abBuffer);
    compress(abWorkingBuf, abBuffer, 8);

    memcpy(abMasterKey, AKey[0], 8);
    memcpy(abWorkingBuf, "11111111", 8);

    des(abWorkingBuf, abBuffer, abMasterKey, 0);
//  des(abBuffer, abWorkingKey, abMasterKey, 0);
    memcpy(abWorkingKey, abBuffer, 8);

    encrypt();

    printf("\nPin Data:\n");

    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abPinBuf[bJ]);

    unencrypt();

    printf("\nPin:\n");
    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abPin[bJ]);
*****/

    printf("\n");
    des("\xee\x0d\x09\xe1\xba\xe2\x30\x3e", abWorkingKey, "ricompos", 0);
//    split(abBuffer, "\x89\x03\x3b\x47\x93\xee\xc1\x65", 8);

//    des(abBuffer, abBuffer, abWorkingKey, 1);

//    for(bJ=0;bJ<8;bJ++)
//      abBuffer[bJ]^=abBuffer[8+bJ];

//    des(abBuffer, abBuffer, abWorkingKey, 1);
//    split(abKbdBuf, abBuffer, 8);

    for (bJ = 0; bJ < 8; bJ++)
      printf("%02x ", abWorkingKey[bJ]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -