Добрый день ! Помогите разобраться, раньше никогда с таким не сталкивался: В функцию передается строка из 26 символов: Код (Text): public static byte[] FromBase32String(string s) { int num1 = 24; long num2 = 0; ArrayList list1 = new ArrayList(); for (int num3 = 0; num3 < num1; num3 += 8) { num2 = 0; for (int num4 = num3; num4 < (num3 + 8); num4++) { num2 = num2 << 5; byte a1 =((byte) s[num4]); //Вызов функции frombase32 num2 |= frombase32((byte) s[num4]); } for (int num5 = 4; num5 >= 0; num5--) { list1.Add((byte) ((num2 >> ((num5 * 8) & 0x3f)) & 0xff)); } } num2 = 0; sbyte num6 = 0; int num7 = num1; while (num7 < 26) { num2 = num2 << 5; //Вызов функции frombase32 num2 |= frombase32((byte) s[num7]); num7++; num6 = (sbyte) (num6 + 1); } sbyte num8 = 0; switch (num6) { case 2: { num8 = 2; num6 = 1; break; } case 4: { num8 = 4; num6 = 2; break; } case 5: { num8 = 1; num6 = 3; break; } case 7: { num8 = 3; num6 = 4; break; } } num2 = num2 >> (num8 & 0x3f); for (int num9 = num6 - 1; num9 >= 0; num9--) { list1.Add((byte) ((num2 >> ((num9 * 8) & 0x3f)) & 0xff)); } return (byte[]) list1.ToArray(Type.GetType("System.Byte")); } //функция frombase32 private static byte frombase32(byte b) { if (b < 50) { throw new FormatException("Invalid character in a Base-32 string."); } if (b <= 0x39) { return (byte) (b - 0x1a); } if (b < 0x41) { throw new FormatException("Invalid character in a Base-32 string."); } if (b <= 0x48) { return (byte) (b - 0x41); } if (b == 0x49) { throw new FormatException("Invalid character in a Base-32 string."); } if (b <= 0x4e) { return (byte) (b - 0x42); } if (b == 0x4f) { throw new FormatException("Invalid character in a Base-32 string."); } if (b > 90) { throw new FormatException("Invalid character in a Base-32 string."); } return (byte) (b - 0x43); } Что это за алгоритм и как можно написать обратный ? Заранее благодарю !
Прямой алгоритм - это кодирование 16 байт в строку base32. Исходные 16 байт(128 бит + 2 чтобы делилось) разбиваются на блоки по 5 бит, и каждый блок заменяется на символ из следующей строки "ABCDEFGHJKLMNPQRSTUVWXYZ23456789". Скачай BASE64.LIB by Quantum, а также найди про неё тему на форуме и сделай аналогично 8)
переситал все темы форума где встречается слово 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 } ; ???
Что-то не то.. прикладываю кодировщик / декодировщик base32 ввожу ей ту же строку что и в вышенаписаную процедуру при трассировании процедуры на выходе получаются массив не символов а цифр... а при декодировании приложеной прогой символы... где собака порылась ?
Код (Text): const char base32[]="ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; int code(char*dst,char*src,int len) { int rlen=(len*8+4)/5; for(int i=0;i<rlen;i++) dst[i]=base32[(*(int*)(src+i*5/8)>>(i*5%8))&31]; return rlen; } int decode(char*dst,char*src,int len) { int rlen=(len*5)/8; for(int i=0;i<rlen;i++) dst[i]=0; for(i=0;i<len;i++) { for(int j=0;j<32;j++) if(base32[j]==src[i]) break; if(j==32) return -i; *(int*)(dst+i*5/8)|=j<<(i*5%8); } return rlen; } int main() { char z[256],q[256]; int k=code(z,"abcdefgh01234567",16); int l=decode(q,z,k); return 0; }
Алгоритм base32 я уже разобрал и понял, в приложеном фале он реализован как в обну так и в обратную сторону... Вопрос в другом он не соответствует приведенному мной изначально...
frombase32 соответствует один в один тому, что в DEMO.exe. Видимо ты при программировании ошибся. Некоторые старые трансляторы любят с char работать как с 16-бит. Может ты на это попался.