home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / crypt.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  4KB  |  101 lines

  1. /****************************************************************/
  2. /*                                                              */
  3. /*      S-CODER - Encrypt/decrypt data                          */
  4. /*                                                              */
  5. /*      Copyright 1987-1989 by Robert B. Stout dba MicroFirm    */
  6. /*                                                              */
  7. /*      Originally written by Bob Stout with modifications      */
  8. /*      suggested by Mike Smedley.                              */
  9. /*                                                              */
  10. /*      This code may be used freely in any program for any     */
  11. /*      application, personal or commercial.                    */
  12. /*                                                              */
  13. /*  Current commercial availability:                            */
  14. /*                                                              */
  15. /*      1. MicroFirm Toolkit ver 3.00: LYNX and CRYPT utilities */
  16. /*      2. CXL libraries (MSC, TC, ZTC/C++, PC): fcrypt()       */
  17. /*         dedicated file encryption function                   */
  18. /*      3. SMTC & MFLZT libraries: crypt() function             */
  19. /*                                                              */
  20. /****************************************************************/
  21.  
  22. char *cryptext;         /* The actual encryption/decryption key */
  23. int   crypt_ptr = 0;    /* Circular pointer to elements of key  */
  24. int   crypt_length;     /* Set externally to strlen(cryptext)   */
  25.  
  26. /* NOTES: cryptext should be set and qualified (to something over
  27.           5-6 chars, minimum) by the calling program, which should
  28.           also set crypt_ptr in the range of 0 to strlen(cryptext)
  29.           before each use. If crypt() is used to encrypt several
  30.           buffers, cryptext should be reloaded and crypt_ptr reset
  31.           before each buffer is encrypted. The encryption is both
  32.           reversible - to decrypt data, pass it back through crypt()
  33.           using the original key and original initial value of
  34.           crypt_ptr - and multiple passes are commutative.
  35. */
  36.  
  37. /**** Encrypt/decrypt buffer datum ******************************/
  38.  
  39. void crypt(unsigned char *buf)
  40. {
  41.       *buf ^= cryptext[crypt_ptr] ^ (cryptext[0] * crypt_ptr);
  42.       cryptext[crypt_ptr] += ((crypt_ptr < (crypt_length - 1)) ?
  43.             cryptext[crypt_ptr + 1] : cryptext[0]);
  44.       if (!cryptext[crypt_ptr])
  45.             cryptext[crypt_ptr] += 1;
  46.       if (++crypt_ptr >= crypt_length)
  47.             crypt_ptr = 0;
  48. }
  49.  
  50. /**** Encrypt/decrypt buffer ************************************/
  51.  
  52. void bufcrypt(unsigned char *buf, long length)
  53. {
  54.       while (length--)
  55.             crypt(buf++);
  56. }
  57.  
  58. #ifdef TEST
  59.  
  60. #include <stdio.h>
  61. #include <string.h>
  62.  
  63. int main(int argc, char *argv[])
  64. {
  65.       static char buf[16384];
  66.       size_t len, i;
  67.       FILE *in, *out;
  68.  
  69.       if (4 > argc)
  70.       {
  71.             puts("Usage: CRYPT password infile outfile");
  72.             return -1;
  73.       }
  74.       cryptext = argv[1];
  75.       crypt_length = strlen(cryptext);
  76.       if (NULL == (in = fopen(argv[2], "rb")))
  77.       {
  78.             printf("Can't open %s for input\n", argv[2]);
  79.             return -1;
  80.       }
  81.       if (NULL == (out = fopen(argv[3], "wb")))
  82.       {
  83.             printf("Can't open %s for output\n", argv[3]);
  84.             return -1;
  85.       }
  86.       do
  87.       {
  88.             if (0 != (len = fread(buf, 1, 16384, in)))
  89.             {
  90.                   for (i = 0; i < len; ++i)
  91.                         crypt(&buf[i]);
  92.                   fwrite(buf, 1, len, out);
  93.             }
  94.       } while (len);
  95.       fclose(in);
  96.       fclose(out);
  97.       return 0;
  98. }
  99.  
  100. #endif
  101.