what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

enigma-modification-peake.c

enigma-modification-peake.c
Posted Dec 21, 1999

enigma-modification-peake.c

tags | encryption, cryptography
SHA-256 | efc49083533e133aaaac93d47a222c857113118dca5eeb91fe3e8cd48a4c778e

enigma-modification-peake.c

Change Mirror Download
cat crypt
From philip@axis.UUCP Sun Feb 15 14:33:00 1987
Path: beno!seismo!mcvax!inria!axis!philip
From: philip@axis.UUCP
Newsgroups: net.sources
Subject: A crypt program
Keywords: A public domain crypt program
Message-ID: <177@axis.UUCP>
Date: 15 Feb 87 19:33:00 GMT
Organization: Axis Digital, Paris
Lines: 262
Posted: Sun Feb 15 19:33:00 1987


Crypt - Decrypt Program
~~~~~~~~~~~~~~~~~~~~~~~

This program is based upon the German WW2 enigma machine.

This worked as follows:

The machine contained several (3 or 4, depending upon the service) rotors,
with contacts on each face. Each rotor had a different mapping (ie wiring)
scheme between the contacts.

Each contact on the input side of rotor 1 was connected to input keys
(letters and numbers). Pressing the key marked 'A' would pass an electric
current into the corresponding contact on the input rotor, this current would
exit on some other contact on the output side, depending upon the internal
wiring.

After each key press, the input rotor would turn one position (thus, pressing
'A' again, would result in a current flowing out of a different output
contact.

After completing one revolution, rotor number two would move one position.

The key to this depended upon the order of the rotors, and their starting
positions.

To decode, simply reverse the current flow, ie, connect the keyboard to the
output, and replace the input by a series of lamps corresponding to the
keys.

This program simulates one of these machines, with several refinements:

1) Each rotor has 256 positions

2) The key is not the ordering and starting positions of the rotors,
since new and different rotors are created for each input key.

3) The movement of the rotors is not a simple as described above.
It is basically that, but with rotors selected on a random basis,
they are advanced a random number of positions.

The result is (I believe - not being a Cryptologist), somewhat more
secure than the original machines, and certainly more secure than the
original UNIX crypt - which has a single rotor, with a reciprocal
mapping - ie if an input of 'A' maps to an output of 'Z', then in the
same rotor position, a 'Z' must map to an 'A'.

if anyone finds a method of breaking this crypt program, I would be glad
to hear about it.

Philip Peake (philip@axis.uucp)

NOTES:
The program must have two links, one called crypt, and the other
called decrypt. Passing a crypted document through crypt again,
even with the same key, will not decrypt it.

===============================================================================
#include <stdio.h>

#define ROTORSIZ 256
#define MASK 0377
#define EMPTY 07777
#define X_SIZE 4099

char *strrchr();

unsigned r1[ROTORSIZ];
unsigned r2[ROTORSIZ];
unsigned r3[ROTORSIZ];

unsigned char x[X_SIZE];

init(password, decrypt)
char *password;
int decrypt;
{
register int index;
register int i;
int pipe_fd[2];
unsigned random;
long seed = 123L;
char buf[13];

strncpy(buf, password, 8);
while (*password) *password++ = '\0';
buf[8] = buf[0];
buf[9] = buf[1];

pipe(pipe_fd);

if (fork() == 0)
{
close(0);
close(1);
dup(pipe_fd[0]);
dup(pipe_fd[1]);
execl("/usr/lib/makekey", "-", 0);
execl("/lib/makekey", "-", 0);
exit(1);
}

write(pipe_fd[1], buf, 10);
wait((int *) NULL);

if (read(pipe_fd[0], buf, 13) != 13)
{
fprintf(stderr, "crypt: cannot generate key\n");
exit(1);
}

for (i = 0 ; i < ROTORSIZ; i++) r1[i] = r2[i] = r3[i] = EMPTY;

for (i = 2; i < 13; i++) seed = seed * buf[i] + i;

i = 0;
while (i < ROTORSIZ)
{
seed = (long)(5L * seed + (long)i);
random = (unsigned)(seed % 65521L);
index = (int)(random & MASK);
if (r1[index] == EMPTY)
r1[index] = i++;
else
continue;
}

i = 0;
while (i < ROTORSIZ)
{
seed = (long)(5L * seed + (long)i);
random = (unsigned)(seed % 65521L);
index = (int)(random & MASK);
if (r2[index] == EMPTY)
r2[index] = i++;
else
continue;
}

i = 0;
while (i < ROTORSIZ)
{
seed = (long)(5L * seed + (long)i);
random = (unsigned)(seed % 65521L);
index = (int)(random & MASK);
if (r3[index] == EMPTY)
r3[index] = i++;
else
continue;
}

for (i = 0; i < X_SIZE; i++)
{
seed = (long)(5L * seed + (long)i);
random = (unsigned)(seed % 65521L);
x[i] = random & 03;
}

if (decrypt)
{
invert(r1);
invert(r2);
invert(r3);
}
}

invert(r)
unsigned r[ROTORSIZ];
{
unsigned t[ROTORSIZ];
register int i;

for (i = 0; i < ROTORSIZ; i++) t[i] = r[i];
for (i = 0; i < ROTORSIZ; i++) r[t[i]] = i;
}

