помогите реверснуть алгоритм

Тема в разделе "WASM.CRYPTO", создана пользователем dantist, 27 янв 2005.

  1. dantist

    dantist New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2004
    Сообщения:
    22
    Добрый день !



    Помогите разобраться, раньше никогда с таким не сталкивался:



    В функцию передается строка из 26 символов:



    Код (Text):
    1. public static byte[] FromBase32String(string s)
    2.         {
    3.  
    4.             int num1 = 24;
    5.             long num2 = 0;
    6.             ArrayList list1 = new ArrayList();
    7.             for (int num3 = 0; num3 < num1; num3 += 8)
    8.             {
    9.                 num2 = 0;
    10.                 for (int num4 = num3; num4 < (num3 + 8); num4++)
    11.                 {
    12.                     num2 = num2 << 5;
    13.                     byte a1 =((byte) s[num4]);
    14. //Вызов функции frombase32
    15.                     num2 |= frombase32((byte) s[num4]);
    16.                 }
    17.                 for (int num5 = 4; num5 >= 0; num5--)
    18.                 {
    19.                     list1.Add((byte) ((num2 >> ((num5 * 8) & 0x3f)) & 0xff));
    20.                 }
    21.             }
    22.             num2 = 0;
    23.             sbyte num6 = 0;
    24.             int num7 = num1;
    25.             while (num7 < 26)
    26.             {
    27.                 num2 = num2 << 5;
    28. //Вызов функции frombase32
    29.                 num2 |= frombase32((byte) s[num7]);
    30.                 num7++;
    31.                 num6 = (sbyte) (num6 + 1);
    32.             }
    33.             sbyte num8 = 0;
    34.             switch (num6)
    35.             {
    36.                 case 2:
    37.                 {
    38.                     num8 = 2;
    39.                     num6 = 1;
    40.                     break;
    41.                 }
    42.                 case 4:
    43.                 {
    44.                     num8 = 4;
    45.                     num6 = 2;
    46.                     break;
    47.                 }
    48.                 case 5:
    49.                 {
    50.                     num8 = 1;
    51.                     num6 = 3;
    52.                     break;
    53.                 }
    54.                 case 7:
    55.                 {
    56.                     num8 = 3;
    57.                     num6 = 4;
    58.                     break;
    59.                 }
    60.             }
    61.             num2 = num2 >> (num8 & 0x3f);
    62.             for (int num9 = num6 - 1; num9 >= 0; num9--)
    63.             {
    64.                 list1.Add((byte) ((num2 >> ((num9 * 8) & 0x3f)) & 0xff));
    65.             }
    66.             return (byte[]) list1.ToArray(Type.GetType("System.Byte"));
    67.         }
    68.  
    69. //функция frombase32
    70.         private static byte frombase32(byte b)
    71.         {
    72.             if (b < 50)
    73.             {
    74.                 throw new FormatException("Invalid character in a Base-32 string.");
    75.             }
    76.             if (b <= 0x39)
    77.             {
    78.                 return (byte) (b - 0x1a);
    79.             }
    80.             if (b < 0x41)
    81.             {
    82.                 throw new FormatException("Invalid character in a Base-32 string.");
    83.             }
    84.             if (b <= 0x48)
    85.             {
    86.                 return (byte) (b - 0x41);
    87.             }
    88.             if (b == 0x49)
    89.             {
    90.                 throw new FormatException("Invalid character in a Base-32 string.");
    91.             }
    92.             if (b <= 0x4e)
    93.             {
    94.                 return (byte) (b - 0x42);
    95.             }
    96.             if (b == 0x4f)
    97.             {
    98.                 throw new FormatException("Invalid character in a Base-32 string.");
    99.             }
    100.             if (b > 90)
    101.             {
    102.                 throw new FormatException("Invalid character in a Base-32 string.");
    103.             }
    104.             return (byte) (b - 0x43);
    105.         }


    Что это за алгоритм и как можно написать обратный ?



    Заранее благодарю !
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Прямой алгоритм - это кодирование 16 байт в строку base32.

    Исходные 16 байт(128 бит + 2 чтобы делилось) разбиваются на блоки по 5 бит, и каждый блок заменяется на символ из следующей строки "ABCDEFGHJKLMNPQRSTUVWXYZ23456789".



    Скачай BASE64.LIB by Quantum, а также найди про неё тему на форуме и сделай аналогично 8)
     
  3. DotNET

    DotNET New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2005
    Сообщения:
    7
    переситал все темы форума где встречается слово BASE,

    но ничего так и не вразумил

    Будьте добры уточните, как можно сделать обратный алгоритм ?

    то есть: у меня есть строка, введя которую прога начинает работать...

    в этой строке зашифрована дата окончания работы, вот хочется продлить эту дату....





    Исходные 16 байт(128 бит + 2 чтобы делилось) разбиваются на блоки по 5 бит, и каждый блок заменяется на символ из следующей строки "ABCDEFGHJKLMNPQRSTUVWXYZ23456789".

    Как я понимаю вот символы на которые будет менятся блоки:

    EncryptionUtils.base32 = new byte[0x20] {

    0x41, 0x42, 0x43, 0x44, 0x45, 70, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 80, 0x51, 0x52,

    0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 90, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39

    } ;

    EncryptionUtils._baPrimer = new byte[0x100] {

    0x66, 40, 0x6b, 0xe7, 0x51, 0xa2, 0x42, 0x7b, 0x73, 3, 0xa9, 0x55, 0x6a, 0x8e, 0xa1, 0x2f,

    210, 0x79, 0x52, 0x9b, 9, 0xcc, 0x52, 0x6b, 0xeb, 0x6a, 0xa2, 0x8a, 0x4c, 70, 0x9d, 13,

    0x4f, 0x4b, 20, 0x97, 0x31, 0xd5, 0x8a, 0xcd, 0x4b, 0x76, 0x93, 0x86, 0xf5, 140, 0xcb, 0x59,

    0x20, 8, 0xca, 0x5b, 0x41, 0xe0, 0xc2, 0x42, 170, 0xd0, 0xf6, 60, 0x70, 0x9b, 0xf9, 0xbc,

    0x26, 0x45, 12, 0x41, 0xe9, 220, 12, 0x5b, 0x6f, 0x6f, 0xef, 100, 0x7e, 240, 0xcb, 0xfd,

    0xba, 0xcb, 0x59, 0xee, 0x94, 0xc0, 0x51, 0x2c, 0x80, 170, 12, 0x65, 0x22, 0xf1, 180, 0x5f,

    0x77, 0x1a, 0x22, 0x4f, 0x9e, 0x94, 0x70, 0x1a, 0x12, 0x5d, 0xf1, 0xf5, 0x25, 0xbd, 0x52, 0x91,

    0x76, 0xce, 0x47, 0xf5, 0x7b, 0x40, 0x9e, 210, 0xcd, 0x21, 0xb3, 0x43, 0xbf, 0xae, 0xf8, 12,

    0x4c, 0xee, 120, 12, 70, 0x6b, 0x6d, 0x76, 0xd0, 0xb2, 0xd0, 0xd9, 0x65, 0x5b, 0xda, 0x74,

    0x90, 0x24, 0x16, 0x61, 0x33, 0xbc, 0x1a, 0x35, 10, 220, 0xf9, 0x18, 210, 0xb2, 0x9f, 160,

    0xea, 0x6b, 0x24, 0x33, 0x98, 0x3a, 150, 120, 0x15, 0x12, 0x35, 0x3f, 0x8b, 0xef, 15, 8,

    0x33, 0xfb, 0x20, 0x71, 0x3f, 170, 200, 0x7e, 0xda, 0x95, 0xd4, 12, 0x67, 0xf9, 0x48, 0xec,

    0x54, 230, 0xf6, 0x93, 0x4c, 120, 0x9e, 15, 0xfd, 0x60, 0xf2, 0xd5, 0x9b, 0xcd, 0x6d, 0x1f,

    0x3d, 0xd6, 110, 0xf6, 0x84, 0x1f, 0x73, 0xae, 0x87, 0x9b, 70, 160, 20, 0xae, 0x47, 0x84,

    0x23, 1, 0x7d, 0x26, 0x65, 0x54, 0xc4, 0x4b, 0x39, 0x9e, 0xd1, 0xde, 0x31, 0xdf, 0x2b, 0x8f,

    0xcc, 0x47, 130, 0x49, 170, 0x8a, 0x92, 0x85, 0x7b, 0xce, 0x6f, 30, 90, 0x56, 0x58, 0xc1

    } ;

    ???
     
  4. SammIk

    SammIk Member

    Публикаций:
    0
    Регистрация:
    11 янв 2004
    Сообщения:
    90
    Адрес:
    Russia
    Думаю это поможет в понятии алгоритма.

    Правдо это баз64, но смысл ясен.

    [​IMG] 238405572__base64.zip
     
  5. DotNET

    DotNET New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2005
    Сообщения:
    7
    Что-то не то..

    прикладываю кодировщик / декодировщик base32

    ввожу ей ту же строку что и в вышенаписаную процедуру

    при трассировании процедуры на выходе получаются массив не символов а цифр...

    а при декодировании приложеной прогой символы...

    где собака порылась ?
     
  6. DotNET

    DotNET New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2005
    Сообщения:
    7
    С аттачем не получилось, он больше 50 кб....

    выкладываю его здесь: webfile.ru/174810
     
  7. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. const char base32[]="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
    2.  
    3. int code(char*dst,char*src,int len)
    4. {
    5.     int rlen=(len*8+4)/5;
    6.     for(int i=0;i<rlen;i++)
    7.         dst[i]=base32[(*(int*)(src+i*5/8)>>(i*5%8))&31];
    8.     return rlen;
    9. }
    10.  
    11. int decode(char*dst,char*src,int len)
    12. {
    13.     int rlen=(len*5)/8;
    14.     for(int i=0;i<rlen;i++)
    15.         dst[i]=0;
    16.     for(i=0;i<len;i++)
    17.     {
    18.         for(int j=0;j<32;j++)
    19.             if(base32[j]==src[i])
    20.                 break;
    21.         if(j==32)
    22.             return -i;
    23.         *(int*)(dst+i*5/8)|=j<<(i*5%8);
    24.     }
    25.     return rlen;
    26. }
    27.  
    28.  
    29. int main()
    30. {
    31.     char z[256],q[256];
    32.     int k=code(z,"abcdefgh01234567",16);
    33.     int l=decode(q,z,k);
    34.     return 0;
    35. }
     
  8. DotNET

    DotNET New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2005
    Сообщения:
    7
    Алгоритм base32 я уже разобрал и понял, в приложеном фале он реализован как в обну так и в обратную сторону...

    Вопрос в другом он не соответствует приведенному мной изначально...
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105




    frombase32 соответствует один в один

    тому, что в DEMO.exe.

    Видимо ты при программировании ошибся.

    Некоторые старые трансляторы любят с char работать

    как с 16-бит. Может ты на это попался.