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

📄 desc.c

📁 椭圆曲线密码C实现的
💻 C
📖 第 1 页 / 共 2 页
字号:
  UINT4 inputBlock[2], work[2];  unsigned int i;    if (len % 8)    return (RE_LEN);  for (i = 0; i < len/8; i++)  {    Pack (inputBlock, &input[8*i]);            /* Chain if encrypting, and xor with whitener.     */    if (context->encrypt) {      work[0] =        inputBlock[0] ^ context->iv[0] ^ context->inputWhitener[0];      work[1] =        inputBlock[1] ^ context->iv[1] ^ context->inputWhitener[1];    }    else {      work[0] = inputBlock[0] ^ context->outputWhitener[0];      work[1] = inputBlock[1] ^ context->outputWhitener[1];             }    DESFunction (work, context->subkeys);    /* Xor with whitener, chain if decrypting, then update IV.     */    if (context->encrypt) {      work[0] ^= context->outputWhitener[0];      work[1] ^= context->outputWhitener[1];      context->iv[0] = work[0];      context->iv[1] = work[1];    }    else {      work[0] ^= context->iv[0] ^ context->inputWhitener[0];      work[1] ^= context->iv[1] ^ context->inputWhitener[1];      context->iv[0] = inputBlock[0];      context->iv[1] = inputBlock[1];    }    Unpack (&output[8*i], work);  }    /* Zeroize sensitive information.   */  R_memset ((POINTER)inputBlock, 0, sizeof (inputBlock));  R_memset ((POINTER)work, 0, sizeof (work));    return (0);}void DESX_CBCRestart (context)DESX_CBC_CTX *context;{  /* Reset to the original IV */  context->iv[0] = context->originalIV[0];  context->iv[1] = context->originalIV[1];}/* Initialize context.  Caller must zeroize the context when finished. */void DES3_CBCInit(context, key, iv, encrypt)DES3_CBC_CTX *context;                                           /* context */unsigned char key[24];                                               /* key */unsigned char iv[8];                                 /* initializing vector */int encrypt;                     /* encrypt flag (1 = encrypt, 0 = decrypt) */{    /* Copy encrypt flag to context.   */  context->encrypt = encrypt;  /* Pack initializing vector into context.   */  Pack (context->iv, iv);  /* Save the IV for use in Restart */  context->originalIV[0] = context->iv[0];  context->originalIV[1] = context->iv[1];  /* Precompute key schedules.   */  DESKey (context->subkeys[0], encrypt ? key : &key[16], encrypt);  DESKey (context->subkeys[1], &key[8], !encrypt);  DESKey (context->subkeys[2], encrypt ? &key[16] : key, encrypt);}int DES3_CBCUpdate (context, output, input, len)DES3_CBC_CTX *context;                                           /* context */unsigned char *output;                                      /* output block */unsigned char *input;                                        /* input block */unsigned int len;                      /* length of input and output blocks */{  UINT4 inputBlock[2], work[2];  unsigned int i;    if (len % 8)    return (RE_LEN);  for (i = 0; i < len/8; i++) {    Pack (inputBlock, &input[8*i]);            /* Chain if encrypting.     */    if (context->encrypt) {      work[0] = inputBlock[0] ^ context->iv[0];      work[1] = inputBlock[1] ^ context->iv[1];    }    else {      work[0] = inputBlock[0];      work[1] = inputBlock[1];             }    DESFunction (work, context->subkeys[0]);    DESFunction (work, context->subkeys[1]);    DESFunction (work, context->subkeys[2]);    /* Chain if decrypting, then update IV.     */    if (context->encrypt) {      context->iv[0] = work[0];      context->iv[1] = work[1];    }    else {      work[0] ^= context->iv[0];      work[1] ^= context->iv[1];      context->iv[0] = inputBlock[0];      context->iv[1] = inputBlock[1];    }    Unpack (&output[8*i], work);  }    /* Zeroize sensitive information.   */  R_memset ((POINTER)inputBlock, 0, sizeof (inputBlock));  R_memset ((POINTER)work, 0, sizeof (work));    return (0);}void DES3_CBCRestart (context)DES3_CBC_CTX *context;{  /* Reset to the original IV */  context->iv[0] = context->originalIV[0];  context->iv[1] = context->originalIV[1];}static void Pack (into, outof)UINT4 *into;unsigned char *outof;{  *into    = (*outof++ & 0xffL) << 24;  *into   |= (*outof++ & 0xffL) << 16;  *into   |= (*outof++ & 0xffL) << 8;  *into++ |= (*outof++ & 0xffL);  *into    = (*outof++ & 0xffL) << 24;  *into   |= (*outof++ & 0xffL) << 16;  *into   |= (*outof++ & 0xffL) << 8;  *into   |= (*outof   & 0xffL);}static void Unpack (into, outof)unsigned char *into;UINT4 *outof;{  *into++ = (unsigned char)((*outof >> 24) & 0xffL);  *into++ = (unsigned char)((*outof >> 16) & 0xffL);  *into++ = (unsigned char)((*outof >>  8) & 0xffL);  *into++ = (unsigned char)( *outof++      & 0xffL);  *into++ = (unsigned char)((*outof >> 24) & 0xffL);  *into++ = (unsigned char)((*outof >> 16) & 0xffL);  *into++ = (unsigned char)((*outof >>  8) & 0xffL);  *into   = (unsigned char)( *outof        & 0xffL);}static void DESKey (subkeys, key, encrypt)UINT4 subkeys[32];unsigned char key[8];int encrypt;{  UINT4 kn[32];  int i, j, l, m, n;  unsigned char pc1m[56], pcr[56];  for (j = 0; j < 56; j++) {    l = PC1[j];    m = l & 07;    pc1m[j] = (unsigned char)((key[l >> 3] & BYTE_BIT[m]) ? 1 : 0);  }  for (i = 0; i < 16; i++) {    m = i << 1;    n = m + 1;    kn[m] = kn[n] = 0L;    for (j = 0; j < 28; j++) {      l = j + TOTAL_ROTATIONS[i];      if (l < 28)        pcr[j] = pc1m[l];      else        pcr[j] = pc1m[l - 28];    }    for (j = 28; j < 56; j++) {      l = j + TOTAL_ROTATIONS[i];      if (l < 56)        pcr[j] = pc1m[l];      else        pcr[j] = pc1m[l - 28];    }    for (j = 0; j < 24; j++) {      if (pcr[PC2[j]])        kn[m] |= BIG_BYTE[j];      if (pcr[PC2[j+24]])        kn[n] |= BIG_BYTE[j];    }  }  CookKey (subkeys, kn, encrypt);  /* Zeroize sensitive information.   */  R_memset ((POINTER)pc1m, 0, sizeof (pc1m));  R_memset ((POINTER)pcr, 0, sizeof (pcr));  R_memset ((POINTER)kn, 0, sizeof (kn));}static void CookKey (subkeys, kn, encrypt)UINT4 *subkeys;UINT4 *kn;int encrypt;{  UINT4 *cooked, *raw0, *raw1;  int increment;  unsigned int i;  raw1 = kn;  cooked = encrypt ? subkeys : &subkeys[30];  increment = encrypt ? 1 : -3;  for (i = 0; i < 16; i++, raw1++) {    raw0 = raw1++;    *cooked    = (*raw0 & 0x00fc0000L) << 6;    *cooked   |= (*raw0 & 0x00000fc0L) << 10;    *cooked   |= (*raw1 & 0x00fc0000L) >> 10;    *cooked++ |= (*raw1 & 0x00000fc0L) >> 6;    *cooked    = (*raw0 & 0x0003f000L) << 12;    *cooked   |= (*raw0 & 0x0000003fL) << 16;    *cooked   |= (*raw1 & 0x0003f000L) >> 4;    *cooked   |= (*raw1 & 0x0000003fL);    cooked += increment;  }}static void DESFunction (block, subkeys)UINT4 *block;UINT4 *subkeys;{  register UINT4 fval, work, right, left;  register int round;    left = block[0];  right = block[1];  work = ((left >> 4) ^ right) & 0x0f0f0f0fL;  right ^= work;  left ^= (work << 4);  work = ((left >> 16) ^ right) & 0x0000ffffL;  right ^= work;  left ^= (work << 16);  work = ((right >> 2) ^ left) & 0x33333333L;  left ^= work;  right ^= (work << 2);  work = ((right >> 8) ^ left) & 0x00ff00ffL;  left ^= work;  right ^= (work << 8);  right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;  work = (left ^ right) & 0xaaaaaaaaL;  left ^= work;  right ^= work;  left = ((left << 1) | ((left >> 31) & 1L)) & 0xffffffffL;    for (round = 0; round < 8; round++) {    work  = (right << 28) | (right >> 4);    work ^= *subkeys++;    fval  = SP7[ work        & 0x3fL];    fval |= SP5[(work >>  8) & 0x3fL];    fval |= SP3[(work >> 16) & 0x3fL];    fval |= SP1[(work >> 24) & 0x3fL];    work  = right ^ *subkeys++;    fval |= SP8[ work        & 0x3fL];    fval |= SP6[(work >>  8) & 0x3fL];    fval |= SP4[(work >> 16) & 0x3fL];    fval |= SP2[(work >> 24) & 0x3fL];    left ^= fval;    work  = (left << 28) | (left >> 4);    work ^= *subkeys++;    fval  = SP7[ work        & 0x3fL];    fval |= SP5[(work >>  8) & 0x3fL];    fval |= SP3[(work >> 16) & 0x3fL];    fval |= SP1[(work >> 24) & 0x3fL];    work  = left ^ *subkeys++;    fval |= SP8[ work        & 0x3fL];    fval |= SP6[(work >>  8) & 0x3fL];    fval |= SP4[(work >> 16) & 0x3fL];    fval |= SP2[(work >> 24) & 0x3fL];    right ^= fval;  }    right = (right << 31) | (right >> 1);  work = (left ^ right) & 0xaaaaaaaaL;  left ^= work;  right ^= work;  left = (left << 31) | (left >> 1);  work = ((left >> 8) ^ right) & 0x00ff00ffL;  right ^= work;  left ^= (work << 8);  work = ((left >> 2) ^ right) & 0x33333333L;  right ^= work;  left ^= (work << 2);  work = ((right >> 16) ^ left) & 0x0000ffffL;  left ^= work;  right ^= (work << 16);  work = ((right >> 4) ^ left) & 0x0f0f0f0fL;  left ^= work;  right ^= (work << 4);  *block++ = right;  *block = left;}

⌨️ 快捷键说明

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