Enigma/wheels.h

From Teknologisk videncenter
Jump to: navigation, search
/* Header file for enigma-like wheels
 contact: heth@mercantec.dk
*/
#define WHEELS 5
typedef unsigned char byte;
byte wheel[5][256] = {
/* Wheel 1 */
       {133, 208,  22, 138, 113, 243, 224, 134, 107,  59, 130, 245, 186,  76,  47, 185,
         89,   3, 142,  13, 200,  87,  26,  81,  72, 213, 171, 156,  23, 184,  90, 247,
        252, 225,  82,  40, 197,  31, 226,  63,  41, 216,   7, 108, 151, 149, 115, 158,
        255, 128, 178, 238,  62,  80,  46,  18, 140,   9,  21, 161, 164,  35, 187,  34,
        189, 194,  44, 205, 157, 101,  88, 234, 179, 118,  70, 207, 148, 233,  95,  99,
         56, 191, 109, 159, 204, 199,  27, 228, 153,  15,  17, 100, 188,  86, 170,  55,
         45,  51, 123,  93, 223,  42,  75,  33,  61, 114,  68,   5, 111, 231,  97, 112,
        121, 105, 136, 173,  66,   0, 202,  38,  78, 196, 103, 155, 251,  49, 182, 206,
         92,  54,  74,  60,  65, 193, 214, 227, 198, 212, 145, 240, 221, 192, 242, 219,
        150,  19, 131, 217, 147, 183, 154, 232,   4, 190, 236, 253, 239,  57,  24, 210,
         71, 249, 248,  20,  50, 175,  39, 139,  53, 152,   6,  67, 215,  85,  25,  32,
        129,   2,  73, 143, 246, 229, 116, 126,  30,  12,  58, 167, 250, 177,  28, 127,
         10, 209,  48,  11,  77,  52,  84, 172, 125, 122,   1, 181,  16,  91, 237, 117,
         79, 195,   8, 174,  64, 124,  36, 110, 220, 241, 141, 230, 203, 106, 168, 254,
        144, 120, 201,  43, 222,  96,  29, 166, 146, 162, 169, 137, 235,  69, 180,  37,
        218, 211, 163, 102, 165, 135, 244, 160, 132, 176,  98, 104,  94,  14, 119,  83},
/* Wheel 2 */
       {196, 239, 107,  99, 179, 183, 201, 209,   0,  94,  77, 118, 231, 233,  74,  91,
        142, 147, 154, 139,  64,  59,  13,  86,   2, 114, 219, 152,  51,  38, 226,  40,
         83, 218,  39, 167,  50, 120,  14, 189, 184,  78,  24,  66, 159, 243,  48, 145,
        177,  17, 172,  35, 206, 113, 141, 241, 117,   9, 170,  97, 255,  87,  93, 238,
        181,  36, 247, 200, 158,  49, 197,  92, 166,  68,  18,  60, 212, 235, 101,  76,
          6, 137,  69, 230,  73, 173,  15, 205, 106,  81,  80,  85,  22, 191, 119,  90,
        204,  56,  61, 131, 248,  67, 217,  57, 216,  95, 224, 250, 227, 193, 156,  65,
        127,  47, 236,  71, 121, 122, 130, 150, 148, 123, 102, 211,  21, 136, 242, 144,
        254, 225,  12, 222, 214,  10, 125, 203, 215, 223,  53,  70,  34,  79,  23, 109,
        105, 110, 176,   5, 208, 165,   4, 220,  30, 162, 234, 103, 146, 116, 100, 195,
        174, 108, 187, 151, 163,  43, 160, 213,  41,  32,  11, 182, 129,  16, 135, 104,
        164, 149,  82,  54, 138,  96,  26, 175,  33,   1,  28,  19, 124, 188, 246, 202,
        161,   3,  75, 185,  88,  44, 128, 198,  52,  31,  58,  98, 228, 115, 143,  42,
        171,  27, 178, 237, 190,  25, 252, 155,   8, 126, 249,  37, 240, 244,  84, 186,
        140,  62, 180,   7, 229, 112, 253,  89, 153, 168,  20,  29, 133, 199, 192, 207,
        232, 157, 251,  63, 210,  55, 221,  46, 134, 111, 169,  72,  45, 245, 132, 194},
/* Wheel 3 */
       {255, 171, 198, 192, 234, 128, 162, 187, 221,  53,  81,   4,  49, 114, 173, 219,
         19,  64,  66, 138,  16, 140,  84, 144,  34, 104, 179, 230, 228, 166,  12, 186,
        249,  92,  77, 242, 105,   7, 252, 148, 254, 169, 203,  80,  95, 161, 238, 110,
        215, 180, 207, 170,  86, 213, 201, 100, 218, 137, 236, 133, 131,   2, 141, 220,
        108, 117, 121, 184, 204, 223,  18, 132,  32, 210, 253, 214, 188,  30, 116, 209,
        125,  35,  26,   5,  51,  74, 135, 136,  59, 147, 149,  58,  42, 101, 172, 164,
         15, 217, 111, 245, 195, 247,  40,  72, 208, 130, 127,  38, 155,  88,  25, 175,
         85, 241,  70, 250,  79, 225,  23,  56, 118,  22, 106,  78,  69,  68,  33,  43,
         87,  55,   6,  44, 227,  89,  21, 139,  31, 205, 153,  96,  60, 206, 152, 211,
          3,  20, 160,  29,  10,  37,  52, 237, 103,  47, 239,  13, 122, 199, 194, 202,
        244, 226,  61, 229,  50,  14, 185,  39, 196,   0,  93, 119, 157, 167, 233, 197,
         76, 154, 181,   1,  83, 248,  82,  94,  54, 183,  11, 178, 120,  73,  36,  48,
        107,  97, 134, 243, 165, 232, 158,  63, 163,  67, 216,  90, 200, 191, 156,  46,
         17, 240,   9, 159, 102, 123,  71,  62, 222, 190, 177,  27, 124, 151, 113, 193,
        109, 189, 142, 231,  75,   8, 224,  28, 112, 146, 129,  65, 251, 145, 246,  91,
         98, 182,  45,  24,  41, 212, 143, 115, 174, 176, 168, 150, 126,  57, 235,  99},
/* Wheel 4 */
       {115,  14, 139,  68, 144, 150, 223, 222,  77, 229, 165,   9, 157,  25, 117, 137,
          6, 208,  91, 191,  42,  16,  58,  45, 168,  75, 255,  60, 105, 182,  81, 221,
        201,  93, 155,  97,  22,  46, 184, 108, 190, 232, 230, 250, 159,  28, 161,  86,
         11,  18,  34, 125,  12, 236,  27, 253,  57, 197, 237, 180, 207,  50, 247, 249,
        102,  38,   7, 141, 216, 131,  36, 179,  37, 209, 246,  92,  89, 202,   3,  83,
        239, 243, 211, 220,  54, 173,  40,  71, 103, 110, 177, 128,  49, 129, 163, 109,
        120, 241, 252, 198,  53,  80,  32, 227, 248, 160, 135,  82, 140,  10, 145, 174,
        152,  72, 162,  56, 234, 194,  19, 106, 204, 130, 233, 107, 104, 112, 119, 225,
        210, 178, 148, 154, 240,   1,  84, 116,  66, 189,  63, 171, 181,  62,  43, 147,
         51, 126, 111,  21, 121, 142, 127, 122,   4, 101,  90, 134,  15, 245, 193, 231,
         94, 213, 153,  64, 195,   5, 242, 185,  33,  59, 235,   8, 123, 196, 226, 183,
        169,  44,  41,  20, 188, 124,   0, 133, 158, 192, 228, 251, 205,  65,  85, 224,
          2, 167, 170,  69,  17, 176, 199, 254, 113, 166,  23,  47, 206,  70, 217,  98,
        186, 212, 203, 156, 136, 151, 114, 238,  79,  48, 149,  96,  55,  74,  30,  67,
         73,  78,  99,  26,  29, 138, 200,  31,  39, 100, 164, 143,  95, 146,  52, 172,
        219, 132, 175, 218,  87, 118, 215,  24,  88, 214, 244,  61, 187,  35,  13,  76},
/* Wheel 5 */
       {156, 199, 154, 221,  71, 105, 249, 223, 229,  83,  62, 252,   5, 155, 140,  23,
        206, 173,  99, 112, 134, 243,  32,  25, 102, 149, 212,  44, 164, 168, 182,  78,
        110, 185, 166, 143, 107,  27,  88,  12, 100,  69, 128, 247, 159, 125, 171,  87,
        227,  82, 123,  66, 202, 230,   7,  95, 135, 222,  51,  92,  70, 231, 239,  14,
        218, 127,  54, 193,  60,  68, 178, 160, 224,   9, 198, 179,  33, 207, 244,  31,
         84, 113, 158, 211, 174,  80, 203,  16, 255, 138, 130, 131,  67, 209,  36, 208,
        251, 122,  22, 233,  77,  48, 126,  63, 200, 145, 157, 219, 254, 115,  41, 108,
         10,  50, 106, 245,   2, 220,   0,  46,  91,  26,  37, 133,  85,  47, 176, 124,
        150, 117, 170, 141, 136,   3, 169, 121, 217,   8, 205, 137,  89, 188,  18, 162,
          1,  15,  81, 146, 104,  98, 147,  17, 242, 109, 234, 183, 250,  29,  72, 118,
        241, 184, 187,  42, 167, 152, 192, 210, 142, 165,  76, 186, 237, 132,  55,   6,
        161, 235,  75, 215,  61,  86,   4, 195,  57,  13,  52, 111,  11, 213, 175,  59,
         40, 103, 226, 101, 181, 190, 253, 194,  21, 116, 114, 246, 201,  53, 144,  34,
         73,  96,  35, 191, 232,  58,  94,  45, 153, 151,  20,  65, 148, 228, 204, 177,
         39, 216,  28, 236,  56,  30, 214, 139, 196, 197,  43, 129,  90, 119, 248,  74,
        189,  24, 163, 225, 172,  19,  49, 180,  93, 238, 120, 240,  79,  64,  38,  97}
};

