/[mcrypt]/libmcrypt-nm/lib/enigma.c
ViewVC logotype

Contents of /libmcrypt-nm/lib/enigma.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Mon May 22 13:09:15 2000 UTC (23 years, 11 months ago) by nmav
Branch: MAIN, mcrypt
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain

1 /*
2 * "enigma.c" is in file cbw.tar from
3 * anonymous FTP host watmsg.waterloo.edu: pub/crypt/cbw.tar.Z
4 *
5 * A one-rotor machine designed along the lines of Enigma
6 * but considerably trivialized.
7 *
8 * A public-domain replacement for the UNIX "crypt" command.
9 * Changed to fit in mcrypt by nmav@i-net.paiko.gr
10 */
11
12 /* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos
13 * All modifications are placed under the license of libmcrypt.
14 */
15
16 /* $Id: enigma.c,v 1.12 2000/03/19 14:08:34 nikos Exp $ */
17
18 #include "libdefs.h"
19 #include "bzero.h"
20 #include "enigma.h"
21
22 /* it needs to be linked against libufc or libcrypt */
23 /* it no longer needs that. It just needs the password to be
24 * transformed by unix crypt() or the mhash SCRYPT
25 */
26
27 void _mcrypt_enigma_set_key(CRYPT_KEY *ckey, char* password, int plen)
28 {
29 int ic, i, k, temp;
30 unsigned random;
31 sword32 seed;
32
33
34 Bzero(ckey, sizeof(CRYPT_KEY));
35 ckey->n1 = ckey->n2 = ckey->nr1 = ckey->nr2 = 0;
36
37 if (plen > 13) plen = 13;
38 memmove( ckey->cbuf, password, plen);
39
40 seed = 123;
41 for (i = 0; i < 13; i++)
42 seed = seed * ckey->cbuf[i] + i;
43 for (i = 0; i < ROTORSZ; i++) {
44 ckey->t1[i] = i;
45 ckey->deck[i] = i;
46 }
47 for (i = 0; i < ROTORSZ; i++) {
48 seed = 5 * seed + ckey->cbuf[i % 13];
49 random = seed % 65521;
50 k = ROTORSZ - 1 - i;
51 ic = (random & MASK) % (k + 1);
52 random >>= 8;
53
54 temp = ckey->t1[k];
55 ckey->t1[k] = ckey->t1[ic];
56 ckey->t1[ic] = temp;
57 if (ckey->t3[k] != 0)
58 continue;
59
60 ic = (random & MASK) % k;
61 while (ckey->t3[ic] != 0)
62 ic = (ic + 1) % k;
63 ckey->t3[k] = ic;
64 ckey->t3[ic] = k;
65 }
66
67 for (i = 0; i < ROTORSZ; i++)
68 ckey->t2[ckey->t1[i] & MASK] = i;
69
70 return;
71 }
72
73
74 int shuffle(CRYPT_KEY* ckey)
75 {
76 int i, ic, k, temp;
77 unsigned random;
78 static sword32 seed = 123;
79
80 for (i = 0; i < ROTORSZ; i++) {
81 seed = 5 * seed + ckey->cbuf[i % 13];
82 random = seed % 65521;
83 k = ROTORSZ - 1 - i;
84 ic = (random & MASK) % (k + 1);
85 temp = ckey->deck[k];
86 ckey->deck[k] = ckey->deck[ic];
87 ckey->deck[ic] = temp;
88 }
89 return 0;
90 }
91
92 void _mcrypt_enigma_encrypt(CRYPT_KEY *ckey, void *gtext, int textlen)
93 { /* 0 or 1 */
94 int i, j;
95 int secureflg=0;
96 char *text = gtext;
97
98 for (j = 0; j < textlen; j++) {
99
100 i = text[j];
101 if (secureflg) {
102 ckey->nr1 = ckey->deck[ckey->n1] & MASK;
103 ckey->nr2 = ckey->deck[ckey->nr1] & MASK;
104 } else {
105 ckey->nr1 = ckey->n1;
106 }
107 i = ckey->t2[(ckey->t3[(ckey->t1[(i + ckey->nr1) & MASK] + ckey->nr2) & MASK] - ckey->nr2) & MASK] - ckey->nr1;
108 text[j] = i;
109 ckey->n1++;
110 if (ckey->n1 == ROTORSZ) {
111 ckey->n1 = 0;
112 ckey->n2++;
113 if (ckey->n2 == ROTORSZ)
114 ckey->n2 = 0;
115 if (secureflg) {
116 shuffle(ckey);
117 } else {
118 ckey->nr2 = ckey->n2;
119 }
120 }
121 }
122
123 return;
124 }
125
126 void _mcrypt_enigma_decrypt(CRYPT_KEY *ckey, void *gtext, int textlen)
127 { /* 0 or 1 */
128 int i, j;
129 int secureflg=0;
130 char *text = gtext;
131
132
133 for (j = 0; j < textlen; j++) {
134
135 i = text[j];
136 if (secureflg) {
137 ckey->nr1 = ckey->deck[ckey->n1] & MASK;
138 ckey->nr2 = ckey->deck[ckey->nr1] & MASK;
139 } else {
140 ckey->nr1 = ckey->n1;
141 }
142 i = ckey->t2[(ckey->t3[(ckey->t1[(i + ckey->nr1) & MASK] + ckey->nr2) & MASK] - ckey->nr2) & MASK] - ckey->nr1;
143 text[j] = i;
144 ckey->n1++;
145 if (ckey->n1 == ROTORSZ) {
146 ckey->n1 = 0;
147 ckey->n2++;
148 if (ckey->n2 == ROTORSZ)
149 ckey->n2 = 0;
150 if (secureflg) {
151 shuffle(ckey);
152 } else {
153 ckey->nr2 = ckey->n2;
154 }
155 }
156 }
157
158 return;
159 }
160

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26