Ignore:
Timestamp:
Dec 16, 2008, 3:33:31 PM (13 years ago)
Author:
Gerhard Junker
Message:

Twofish working state

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SSCext/TwofishBase.cs

    r155 r156  
    1111//////////////////////////////////////////////////////////////////////////////////////////////////
    1212
    13 // see http://www.codeproject.com/KB/recipes/twofish_csharp.aspx
     13// more about at http://www.schneier.com/twofish.html
     14// used sources from http://www.codeproject.com/KB/recipes/twofish_csharp.aspx
    1415
    1516using System;
     
    1920namespace System.Security.Cryptography
    2021{
    21   partial class TWOFISH
     22  partial class TwofishManaged
    2223  {
    2324
     
    2930
    3031    /// <summary>
    31     /// Summary description for TWOFISH.
     32    /// Summary description for TwofishManaged.
    3233    /// </summary>
    3334    internal class TwofishBase
     
    8182        {
    8283          case 0:               /* 256 bits of key */
    83             b[0] = (byte)(P8x8[P_04, b[0]] ^ b0(k32[3]));
    84             b[1] = (byte)(P8x8[P_14, b[1]] ^ b1(k32[3]));
    85             b[2] = (byte)(P8x8[P_24, b[2]] ^ b2(k32[3]));
    86             b[3] = (byte)(P8x8[P_34, b[3]] ^ b3(k32[3]));
     84            b[0] = (byte)(p8[P_04, b[0]] ^ b0(k32[3]));
     85            b[1] = (byte)(p8[P_14, b[1]] ^ b1(k32[3]));
     86            b[2] = (byte)(p8[P_24, b[2]] ^ b2(k32[3]));
     87            b[3] = (byte)(p8[P_34, b[3]] ^ b3(k32[3]));
    8788            /* fall thru, having pre-processed b[0]..b[3] with k32[3] */
    8889            goto case 3;
    8990          case 3:               /* 192 bits of key */
    90             b[0] = (byte)(P8x8[P_03, b[0]] ^ b0(k32[2]));
    91             b[1] = (byte)(P8x8[P_13, b[1]] ^ b1(k32[2]));
    92             b[2] = (byte)(P8x8[P_23, b[2]] ^ b2(k32[2]));
    93             b[3] = (byte)(P8x8[P_33, b[3]] ^ b3(k32[2]));
     91            b[0] = (byte)(p8[P_03, b[0]] ^ b0(k32[2]));
     92            b[1] = (byte)(p8[P_13, b[1]] ^ b1(k32[2]));
     93            b[2] = (byte)(p8[P_23, b[2]] ^ b2(k32[2]));
     94            b[3] = (byte)(p8[P_33, b[3]] ^ b3(k32[2]));
    9495            /* fall thru, having pre-processed b[0]..b[3] with k32[2] */
    9596            goto case 2;
    9697          case 2:               /* 128 bits of key */
    97             b[0] = P8x8[P_00, P8x8[P_01, P8x8[P_02, b[0]] ^ b0(k32[1])] ^ b0(k32[0])];
    98             b[1] = P8x8[P_10, P8x8[P_11, P8x8[P_12, b[1]] ^ b1(k32[1])] ^ b1(k32[0])];
    99             b[2] = P8x8[P_20, P8x8[P_21, P8x8[P_22, b[2]] ^ b2(k32[1])] ^ b2(k32[0])];
    100             b[3] = P8x8[P_30, P8x8[P_31, P8x8[P_32, b[3]] ^ b3(k32[1])] ^ b3(k32[0])];
     98            b[0] = p8[P_00, p8[P_01, p8[P_02, b[0]] ^ b0(k32[1])] ^ b0(k32[0])];
     99            b[1] = p8[P_10, p8[P_11, p8[P_12, b[1]] ^ b1(k32[1])] ^ b1(k32[0])];
     100            b[2] = p8[P_20, p8[P_21, p8[P_22, b[2]] ^ b2(k32[1])] ^ b2(k32[0])];
     101            b[3] = p8[P_30, p8[P_31, p8[P_32, b[3]] ^ b3(k32[1])] ^ b3(k32[0])];
    101102            break;
    102103        }
     
    300301      static private readonly int       MIN_KEY_BITS = 128;     /* min number of bits of key (zero pad) */
    301302
    302       //#define         VALID_SIG        0x48534946     /* initialization signature ('FISH') */
    303       //#define         MCT_OUTER                       400     /* MCT outer loop */
    304       //#define         MCT_INNER                 10000 /* MCT inner loop */
    305       //#define         REENTRANT                         1     /* nonzero forces reentrant code (slightly slower) */
    306 
    307303      static private readonly int       INPUT_WHITEN = 0;       /* subkey array indices */
    308304      static private readonly int       OUTPUT_WHITEN = (INPUT_WHITEN + BLOCK_SIZE / 32);
     
    332328      }
    333329
    334       /*        Macros for the MDS matrix
    335       * The MDS matrix is (using primitive polynomial 169):
    336       *      01  EF  5B  5B
    337       *      5B  EF  EF  01
    338       *      EF  5B  01  EF
    339       *      EF  01  EF  5B
    340       *----------------------------------------------------------------
    341       * More statistical properties of this matrix (from MDS.EXE output):
    342       *
    343       * Min Hamming weight (one byte difference) =  8. Max=26.  Total =  1020.
    344       * Prob[8]:      7    23    42    20    52    95    88    94   121   128    91
    345       *             102    76    41    24     8     4     1     3     0     0     0
    346       * Runs[8]:      2     4     5     6     7     8     9    11
    347       * MSBs[8]:      1     4    15     8    18    38    40    43
    348       * HW= 8: 05040705 0A080E0A 14101C14 28203828 50407050 01499101 A080E0A0
    349       * HW= 9: 04050707 080A0E0E 10141C1C 20283838 40507070 80A0E0E0 C6432020 07070504
    350       *        0E0E0A08 1C1C1410 38382820 70705040 E0E0A080 202043C6 05070407 0A0E080E
    351       *        141C101C 28382038 50704070 A0E080E0 4320C620 02924B02 089A4508
    352       * Min Hamming weight (two byte difference) =  3. Max=28.  Total = 390150.
    353       * Prob[3]:      7    18    55   149   270   914  2185  5761 11363 20719 32079
    354       *           43492 51612 53851 52098 42015 31117 20854 11538  6223  2492  1033
    355       * MDS OK, ROR:   6+  7+  8+  9+ 10+ 11+ 12+ 13+ 14+ 15+ 16+
    356       *               17+ 18+ 19+ 20+ 21+ 22+ 23+ 24+ 25+ 26+
    357       */
    358330      static private readonly int       MDS_GF_FDBK     = 0x169;        /* primitive polynomial for GF(256)*/
    359331      static private int LFSR1(int x)
     
    495467      static private readonly int       P_34 = 1;
    496468
    497       /* fixed 8x8 permutation S-boxes */
    498 
    499       /***********************************************************************
    500       *  07:07:14  05/30/98  [4x4]  TestCnt=256. keySize=128. CRC=4BD14D9E.
    501       * maxKeyed:  dpMax = 18. lpMax =100. fixPt =  8. skXor =  0. skDup =  6.
    502       * log2(dpMax[ 6..18])=   --- 15.42  1.33  0.89  4.05  7.98 12.05
    503       * log2(lpMax[ 7..12])=  9.32  1.01  1.16  4.23  8.02 12.45
    504       * log2(fixPt[ 0.. 8])=  1.44  1.44  2.44  4.06  6.01  8.21 11.07 14.09 17.00
    505       * log2(skXor[ 0.. 0])
    506       * log2(skDup[ 0.. 6])=   ---  2.37  0.44  3.94  8.36 13.04 17.99
    507       ***********************************************************************/
    508       static private byte[,] P8x8 =
     469
     470      static private byte[,] p8 =
    509471                  {
    510                           /*  p0:   */
    511                           /*  dpMax      = 10.  lpMax      = 64.  cycleCnt=   1  1  1  0.         */
    512                           /* 817D6F320B59ECA4.ECB81235F4A6709D.BA5E6D90C8F32471.D7F4126E9B3085CA. */
    513                           /* Karnaugh maps:
    514                           *  0111 0001 0011 1010. 0001 1001 1100 1111. 1001 1110 0011 1110. 1101 0101 1111 1001.
    515                           *  0101 1111 1100 0100. 1011 0101 0010 0000. 0101 1000 1100 0101. 1000 0111 0011 0010.
    516                           *  0000 1001 1110 1101. 1011 1000 1010 0011. 0011 1001 0101 0000. 0100 0010 0101 1011.
    517                           *  0111 0100 0001 0110. 1000 1011 1110 1001. 0011 0011 1001 1101. 1101 0101 0000 1100.
    518                           */
     472                            /*  p0:   */
    519473                                  {
    520474                                  0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
     
    552506                          },
    553507                          /*  p1:   */
    554                           /*  dpMax      = 10.  lpMax      = 64.  cycleCnt=   2  0  0  1.         */
    555                           /* 28BDF76E31940AC5.1E2B4C376DA5F908.4C75169A0ED82B3F.B951C3DE647F208A. */
    556                           /* Karnaugh maps:
    557                           *  0011 1001 0010 0111. 1010 0111 0100 0110. 0011 0001 1111 0100. 1111 1000 0001 1100.
    558                           *  1100 1111 1111 1010. 0011 0011 1110 0100. 1001 0110 0100 0011. 0101 0110 1011 1011.
    559                           *  0010 0100 0011 0101. 1100 1000 1000 1110. 0111 1111 0010 0110. 0000 1010 0000 0011.
    560                           *  1101 1000 0010 0001. 0110 1001 1110 0101. 0001 0100 0101 0111. 0011 1011 1111 0010.
    561                           */
    562508                          {
    563509                                  0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
Note: See TracChangeset for help on using the changeset viewer.