/* Notch array for wheels*/
byte wheel_notch[5] = {
        184, 41, 3, 181, 194};

byte rwheel[5][256] = {
/* Reverse wheel 1 */
       {117, 202, 177,  17, 152, 107, 170,  42, 210,  57, 192, 195, 185,  19, 253,  89,
        204,  90,  55, 145, 163,  58,   2,  28, 158, 174,  22,  86, 190, 230, 184,  37,
        175, 103,  63,  61, 214, 239, 119, 166,  35,  40, 101, 227,  66,  96,  54,  14,
        194, 125, 164,  97, 197, 168, 129,  95,  80, 157, 186,   9, 131, 104,  52,  39,
        212, 132, 116, 171, 106, 237,  74, 160,  24, 178, 130, 102,  13, 196, 120, 208,
         53,  23,  34, 255, 198, 173,  93,  21,  70,  16,  30, 205, 128,  99, 252,  78,
        229, 110, 250,  79,  91,  69, 243, 122, 251, 113, 221,   8,  43,  82, 215, 108,
        111,   4, 105,  46, 182, 207,  73, 254, 225, 112, 201,  98, 213, 200, 183, 191,
         49, 176,  10, 146, 248,   0,   7, 245, 114, 235,   3, 167,  56, 218,  18, 179,
        224, 138, 232, 148,  76,  45, 144,  44, 169,  88, 150, 123,  27,  68,  47,  83,
        247,  59, 233, 242,  60, 244, 231, 187, 222, 234,  94,  26, 199, 115, 211, 165,
        249, 189,  50,  72, 238, 203, 126, 149,  29,  15,  12,  62,  92,  64, 153,  81,
        141, 133,  65, 209, 121,  36, 136,  85,  20, 226, 118, 220,  84,  67, 127,  75,
          1, 193, 159, 241, 137,  25, 134, 172,  41, 147, 240, 143, 216, 140, 228, 100,
          6,  33,  38, 135,  87, 181, 219, 109, 151,  77,  71, 236, 154, 206,  51, 156,
        139, 217, 142,   5, 246,  11, 180,  31, 162, 161, 188, 124,  32, 155, 223,  48},
/* Reverse wheel 2 */
       {  8, 185,  24, 193, 150, 147,  80, 227, 216,  57, 133, 170, 130,  22,  38,  86,
        173,  49,  74, 187, 234, 124,  92, 142,  42, 213, 182, 209, 186, 235, 152, 201,
        169, 184, 140,  51,  65, 219,  29,  34,  31, 168, 207, 165, 197, 252, 247, 113,
         46,  69,  36,  28, 200, 138, 179, 245,  97, 103, 202,  21,  75,  98, 225, 243,
         20, 111,  43, 101,  73,  82, 139, 115, 251,  84,  14, 194,  79,  10,  41, 141,
         90,  89, 178,  32, 222,  91,  23,  61, 196, 231,  95,  15,  71,  62,   9, 105,
        181,  59, 203,   3, 158,  78, 122, 155, 175, 144,  88,   2, 161, 143, 145, 249,
        229,  53,  25, 205, 157,  56,  11,  94,  37, 116, 117, 121, 188, 134, 217, 112,
        198, 172, 118,  99, 254, 236, 248, 174, 125,  81, 180,  19, 224,  54,  16, 206,
        127,  47, 156,  17, 120, 177, 119, 163,  27, 232,  18, 215, 110, 241,  68,  44,
        166, 192, 153, 164, 176, 149,  72,  35, 233, 250,  58, 208,  50,  85, 160, 183,
        146,  48, 210,   4, 226,  64, 171,   5,  40, 195, 223, 162, 189,  39, 212,  93,
        238, 109, 255, 159,   0,  70, 199, 237,  67,   6, 191, 135,  96,  87,  52, 239,
        148,   7, 244, 123,  76, 167, 132, 136, 104, 102,  33,  26, 151, 246, 131, 137,
        106, 129,  30, 108, 204, 228,  83,  12, 240,  13, 154,  77, 114, 211,  63,   1,
        220,  55, 126,  45, 221, 253, 190,  66, 100, 218, 107, 242, 214, 230, 128,  60},
/* Reverse wheel 3 */
       {169, 179,  61, 144,  11,  83, 130,  37, 229, 210, 148, 186,  30, 155, 165,  96,
         20, 208,  70,  16, 145, 134, 121, 118, 243, 110,  82, 219, 231, 147,  77, 136,
         72, 126,  24,  81, 190, 149, 107, 167, 102, 244,  92, 127, 131, 242, 207, 153,
        191,  12, 164,  84, 150,   9, 184, 129, 119, 253,  91,  88, 140, 162, 215, 199,
         17, 235,  18, 201, 125, 124, 114, 214, 103, 189,  85, 228, 176,  34, 123, 116,
         43,  10, 182, 180,  22, 112,  52, 128, 109, 133, 203, 239,  33, 170, 183,  44,
        139, 193, 240, 255,  55,  93, 212, 152,  25,  36, 122, 192,  64, 224,  47,  98,
        232, 222,  13, 247,  78,  65, 120, 171, 188,  66, 156, 213, 220,  80, 252, 106,
          5, 234, 105,  60,  71,  59, 194,  86,  87,  57,  19, 135,  21,  62, 226, 246,
         23, 237, 233,  89,  39,  90, 251, 221, 142, 138, 177, 108, 206, 172, 198, 211,
        146,  45,   6, 200,  95, 196,  29, 173, 250,  41,  51,   1,  94,  14, 248, 111,
        249, 218, 187,  26,  49, 178, 241, 185,  67, 166,  31,   7,  76, 225, 217, 205,
          3, 223, 158, 100, 168, 175,   2, 157, 204,  54, 159,  42,  68, 137, 141,  50,
        104,  79,  73, 143, 245,  53,  75,  48, 202,  97,  56,  15,  63,   8, 216,  69,
        230, 117, 161, 132,  28, 163,  27, 227, 197, 174,   4, 254,  58, 151,  46, 154,
        209, 113,  35, 195, 160,  99, 238, 101, 181,  32, 115, 236,  38,  74,  40,   0},
/* Reverse wheel 4 */
       {182, 133, 192,  78, 152, 165,  16,  66, 171,  11, 109,  48,  52, 254,   1, 156,
         21, 196,  49, 118, 179, 147,  36, 202, 247,  13, 227,  54,  45, 228, 222, 231,
        102, 168,  50, 253,  70,  72,  65, 232,  86, 178,  20, 142, 177,  23,  37, 203,
        217,  92,  61, 144, 238, 100,  84, 220, 115,  56,  22, 169,  27, 251, 141, 138,
        163, 189, 136, 223,   3, 195, 205,  87, 113, 224, 221,  25, 255,   8, 225, 216,
        101,  30, 107,  79, 134, 190,  47, 244, 248,  76, 154,  18,  75,  33, 160, 236,
        219,  35, 207, 226, 233, 153,  64,  88, 124,  28, 119, 123,  39,  95,  89, 146,
        125, 200, 214,   0, 135,  14, 245, 126,  96, 148, 151, 172, 181,  51, 145, 150,
         91,  93, 121,  69, 241, 183, 155, 106, 212,  15, 229,   2, 108,  67, 149, 235,
          4, 110, 237, 143, 130, 218,   5, 213, 112, 162, 131,  34, 211,  12, 184,  44,
        105,  46, 114,  94, 234,  10, 201, 193,  24, 176, 194, 139, 239,  85, 111, 242,
        197,  90, 129,  71,  59, 140,  29, 175,  38, 167, 208, 252, 180, 137,  40,  19,
        185, 158, 117, 164, 173,  57,  99, 198, 230,  32,  77, 210, 120, 188, 204,  60,
         17,  73, 128,  82, 209, 161, 249, 246,  68, 206, 243, 240,  83,  31,   7,   6,
        191, 127, 174, 103, 186,   9,  42, 159,  41, 122, 116, 170,  53,  58, 215,  80,
        132,  97, 166,  81, 250, 157,  74,  62, 104,  63,  43, 187,  98,  55, 199,  26},
/* Reverse wheel 5 */
       {118, 144, 116, 133, 182,  12, 175,  54, 137,  73, 112, 188,  39, 185,  63, 145,
         87, 151, 142, 245, 218, 200,  98,  15, 241,  23, 121,  37, 226, 157, 229,  79,
         22,  76, 207, 210,  94, 122, 254, 224, 192, 110, 163, 234,  27, 215, 119, 125,
        101, 246, 113,  58, 186, 205,  66, 174, 228, 184, 213, 191,  68, 180,  10, 103,
        253, 219,  51,  92,  69,  41,  60,   4, 158, 208, 239, 178, 170, 100,  31, 252,
         85, 146,  49,   9,  80, 124, 181,  47,  38, 140, 236, 120,  59, 248, 214,  55,
        209, 255, 149,  18,  40, 195,  24, 193, 148,   5, 114,  36, 111, 153,  32, 187,
         19,  81, 202, 109, 201, 129, 159, 237, 250, 135,  97,  50, 127,  45, 102,  65,
         42, 235,  90,  91, 173, 123,  20,  56, 132, 139,  89, 231,  14, 131, 168,  35,
        206, 105, 147, 150, 220,  25, 128, 217, 165, 216,   2,  13,   0, 106,  82,  44,
         71, 176, 143, 242,  28, 169,  34, 164,  29, 134, 130,  46, 244,  17,  84, 190,
        126, 223,  70,  75, 247, 196,  30, 155, 161,  33, 171, 162, 141, 240, 197, 211,
        166,  67, 199, 183, 232, 233,  74,   1, 104, 204,  52,  86, 222, 138,  16,  77,
         95,  93, 167,  83,  26, 189, 230, 179, 225, 136,  64, 107, 117,   3,  57,   7,
         72, 243, 194,  48, 221,   8,  53,  61, 212,  99, 154, 177, 227, 172, 249,  62,
        251, 160, 152,  21,  78, 115, 203,  43, 238,   6, 156,  96,  11, 198, 108,  88}

};