crypt()
{
register int ch;
register int i = 0;
register unsigned ofs1 = 0;
register unsigned ofs2 = 0;
register unsigned ofs3 = 0;

while ((ch = getchar()) != EOF)
{
putchar(r3[r2[r1[ch+ofs1&MASK]+ofs2&MASK]+ofs3&MASK]);

switch (x[i]){
case 00:
ofs1 = ++ofs1 & MASK;
break;
case 01:
ofs2 = ++ofs2 & MASK;
break;
case 02:
ofs3 = ++ofs3 & MASK;
break;
}

if (ofs1 == 0) ofs2 = ++ofs2 & MASK;
if (ofs2 == 0) ofs3 = ++ofs3 & MASK;

if (++i == X_SIZE) i = 0;
}
}

decrypt()
{
register int ch;
register int i = 0;
register unsigned ofs1 = 0;
register unsigned ofs2 = 0;
register unsigned ofs3 = 0;

while ((ch = getchar()) != EOF)
{
putchar(r1[r2[r3[ch]-ofs3&MASK]-ofs2&MASK]-ofs1&MASK);

switch (x[i]){
case 00:
ofs1 = ++ofs1 & MASK;
break;
case 01:
ofs2 = ++ofs2 & MASK;
break;
case 02:
ofs3 = ++ofs3 & MASK;
break;
}

if (ofs1 == 0) ofs2 = ++ofs2 & MASK;
if (ofs2 == 0) ofs3 = ++ofs3 & MASK;

if (++i == X_SIZE) i = 0;
}
}

main(argc, argv)
int argc;
char *argv[];
{
int flag;
char *p;

p = strrchr(argv[0], '/');

if (p == NULL) p = argv[0];
else ++p;

if (strcmp(p, "crypt") == 0) flag = 0;
else flag = 1;

if (argc != 2)
init(getpass("Enter key: "), flag);
else
init(argv[1], flag);

if (flag) decrypt();
else crypt();
}


From philip@axis.UUCP Wed Feb 18 06:17:24 1987
Path: beno!seismo!mcvax!inria!axis!philip
From: philip@axis.UUCP
Newsgroups: net.sources
Subject: Crypt program - mods.
Keywords: makekey replacement code
Message-ID: <180@axis.UUCP>
Date: 18 Feb 87 11:17:24 GMT
Organization: Axis Digital, Paris
Lines: 73
Posted: Wed Feb 18 11:17:24 1987

In the crypt program I recently posted, there was a call made to a
small program "/usr/lib/makekey". Apparently this does not exist on all
*IX* machines.

I really dont see why - it is a 4 or 5 line program which reads a
password on its stdin, and prints the encrypted result on its stdout,
using exactly the same routines as passwd does.

Rather than re-write the program, I have made some mods to the crypt source
to make the calls directly.

Since the library routine is called 'crypt', the routine within my program
has to change its name, 'encrypt' is also used in the library, so the
final name change is to 'encode'.

The following is a diff of the changes required (actually, the source becomes
smaller and simpler .... )

============================================================================

19a20
> char *crypt();
22d22
< int pipe_fd[2];
25c25,27
< char buf[13];
---
> char buf[14];
> char key[9];
> char salt[3];
27,30c29,32
< strncpy(buf, password, 8);
< while (*password) *password++ = '\0';
< buf[8] = buf[0];
< buf[9] = buf[1];
---
> strncpy(key, password, 8);
> salt[0] = key[0];
> salt[1] = key[1];
> salt[2] = '\0';
32c34
< pipe(pipe_fd);
---
> strncpy(buf, crypt(key, salt), 13);
34,53d35
< if (fork() == 0)
< {
< close(0);
< close(1);
< dup(pipe_fd[0]);
< dup(pipe_fd[1]);
< execl("/usr/lib/makekey", "-", 0);
< execl("/lib/makekey", "-", 0);
< exit(1);
< }
<
< write(pipe_fd[1], buf, 10);
< wait((int *) NULL);
<
< if (read(pipe_fd[0], buf, 13) != 13)
< {
< fprintf(stderr, "crypt: cannot generate key\n");
< exit(1);
< }
<
119c101
< crypt()
---
> encode()
202c184
< else crypt();
---
> else encode();


[nestey] 32)
Login or Register to add favorites

File Archive:

July 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Jul 1st
    27 Files
  • 2
    Jul 2nd
    10 Files
  • 3
    Jul 3rd
    35 Files
  • 4
    Jul 4th
    27 Files
  • 5
    Jul 5th
    18 Files
  • 6
    Jul 6th
    0 Files
  • 7
    Jul 7th
    0 Files
  • 8
    Jul 8th
    28 Files
  • 9
    Jul 9th
    44 Files
  • 10
    Jul 10th
    24 Files
  • 11
    Jul 11th
    25 Files
  • 12
    Jul 12th
    11 Files
  • 13
    Jul 13th
    0 Files
  • 14
    Jul 14th
    0 Files
  • 15
    Jul 15th
    28 Files
  • 16
    Jul 16th
    6 Files
  • 17
    Jul 17th
    34 Files
  • 18
    Jul 18th
    6 Files
  • 19
    Jul 19th
    34 Files
  • 20
    Jul 20th
    0 Files
  • 21
    Jul 21st
    0 Files
  • 22
    Jul 22nd
    19 Files
  • 23
    Jul 23rd
    17 Files
  • 24
    Jul 24th
    47 Files
  • 25
    Jul 25th
    0 Files
  • 26
    Jul 26th
    0 Files
  • 27
    Jul 27th
    0 Files
  • 28
    Jul 28th
    0 Files
  • 29
    Jul 29th
    0 Files
  • 30
    Jul 30th
    0 Files
  • 31
    Jul 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close