void cbc_encipher(const unsigned char *plaintext, unsigned char *ciphertext, const unsigned char *key, int size) { unsigned char temp[8]; int i; /***************************************************************************** * * * Encipher the initialization vector. * * * *****************************************************************************/ des_encipher(&plaintext[0], &ciphertext[0], key); /***************************************************************************** * * * Encipher the buffer using DES in CBC mode. * * * *****************************************************************************/ i = 8; while (i < size) { bit_xor(&plaintext[i], &ciphertext[i - 8], temp, 64); des_encipher(temp, &ciphertext[i], NULL); i = i + 8; } return; }
void des3_encrypt(des3_context *ctx, CHAR8 input, CHAR8 output) { DESContext *sched = ctx->sched; word32 out[2], xL, xR; xL = GET_32BIT_MSB_FIRST(input); xR = GET_32BIT_MSB_FIRST(input+4); des_encipher(out, xL, xR, sched); xL = out[0]; xR = out[1]; des_decipher(out, xL, xR, sched+1); xL = out[0]; xR = out[1]; des_encipher(out, xL, xR, sched+2); PUT_32BIT_MSB_FIRST(output, out[0]); PUT_32BIT_MSB_FIRST(output+4, out[1]); }
static void des_cbc3_decrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *scheds) { word32 out[2], iv0, iv1, xL, xR; unsigned int i; assert((len & 7) == 0); iv0 = scheds->div0; iv1 = scheds->div1; for (i = 0; i < len; i += 8) { xL = GET_32BIT_MSB_FIRST(src); src += 4; xR = GET_32BIT_MSB_FIRST(src); src += 4; des_decipher(out, xL, xR, &scheds[2]); des_encipher(out, out[0], out[1], &scheds[1]); des_decipher(out, out[0], out[1], &scheds[0]); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; iv0 = xL; iv1 = xR; } scheds->div0 = iv0; scheds->div1 = iv1; }
static void test_des() { unsigned char destmp[8]; unsigned char desptx[8]; unsigned char desctx[8]; unsigned char deskey[8]; fprintf(stdout, "Enciphering with DES\n"); destmp[0] = 0xa9; destmp[1] = 0x10; destmp[2] = 0x11; destmp[3] = 0x38; destmp[4] = 0x93; destmp[5] = 0xca; destmp[6] = 0xb4; destmp[7] = 0xa1; deskey[0] = 0x01; deskey[1] = 0x1f; deskey[2] = 0x01; deskey[3] = 0x1f; deskey[4] = 0x01; deskey[5] = 0x0e; deskey[6] = 0x01; deskey[7] = 0x0e; fprintf(stdout, "Before enciphering\n"); print_des_8(destmp, "destmp"); print_des_8(deskey, "deskey"); des_encipher(destmp, desctx, deskey); fprintf(stdout, "After enciphering\n"); print_des_8(destmp, "destmp"); print_des_8(desctx, "desctx"); fprintf(stdout, "Before deciphering\n"); print_des_8(desctx, "desctx"); print_des_8(deskey, "deskey"); des_decipher(desctx, desptx, deskey); fprintf(stdout, "After deciphering\n"); print_des_8(desctx, "desctx"); print_des_8(desptx, "desptx"); fprintf(stdout, "\n"); return; }
static void des_cbc_encrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *sched) { word32 out[2], iv0, iv1; unsigned int i; assert((len & 7) == 0); iv0 = sched->eiv0; iv1 = sched->eiv1; for (i = 0; i < len; i += 8) { iv0 ^= GET_32BIT_MSB_FIRST(src); src += 4; iv1 ^= GET_32BIT_MSB_FIRST(src); src += 4; des_encipher(out, iv0, iv1, sched); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; } sched->eiv0 = iv0; sched->eiv1 = iv1; }
int main(int argc, char **argv) { unsigned char destmp[8], desptx[8], desctx[8], deskey[8]; Huge rsatmp, rsaptx, rsactx; RsaPubKey rsapubkey; RsaPriKey rsaprikey; int i; /***************************************************************************** * * * Encipher some data using DES. * * * *****************************************************************************/ fprintf(stdout, "Enciphering with DES\n"); destmp[0] = 0xa9; destmp[1] = 0x10; destmp[2] = 0x11; destmp[3] = 0x38; destmp[4] = 0x93; destmp[5] = 0xca; destmp[6] = 0xb4; destmp[7] = 0xa1; deskey[0] = 0x01; deskey[1] = 0x1f; deskey[2] = 0x01; deskey[3] = 0x1f; deskey[4] = 0x01; deskey[5] = 0x0e; deskey[6] = 0x01; deskey[7] = 0x0e; fprintf(stdout, "Before enciphering\n"); fprintf(stdout, "destmp: %02x %02x %02x %02x %02x %02x %02x %02x\n", destmp[0], destmp[1], destmp[2], destmp[3], destmp[4], destmp[5], destmp[6], destmp[7]); fprintf(stdout, "deskey: %02x %02x %02x %02x %02x %02x %02x %02x\n", deskey[0], deskey[1], deskey[2], deskey[3], deskey[4], deskey[5], deskey[6], deskey[7]); des_encipher(destmp, desctx, deskey); fprintf(stdout, "After enciphering\n"); fprintf(stdout, "destmp: %02x %02x %02x %02x %02x %02x %02x %02x\n", destmp[0], destmp[1], destmp[2], destmp[3], destmp[4], destmp[5], destmp[6], destmp[7]); fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n", desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5], desctx[6], desctx[7]); fprintf(stdout, "Before deciphering\n"); fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n", desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5], desctx[6], desctx[7]); fprintf(stdout, "deskey: %02x %02x %02x %02x %02x %02x %02x %02x\n", deskey[0], deskey[1], deskey[2], deskey[3], deskey[4], deskey[5], deskey[6], deskey[7]); des_decipher(desctx, desptx, deskey); fprintf(stdout, "After deciphering\n"); fprintf(stdout, "desctx: %02x %02x %02x %02x %02x %02x %02x %02x\n", desctx[0], desctx[1], desctx[2], desctx[3], desctx[4], desctx[5], desctx[6], desctx[7]); fprintf(stdout, "desptx: %02x %02x %02x %02x %02x %02x %02x %02x\n", desptx[0], desptx[1], desptx[2], desptx[3], desptx[4], desptx[5], desptx[6], desptx[7]); /***************************************************************************** * * * Encipher some data using RSA. * * * *****************************************************************************/ fprintf(stdout, "Enciphering with RSA\n"); rsapubkey.e = 17; rsapubkey.n = 209; rsaprikey.d = 53; rsaprikey.n = 209; fprintf(stdout, "d=%d, e=%d, n=%d\n", rsaprikey.d, rsapubkey.e, rsapubkey.n); for (i = 0; i < 128; i++) { rsatmp = i; rsa_encipher(rsatmp, &rsactx, rsapubkey); rsa_decipher(rsactx, &rsaptx, rsaprikey); if (rsatmp == rsaptx) fprintf(stdout, "rsatmp=%5d, rsactx=%5d, rsaptx=%5d (OK)\n", rsatmp, rsactx, rsaptx); else fprintf(stdout, "rsatmp=%5d, rsactx=%5d, rsaptx=%5d (ERROR)\n", rsatmp, rsactx, rsaptx); } fprintf(stdout,"Crypto Demo finished"); return 0; }