/* Rotor reflector*/
byte rr[256] = {
         90,  56, 213, 118, 121,  36, 114,  17, 139,  68,  51, 168, 104, 116,  22,  48,
        163,   7, 113, 109, 148,  49,  14, 176, 218,  72, 188, 195,  82,  37,  34,  66,
        187, 225,  30, 100,   5,  29, 233, 180,  54,  87,  98, 179, 160, 223, 178, 232,
         15,  21, 250,  10, 241, 167,  40, 244,   1,  95, 215,  61, 130,  59, 170, 184,
         79, 231,  31, 120,   9, 172, 150, 224,  25, 226,  92, 217, 212, 222, 207,  64,
        198, 206,  28, 200, 107, 151, 193,  41, 243, 240,   0, 146,  74, 138, 149,  57,
        177, 152,  42, 192,  35, 142, 144, 245,  12, 185, 132,  84, 216,  19, 246, 112,
        111,  18,   6, 122,  13, 147,   3, 135,  67,   4, 115, 162, 136, 220, 253, 145,
        234, 131,  60, 129, 106, 182, 214, 119, 124, 228,  93,   8, 219, 166, 101, 202,
        102, 127,  91, 117,  20,  94,  70,  85,  97, 165, 156, 229, 154, 174, 196, 248,
         44, 235, 123,  16, 247, 153, 141,  53,  11, 173,  62, 249,  69, 169, 157, 181,
         23,  96,  46,  43,  39, 175, 133, 238,  63, 105, 197,  32,  26, 190, 189, 194,
         99,  86, 191,  27, 158, 186,  80, 203,  83, 208, 143, 199, 205, 204,  81,  78,
        201, 210, 209, 227,  76,   2, 134,  58, 108,  75,  24, 140, 125, 236,  77,  45,
         71,  33,  73, 211, 137, 155, 255,  65,  47,  38, 128, 161, 221, 239, 183, 237,
         89,  52, 251,  88,  55, 103, 110, 164, 159, 171,  50, 242, 254, 126, 252, 230};