Алгоритм СИКдля кого он нужен???
Автор Ognimor, 24.09.2006, 05:01
#65
Отправлено 18.10.2006, 22:44:50
Я не говорю что он неверный, но человек хотел его в Оракл встроить...' date='18.10.2006, 10:23' post='2760257']
Мой алгоритм правильный! Можешь сам проверить и сравнить результаты с теми, что выдает dll-ка.
явно не на Дельфи код писать будет
Разработка, тестирование, перепроверка...
Уже давно бы базу всю перепроверил.
#67
Отправлено 19.10.2006, 09:35:27
на C
#include <string.h> #include <stdio.h> typedef unsigned long UL; typedef unsigned char UC; UC T2[] = {0x06,0x0C,0x08,0x04,0x0F,0x01,0x09,0x02,0x0A,0x0E,0x05,0x07,0x00,0x0B,0x03,0x0D, 0x05,0x0F,0x04,0x0D,0x00,0x07,0x0A,0x03,0x0E,0x0C,0x01,0x02,0x08,0x06,0x0B,0x09, 0x0A,0x08,0x01,0x0E,0x0B,0x02,0x03,0x00,0x0F,0x06,0x04,0x09,0x07,0x0C,0x05,0x0D, 0x07,0x0F,0x0A,0x0B,0x03,0x01,0x0D,0x08,0x04,0x05,0x0C,0x09,0x00,0x0E,0x02,0x06, 0x03,0x0C,0x07,0x0E,0x0D,0x01,0x05,0x0F,0x09,0x04,0x08,0x02,0x0B,0x00,0x06,0x0A, 0x09,0x0E,0x0B,0x02,0x0D,0x00,0x0C,0x0F,0x01,0x06,0x08,0x04,0x03,0x0A,0x07,0x05, 0x0C,0x03,0x06,0x09,0x05,0x08,0x0A,0x02,0x00,0x0D,0x0F,0x07,0x01,0x0E,0x0B,0x04, 0x0F,0x09,0x07,0x08,0x01,0x0E,0x04,0x06,0x0B,0x00,0x0C,0x02,0x0D,0x03,0x0A,0x05}; const char *CharValue = "0123456789ABCDEFGHJKMNPRSTUVWXYZ"; UC T1[32]; UC Data[128]; UC WorkByte[8]; UC M1[64]; UL ConvertValue1(UL Value){ UC Bv[8]; UL Tv; UC Tb; Tv = Value; for( int i=0; i<4; i++ ){ Bv[i*2] = UC(Tv & 0x0F); Bv[i*2+1] = UC((Tv & 0xF0) >> 4); Tv >>= 8; } for( int i = 0; i < 8; i++ ) { Tb = Bv[i]; Bv[i] = T2[i * 16 + Tb]; } Tv = 0; for( int i = 3; i >= 0; i-- ) { Tv <<= 8; Tv = Tv | Bv[i*2]; Tv = Tv | (Bv[i*2+1] << 4); } return Tv; } UL ConvertValue2(UL Value) { UL Tv; Tv = Value; for( int i = 0; i < 11; i++ ) { if( (Tv & 0x80000000L) == 0 ) { Tv += Tv; } else { Tv += Tv; Tv |= 1; } } return Tv; } void MyTestData(const char* sData, char *Ric ) { strcpy( Ric, "000000000000000T" ); memset( WorkByte, 0, sizeof(WorkByte)); memset( T1, 0xF0, sizeof(T1) ); memset( Data, 32, sizeof(Data) ); int sLength = (int)strlen(sData); for( int i = 0; i < sLength; i++ ) { Data[i] = sData[i]; } UC B = sLength / 32; if( (sLength % 32) != 0 ) B++; for( int j = 1; j <= B; j++ ) { unsigned int Ost = 0; for( int i = 31; i >= 0; i-- ) { unsigned int Temp = T1[i] + Data[(j-1)*32+i] + Ost; T1[i] = Temp & 0xFF; Temp > 0xFF ? Ost = 1 : Ost = 0; } } int Kd8 = sLength / 8; if( (sLength % 8) != 0 ) Kd8++; for( int Main = 0; Main < Kd8; Main++ ) { for( int i = 0; i <= 7; i++ ) WorkByte[i] ^= Data[8 * Main + i]; for( int i = 0; i <= 7; i++ ) { UL V1 = WorkByte[0] + (WorkByte[1] << 8) + (WorkByte[2] << 16) + (WorkByte[3] << 24); UL V2 = T1[i*4] + (T1[i*4+1] << 8) + (T1[i*4+2] << 16) + (T1[i*4+3] << 24); V1 = V1 + V2; V1 = ConvertValue1(V1); V1 = ConvertValue2(V1); V2 = WorkByte[4] + (WorkByte[5] << 8) + (WorkByte[6] << 16) + (WorkByte[7] << 24); V1 = V1 ^ V2; for( int j = 0; j <=3; j++ ) WorkByte[4 + j] = WorkByte[j]; WorkByte[0] = UC(V1 & 0xFF); WorkByte[1] = UC((V1 >> 8) & 0xFF); WorkByte[2] = UC((V1 >> 16) & 0xFF); WorkByte[3] = UC((V1 >> 24) & 0xFF); } for( int i = 0; i <= 6; i++ ) { UL V1 = WorkByte[0] + (WorkByte[1] << 8) + (WorkByte[2] << 16) + (WorkByte[3] << 24); UL V2 = T1[i*4] + (T1[i*4+1] << 8) + (T1[i*4+2] << 16) + (T1[i*4+3] << 24); V1 = V1 + V2; V1 = ConvertValue1(V1); V1 = ConvertValue2(V1); V2 = WorkByte[4] + (WorkByte[5] << 8) + (WorkByte[6] << 16) + (WorkByte[7] << 24); V1 ^= V2; for( int j = 0; j <= 3; j++ ) WorkByte[j+4] = WorkByte[j]; WorkByte[0] = UC(V1 & 0xFF); WorkByte[1] = UC((V1 >> 8) & 0xFF); WorkByte[2] = UC((V1 >> 16) & 0xFF); WorkByte[3] = UC((V1 >> 24) & 0xFF); } UL V1 = WorkByte[0] + (WorkByte[1] << 8) + (WorkByte[2] << 16) + (WorkByte[3] << 24); UL V2 = T1[28] + (T1[29] << 8) + (T1[30] << 16) + (T1[31] << 24); V1 += V2; V1 = ConvertValue1(V1); V1 = ConvertValue2(V1); V2 = WorkByte[4] + (WorkByte[5] << 8) + (WorkByte[6] << 16) + (WorkByte[7] << 24); V1 ^= V2; WorkByte[4] = UC(V1 & 0xFF); WorkByte[5] = UC((V1 >> 8) & 0xFF); WorkByte[6] = UC((V1 >> 16) & 0xFF); WorkByte[7] = UC((V1 >> 24) & 0xFF); } memset(M1, 0, sizeof(M1)); for( int i = 0; i <= 7; i++ ) { UC B = WorkByte[i]; UC C = 0x80; for(int j=0; j<=7; j++) { if( (B & C) == 0 ) M1[i*8+j] = 0; else M1[i*8+j] = 1; C>>=1; } } for(int i=0; i<=11; i++) { UC B = M1[i*5]+(M1[i*5+1]<<1)+(M1[i*5+2]<<2)+(M1[i*5+3]<<3)+(M1[i*5+4]<<4); Ric[i] = CharValue[B]; } B = (M1[60]<<1)+(M1[61]<<2)+(M1[62]<<3)+(M1[63]<<4); UC j1 = 0; for( int i = 0; i <= 63; i++ ) if( M1[i] == 1 ) j1++; j1 &= 1; B |= j1; Ric[12] = CharValue[B]; } void MyTestRic(char *Ric){ UL f = 0; for( int i = 0; i <= 14; i++ ){ f+=Ric[i] * (i + 1); } f%=31; Ric[15]=CharValue[f]; Ric[16]=0; }
#70
Отправлено 18.02.2009, 13:11:51
В оракле обработка получается дольше к сожалению.Я не говорю что он неверный, но человек хотел его в Оракл встроить...' date='18.10.2006, 10:23' post='2760257']
Мой алгоритм правильный! Можешь сам проверить и сравнить результаты с теми, что выдает dll-ка.
явно не на Дельфи код писать будет
Разработка, тестирование, перепроверка...
Уже давно бы базу всю перепроверил.
#72
Отправлено 20.03.2009, 11:10:48
Кстати, кому интересно - реализация в 1С
#80
Отправлено 04.02.2010, 12:33:57
Кому интересно открылся сайт sik.idhost.kz - чистые алгоритмы СИКа без дллок. Есть на яве в виде хранимой процедуры для Оракл.
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0