|
|
1.1 ! root 1: /* ! 2: * data encryption and decryption program ! 3: */ ! 4: #include <stdio.h> ! 5: ! 6: typedef union { ! 7: long words[2]; ! 8: char bytes[8]; ! 9: } block; ! 10: extern long keys_L[], keys_H[]; ! 11: ! 12: main(argc, argv) ! 13: char *argv[]; ! 14: { ! 15: static block key; ! 16: static block icv; ! 17: static block in; ! 18: register char *cp; ! 19: register c; ! 20: register i; ! 21: char *cpretry; ! 22: static char buf[512]; ! 23: extern char *getpass(); ! 24: ! 25: /* ! 26: * generate key by crunching user supplied string. ! 27: */ ! 28: if (argc > 2) { ! 29: fprintf(stderr, "usage: %s key <stdin >stdout\n", argv[0]); ! 30: exit(1); ! 31: } ! 32: if (argc == 2) { ! 33: strncpy(buf, argv[1], 512); ! 34: cp = argv[1]; ! 35: while (*cp) ! 36: *cp++ = '\0'; ! 37: cp = buf; ! 38: } ! 39: else { ! 40: for (cp=cpretry=(char*)NULL; ;) { ! 41: cp = getpass("Enter Key: "); ! 42: cp = (char*)strcpy(buf,cp); ! 43: cpretry = getpass("Reenter Key for Verification: "); ! 44: if (strcmp(cp,cpretry)) ! 45: fprintf(stderr,"Sorry, keys don't match.\n"); ! 46: else { ! 47: while (*cpretry) *cpretry++ = '\0'; ! 48: break; ! 49: } ! 50: } ! 51: } ! 52: key.words[0] = 0; /* modification April 28, 1982 */ ! 53: key.words[1] = 0; ! 54: compkeys("canofbugs", 0); ! 55: for (i = 0; *cp; i = ++i & 07) { ! 56: key.bytes[i & 07] ^= *cp; ! 57: *cp++ = '\0'; ! 58: if (i == 07) ! 59: des(&key, &key); ! 60: } ! 61: des(&key, &key); ! 62: /* ! 63: * set initial chaining value ! 64: */ ! 65: des("numbersoup", &icv); ! 66: cp = argv[0]; ! 67: for (i = strlen(cp); i >= 0; --i) ! 68: if (cp[i] == '/') ! 69: break; ! 70: cp += i + 1; ! 71: i = 0; ! 72: if (strcmp(cp, "encrypt") == 0) { ! 73: compkeys(&key, 0); ! 74: while (i = fread(key.bytes, 1, 8, stdin)) { ! 75: if (i != 8) ! 76: des(&icv, &icv); ! 77: icv.words[0] ^= key.words[0]; ! 78: icv.words[1] ^= key.words[1]; ! 79: if (i == 8) ! 80: des(&icv, &icv); ! 81: fwrite(icv.bytes, 1, i, stdout); ! 82: } ! 83: } else if (strcmp(cp, "decrypt") == 0) { ! 84: compkeys(&key, 1); ! 85: while (i = fread(in.bytes, 1, 8, stdin)) { ! 86: if (i == 8) { ! 87: des(&in, &key); ! 88: icv.words[0] ^= key.words[0]; ! 89: icv.words[1] ^= key.words[1]; ! 90: } else { ! 91: keyreverse(); ! 92: des(&icv, &icv); ! 93: icv.words[0] ^= in.words[0]; ! 94: icv.words[1] ^= in.words[1]; ! 95: } ! 96: fwrite(icv.bytes, 1, i, stdout); ! 97: icv.words[0] = in.words[0]; ! 98: icv.words[1] = in.words[1]; ! 99: } ! 100: } else { ! 101: fprintf(stderr, "zeroth argument must be 'encrypt' or 'decrypt'\n"); ! 102: exit(1); ! 103: } ! 104: } ! 105: keyreverse() ! 106: { ! 107: register i; ! 108: register j; ! 109: ! 110: for (i = 0; i < 8; i++) { ! 111: j = keys_L[i]; ! 112: keys_L[i] = keys_L[15-i]; ! 113: keys_L[15-i] = j; ! 114: j = keys_H[i]; ! 115: keys_H[i] = keys_H[15-i]; ! 116: keys_H[15-i] = j; ! 117: } ! 118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.