[comp.lang.postscript] Encrypting portions of PS file

p_davis@epik.enet.dec.com (Peter Davis) (09/13/90)

I've noticed that font files, from Adobe at least, typically contain some
preliminary stuff in plain old "readable" PostScript, but then the actual glyph
definitions appear to be encoded in some way.

I'd like to encrypt the prolog of PostScript files my application in generating,
and then revert to plain text PostScript for the remainder of the file.  Does
anyone know if this is possible?  How?

Thanks.
-pd

woody@chinacat.Unicom.COM (Woody Baker @ Eagle Signal) (09/14/90)

In article <1660@shodha.enet.dec.com>, p_davis@epik.enet.dec.com (Peter Davis) writes:
> 
> I've noticed that font files, from Adobe at least, typically contain some
> preliminary stuff in plain old "readable" PostScript, but then the actual glyph
> definitions appear to be encoded in some way.
> 
> I'd like to encrypt the prolog of PostScript files my application in generating,
> and then revert to plain text PostScript for the remainder of the file.  Does
> anyone know if this is possible?  How?
> 
> Thanks.
> -pd


#include "stdio.h"


/*
	routine takes an encrypted eexec file and creates a
	decrypted eexec file.  First cut is much simpler than
	the full decryption would be.  Full decryption will handle
	multiple keys, and have the flag to encrypt or decrypt things.
*/

FILE *infile,*outfile;

main(argc,argv)
char *argv[];
int argc;
{
int first =4;
int state=0xD971;
int c;
char decrptd;

	if(argc !=3)
		{
		printf("usage:  decrpt infile outfile\n");
		exit(0);
		};

	infile=fopen(argv[1],"rb");
	outfile=fopen(argv[2],"wb");
	
	while(fscanf(infile,"%2x",&c)>0)
		{
	/*	if(first !=0)	
			{
			first--;
			}

		else
			{ */
			decrptd= c ^ (state >>8);
			if(first !=0)
				{
				first--;
				}

			else
				{	
				fputc(decrptd,outfile);
				}

			state=state + c;
			state=state * 0xCE6D;
			state=state + 0x58BF;
		/*	} */
		}

	fclose(infile);
	fclose(outfile);	
}				

		
/* Quickie to convert postscript from stdin to eexec format on stdout */

#include "stdio.h"

static unsigned short buffer = 0xd971;
static unsigned long startup = 0xac7252f3; /* 00000000or whatever you want */

main(argc,argv)
char *argv[];
int argc;
{
  unsigned char input;
  unsigned char output;
  int init = 4;
  int i;
  int result;
  FILE *infile,*outfile;

	if(argc !=4)
		{
		printf("usage: encrypt startkey(long hex) infile outfile\n");
		}

	infile=fopen(argv[2],"r");
	outfile=fopen(argv[3],"wb");
	sscanf(argv[1],"%lx",&startup);
		
  fprintf(outfile,"%08lx",startup);
  for (i=0;i<4;++i)
    {
      input = (startup >> ((3-i)*8));
      buffer = (input + buffer) * 0xce6d + 0x58bf;
    }  


  for(;;)
    {
      for (i=0;i<(32-init);++i)
        {
          input = result = fgetc(infile);
          if ((int)result == EOF)
            break;
          output = (input ^ (buffer>>8));
          buffer = (output + buffer) * 0xce6d + 0x58bf;
          fprintf(outfile,"%02.2x",output);
        }

      init = 0;
      fprintf(outfile,"\n");
      if ((int) result == EOF)
      break;
    }

    fclose(infile);
    fclose(outfile);
}

/* Quickie to convert eexec format from stdin to postscript on stdout */

#include <stdio.h>

/* Written by Carsten Wiethoff 1989 */
/* You may do what you want with this code, 
   as long as this notice stays in it */

static unsigned short buffer = 0xd971;

main()
{
  unsigned int input;
  char output;
  int ignore = 4;
  int result;

  do
    {
      result = scanf(" %2x",&input);
      if ( (result == EOF) || (result == 0) )
        break;
      output = input ^ (buffer>>8);
      buffer = (input + buffer) * 0xce6d + 0x58bf;
      if ( ignore > 0 ) 
        {
          ignore--;
        }

      else
        {
          printf("%c",output);
        }

    } while (1);

}


/* Quickie to convert postscript from stdin to eexec format on stdout */

#include "stdio.h"

static unsigned short buffer = 0xd971;
static unsigned long startup = 0xac7252f3; /* 00000000or whatever you want */

main()
{
  unsigned char input;
  unsigned char output;
  int init = 4;
  int i;
  int result;

  printf("%08lx",startup);
  for (i=0;i<4;++i)
    {
      input = (startup >> ((3-i)*8));
      buffer = (input + buffer) * 0xce6d + 0x58bf;
    }  


  for(;;)
    {
      for (i=0;i<(32-init);++i)
        {
          input = result = getchar();
          if ((int)result == EOF)
            break;
          output = (input ^ (buffer>>8));
          buffer = (output + buffer) * 0xce6d + 0x58bf;
          printf("%02x",output);
        }

      init = 0;
      printf("\n");
      if ((int) result == EOF)
      break;
    }
}

Cheers
Woody