» Казахстанский Бухгалтерский форум www.balans.kz

Алгоритм формирования СИКа

 
Показать сообщения:
Начиная со старых .::. Начиная с новых


Автор: Нерезидент Баланса
Добавлено: #1  Сб Мар 04, 2006 16:28:26
Заголовок сообщения: Алгоритм формирования СИКа

База знаний http://balans.kz/viewtopic.php?p=283220#283220

Доброго всем времени суток. Разыскивается алгоритм проверки/формирования СИКа. Пожалуйста, не отсылайте к различным программам генерации СИК (вроде SPC_Check), нужен именно АЛГОРИТМ. Заранее спасибо всем откликнувшимся.



Автор: Нерезидент Баланса
Добавлено: #2  Сб Мар 04, 2006 17:07:27
Заголовок сообщения:

г-н Карабинер...а вы что нибудь слышали о модульном программировании ?


Автор: Talik
Добавлено: #3  Вс Мар 05, 2006 01:31:43
Заголовок сообщения:

Эту тему так недавно бурно обсуждали...


Автор: Нерезидент Баланса
Добавлено: #4  Вс Мар 05, 2006 08:47:18
Заголовок сообщения:

Starican говорит:
г-н Карабинер...а вы что нибудь слышали о модульном программировании ?


Если Вы о модуле tsric321.dll, то мне от него никакого толку. Я всего лишь хочу вставить в 1С кнопочку, которая будет проверять корректность СИКа, а вышеуказаная дллка не подключается к 1С ни под каким видом.



Автор: Нерезидент Баланса
Добавлено: #5  Вс Мар 05, 2006 13:09:42
Заголовок сообщения:

Karabiner говорит:
Если Вы о модуле tsric321.dll, то мне от него никакого толку. Я всего лишь хочу вставить в 1С кнопочку, которая будет проверять корректность СИКа, а вышеуказаная дллка не подключается к 1С ни под каким видом.

гм...если вы с Алматы, рекомендую глянуть конфигурацию Иманали...если с Астаны, гляньте Универсал, Спектрум, Бухгалтерский учет...все подключается, все работает...
мои знания о конфигурациях ограничены, может быть есть еще другие, где вышеуказанная ДЛЛ подключается и проверяет СИК....
также аналогичный функционал существует для общеказахстанской конфигурации "Бухучет для РК"....



Автор: Граур Станислав
Добавлено: #6  Пн Мар 06, 2006 08:15:10
Заголовок сообщения:

Karabiner говорит:
Я всего лишь хочу вставить в 1С кнопочку, которая будет проверять корректность СИКа, а вышеуказаная дллка не подключается к 1С ни под каким видом.

Легко подключается например
Код:

Перем Мсг;


//=======================================================
// Набор функций для тестирования СИК -
//   социального индивидуального кода для
//   граждан Республики Казахстан
//
//  Работает для 1Сv7.7
//           для 1Сv7.5 (нужно убрать обработку исключений)
//-------------------------------------------------------

//=======================================================
// tsric32.dll разработана компанией Кристал Лэйн для ГЦВП.
//     эта dll распространяется со многими
//     программами по перечислению пенсионных взносов.
//     Впрочем ее можно взять здесь http://???
//=======================================================
// Объект DynamicWrapper (c) Gunter Born
//     http://http://ourworld.compuserve.com/homepages/Guenter_Born/WSHBazaar/WSHDynaCall.htm
//     необходим для вызова функции из tsric32.dll
//     Этот файл можно взять
//     Для Windows9x          здесь: http://ourworld.compuserve.com/homepages/Guenter_Born/WSHBazaar/dynawrap95.zip
//     Для WindowsNT, 2K, XP  здесь: http://ourworld.compuserve.com/homepages/Guenter_Born/WSHBazaar/dynawrapNt.zip
//=======================================================
// Описание проверки сик и декларация функции TestData из tsric32.dll
//     взяты из FAQ AlexOR<alexor@host.kz>  http://web.host.kz/alexor/FAQs.htm
//=======================================================
//    Все это вместе соединил и протестировал
//       Граур Станислав, stas85@inbox.ru
//             2005 год
//=======================================================

// =================================================
// Порядок установки
// 1) Положить tsric32.dll и dynwrap.dll в PATH,
//    например в windows\system32
// 2) Зарегистрировать COM-объект из dynwrap.dll
//    regsvr32 dynwrap.dll
// 3) Поместить функции в глобальный модуль.
//
// 4) Все.
//
// Пример:
// глПроверитьСикПолностью("ГРАУРСТАНИСЛАВНИКОЛАЕВИЧ", '21.11.1974', "3UXEM0MVVF8Y200J")
// =================================================



// ====================  Проверка Сик ====================
// Возвращает       
//  0   сик верен
// -1   сик не заполнен
// -2   длина сик не 16 символов
// -3   сик содержит посторонние символы (русские буквы или буквы L, I, Q, O
// -4   дата рождения не задана
// -5   буквы в сик набраны не в верхнем регистре
// -20  Сик не соответствует ФИО или дате рождения
// -50  Неверная контрольная сумма в сик



// -100 техническим сбой
//
// =======================================================

// Просто проверяет сик (защита от дурака)
Функция глПроверкаСик(знач _фио, _датаРождения, _сик)
   Если _датаРождения = Дата(0) тогда
      возврат -4;
   конецЕсли;

   если Врег(_сик) <> _сик тогда
      возврат -5;
   конецЕсли;
      
   Если ПустаяСтрока(_сик) = 0 тогда
      дл = СтрДлина(_сик);
      Если дл = 16 тогда
         для й = 1  по дл цикл     
            буква = Сред(_сик, й, 1);
            Если ((буква >="0") и (буква <="9"))
             или ((буква >="A") и (буква <="Z") и (буква <> "L") и (буква <> "I") и (буква <> "Q") и (буква <> "O")) тогда
                  // Ничего не делаем
            иначе
               возврат -3
            конецЕсли;   
         конецЦикла;   
         возврат 0;    
      иначе
         возврат -2;
      конецЕсли;
   иначе         
      Возврат -1;
   конецЕсли;   
конецФункции   

// Тестирование СИК с помощью внешней dll
Функция глТестСик(знач _фио, _датаРождения, _сик)
   // подготовим фамилию
   _ФИО = Врег(_фио);
   __фио = "";
   для й = 1 по Стрдлина(_фио) цикл
      буква = Сред(_фио, й, 1);
      Если (Буква >= "А") и (буква <="Я") тогда
         __фио = __фио + буква;
      конецЕсли;   
   конецЦикла;                          
   
   // подготовим дату рождения
   // !!! bug идет закладка на разделить дат в виде . <- нужно переделать.
   __ДатаРождения = Формат(_датаРождения, "ДДДММГГГГ");
   __ДатаРождения = СтрЗаменить(__ДатаРождения, ".", "");
   
   
   
   Попытка
      дллВраппер = CreateObject("DynamicWrapper");
      дллВраппер.Register("tsric32.dll", "TestData", "I=ss", "f=s", "R=l");
      дллВраппер.Register("tsric32.dll", "TestRic",  "I=s", "f=s", "R=l");
   Исключение
      флаг = -100;
   КонецПопытки;
   
   Если флаг <> -100 Тогда
      флаг = дллВраппер.TestData(__ФИО+__ДатаРождения, _сик);
      флаг = ?(флаг=0,флаг, -20);
      Если флаг = 0 Тогда
         флаг = дллВраппер.TestRic(_сик);
         флаг = ?(флаг=0,флаг, -50);
      КонецЕсли;
   КонецЕсли;      
   возврат флаг;
конецФункции

// Враппер для проверки Сик
Функция глПроверитьСикПолностью(знач _фио, _датаРождения, _сик) экспорт
   _Флаг = глПроверкаСик(_фио, _датаРождения, _сик);
   Если _флаг = 0 тогда
      _Флаг =  _Флаг + глТестСик(_фио, _датаРождения, _сик);
   конецЕсли;   
   возврат _флаг;
конецФункции   

Функция глОписаниеОшибкиПриПроверкеСик(знач _ошибка) экспорт
   Если _ошибка = 0 тогда                                 
      возврат "сик верен";
   иначеЕсли _ошибка = -1  тогда
      возврат "сик не заполнен";
   иначеЕсли _ошибка = -2  тогда
      возврат "длина сик не 16 символов";
   иначеЕсли _ошибка = -3  тогда
      возврат "сик содержит посторонние символы (русские буквы или буквы L, I, Q, O)"
   иначеЕсли _ошибка = -4  тогда
      возврат "дата рождения не задана"
   иначеЕсли _ошибка = -5  тогда
      возврат "буквы в сик набраны не в верхнем регистре"
   иначеЕсли _ошибка = -20  тогда
      возврат "Сик не соответствует ФИО или дате рождения"
   иначеЕсли _ошибка = -50  тогда
      возврат "Неверная контрольная сумма в сик"
   иначеЕсли _ошибка = -100  тогда
      возврат "сик не верен (контрольная сумма не совпала). Возможна ошибка в фио, сик или дате рождения"      
   иначе
      возврат "Невозможно протестировать СИК. Нет необходимой компоненты.";
   конецЕсли      
конецФункции   

// ===========================================================================================

Процедура Сформировать()
   флаг = глПроверитьСикПолностью(ФИО, ДатаРождения, СИК);
   мсг = глОписаниеОшибкиПриПроверкеСик(флаг);
КонецПроцедуры




Автор: Нерезидент Баланса
Добавлено: #7  Пн Мар 06, 2006 08:16:43
Заголовок сообщения:

Цитата:

также аналогичный функционал существует для общеказахстанской конфигурации "Бухучет для РК"....


В конфигурации "Бухгалтерия для Казахстана" ничего подобного нет, там есть проверка корректности РНН. А насчет остальных, спасибо, посмотрю.



Автор: Нерезидент Баланса
Добавлено: #8  Пн Мар 06, 2006 08:43:19
Заголовок сообщения:

Цитата:

Легко подключается например


Ну если легким можно назвать подключение через седьмое колено, тогда пожалуй. Спасибо, попробую все это провернуть. Но как я понял генерировать СИК все-таки не получается (я это к тому, что многих бухгалтеров аж в дрожь бросает, когда они начинают вводить СИК, а было бы неплохо: ввел ФИО, дату рождения и оп-ля СИК уже есть).



Автор: Технический
Добавлено: #9  Пн Мар 06, 2006 10:10:15
Заголовок сообщения:

(8)Разберем проблему почему у Вас, не подключается библиотека сика? Винда? Код?


Автор: Нерезидент Баланса
Добавлено: #10  Пн Мар 06, 2006 10:28:14
Заголовок сообщения:

г-ну Карабинеру - почему не получается генерить СИК ? ТРС321.ДЛЛ служит как для проверки так и для генерации СИК...в типовой поставке ЕТК этого функционала нету, он распространяется отдельно за доплату многими франчами...наскока я знаю...
подключение достаточно легкое...несколько строк...
странный вы кодер...все вам в рот положи и разжуй...не пробовали мыслить креативно ? найти образец, обработать напильником....

г-ну Грауру...можно и так как вы описали...недостаток - ручная регистрация динврап.ДЛЛ...хотя еще кажется со времен Вин3.11 существуют саморегистрирующиеся ДЛЛ (self-register)...



Автор: Граур Станислав
Добавлено: #11  Пн Мар 06, 2006 11:00:40
Заголовок сообщения:

Starican говорит:

г-ну Грауру...можно и так как вы описали...недостаток - ручная регистрация динврап.ДЛЛ...хотя еще кажется со времен Вин3.11 существуют саморегистрирующиеся ДЛЛ (self-register)...


1) Это работает
2) ДинВрап не моя dll :-(
3) Как сделать self-register dll я не знаю потому как см.п.1

Кто предложит более другой код и красивый код ?

По поводу генерации СИК в сети (http://web.host.kz/alexor/FAQs.htm)есть версия tsric которая генерит СИК



Автор: Нерезидент Баланса
Добавлено: #12  Пн Мар 06, 2006 22:22:09
Заголовок сообщения:

г-ну Грауру...
Погонял я эти функции и так и сяк и получил неутешительные результаты: при наличии ФИО, даты рождения и ЛЮБОГО СИКа получается результат "СИК корректен", ошибки вылетают только при отсутствии какого-либо реквизита.

Ну неужели никто не знает алгоритм генерации, по-моему это лучше всяких *.dll?



Автор: Нерезидент Баланса
Добавлено: #13  Пн Мар 06, 2006 22:33:33
Заголовок сообщения:

конечно, знают...обратитесь в МТиСЗН...узнаете много о себе нового...


Автор: Нерезидент Баланса
Добавлено: #14  Пн Мар 06, 2006 22:58:42
Заголовок сообщения:

Цитата:
Разберем проблему почему у Вас, не подключается библиотека сика? Винда? Код?

Я конечно не претендую на всезнание, но насколько я в курсе внешние библиотеки подключаются к 1С как внешние компоненты (ВК) или как OLE/COM объекты. Как ВК tsric321.dll не подключается, поскольку не соответствует стандартам ВК для 1С, как OLE/COM объекты тоже не работает, в связи с отсутствием точек входа, с динВрап похоже запускается в каком-то урезанном виде.

P.S. Вопрос администратору: а где кнопочка "правка сообщения"?



Автор: Нерезидент Баланса
Добавлено: #15  Вт Мар 07, 2006 00:30:47
Заголовок сообщения:

ну что ж...тогда рекомендую заплатить специалисту...


Автор: Граур Станислав
Добавлено: #16  Вт Мар 07, 2006 10:13:04
Заголовок сообщения:

Цитата:
с динВрап похоже запускается в каком-то урезанном виде.


В каком месте она обрезана ?
Мне сейчас лень смотреть какие еще функции есть в tsric - я подключил только нужные _мне_.


To Starican:
Ты прав, ты как всегда прав...



Автор: Технический
Добавлено: #17  Вт Мар 07, 2006 12:08:52
Заголовок сообщения:

Karabiner говорит:
P.S. Вопрос администратору: а где кнопочка "правка сообщения"?
Она доступна только модераторам. Случаи с вандализмом правки своих сообщений пользователя, я устал бороться. Не нужно править, я это не позволяю админам и модерам. Исправляйтесь в следующем посте. Человека узнаем, и поймем что хотел.


Автор: Технический
Добавлено: #18  Вт Мар 07, 2006 12:10:51
Заголовок сообщения:

Граур Станислав говорит:
To Starican:
Ты прав, ты как всегда прав...
Мдя, прям жаба давит))))). А ведь не всегда.


Автор: Нерезидент Баланса
Добавлено: #19  Вт Мар 07, 2006 22:28:03
Заголовок сообщения:

Цитата:
В каком месте она обрезана ?

г-ну Грауру...
Исходя из спецификаций, tsric321.dll должен генерировать СИК и сравнивать его с исходным СИКом, а этого как раз и не происходит. Исходный СИК (если он длинной 16 символов (даже такой: 1234567891234567) и не содержит ничего лишнего) просто прогоняется через tsric321.dll и на выходе мы получаем "0" (т.е. ошибок нет). А все "ошибки" появляющиеся вследствии выполнения вышеупомянутых функций являются только лишь доказательством Вашей высокой квалификации, но к сожалению всё это делается средствами 1С и tsric321.dll в этом никак не участвует.



Автор: Нерезидент Баланса
Добавлено: #20  Ср Мар 08, 2006 01:34:59
Заголовок сообщения:

г-ну Лоссу. Да, Старикан прав не всегда.
г-ну Карабинеру. Еще раз настойчиво рекомендую найти и просмотреть конфигурацию/и, где это функционал уже реализован...ИЛИ же - плюнуть слюной на все это...отмазавшись тем, что СКОРО СИКи будут отменены...



Автор: Elis
Добавлено: #21  Ср Мар 08, 2006 12:49:23
Заголовок сообщения:

Starican говорит:
...ИЛИ же - плюнуть слюной на все это...отмазавшись тем, что СКОРО СИКи будут отменены...

Откуда такие сведения...?



Автор: Нерезидент Баланса
Добавлено: #22  Ср Мар 08, 2006 13:06:49
Заголовок сообщения:

дык...это уже не сведения, а баян ваще-то...слыхали про ИН/БИН ?


Автор: Нерезидент Баланса
Добавлено: #23  Пт Мар 10, 2006 08:40:41
Заголовок сообщения:

Starican говорит:
дык...это уже не сведения, а баян ваще-то...слыхали про ИН/БИН ?

А поподробнее...



Автор: Нерезидент Баланса
Добавлено: #24  Пт Мар 10, 2006 08:58:39
Заголовок сообщения:

СИК (для ФЛ), РНН (для ФЛ, ЮЛ), и IDKAZ (для ФЛ) будет заменен ЕДИНЫМ номером - для ФЛ - ИН (идентификационный номер, будет тока из цыфр), для ЮЛ - БИН (бизнес-идентификационный номер, тоже тока из цыфр)...


Автор: Elis
Добавлено: #25  Пт Мар 10, 2006 16:29:00
Заголовок сообщения:

Застрелиться... Деньги им девать некуда...


Автор: Нерезидент Баланса
Добавлено: #26  Пт Мар 10, 2006 16:32:42
Заголовок сообщения:

напротив, все очень логично - в проэкте...вместо ТРЕХ разномастных идентификаторов, идентифицирующих ФЛ/ЮЛ в базах НК, МВД, ГЦВП, мы получаем ОДИН идентификатор во ВСЕХ базах, ОДНОЗНАЧНО идентифицирующий ФЛ/ЮЛ...вот тока переходный период будет - застрелицца (ИМХО)...




Автор: Нерезидент Баланса
Добавлено: #27  Сб Мар 11, 2006 07:56:38
Заголовок сообщения:

Elis говорит:
Застрелиться... Деньги им девать некуда...


Во-во... Крючкотворы, с чугунными мозгаии...



Автор: Нерезидент Баланса
Добавлено: #28  Сб Мар 11, 2006 13:27:12
Заголовок сообщения:

гн- Карабинер, это же наша работа...не было бы крючкотворов, чем бы мы занимались ?
ээээээ, вижу, вы впали в отчаяние...если вы в Астане, можете подъехать в мою берлогу...пиво с вас - покажу как сделать СИКи...да, и кстати, в какую конфу сие надо врезать - не мешало бы знать...и какой клиент - тоже...



Автор: Нерезидент Баланса
Добавлено: #29  Сб Мар 11, 2006 21:20:05
Заголовок сообщения:

Нееее... мы не впали в отчаяние. Просто хотелось сделать людям приятное, но раз алгоритм СИКа является государственной тайной... ну что ж, пусть мучаются.
Насчет берлоги... мы ж не столичные, местечковые; а конфа моя, и клиентов немало...



Автор: Нерезидент Баланса
Добавлено: #30  Сб Мар 11, 2006 21:37:40
Заголовок сообщения:

вот еще сцылка - прога проверки СИКа (АС 'Прием отчислений в банках')...http://www.bi.kz/downloads.php....

а в какой туманности галактики находится ваше местечко ?

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



Автор: d.Fedor
Добавлено: #31  Пн Мар 13, 2006 09:29:24
Заголовок сообщения:

Karabiner говорит:
Нееее... мы не впали в отчаяние. Просто хотелось сделать людям приятное, но раз алгоритм СИКа является государственной тайной... ну что ж, пусть мучаются.
Насчет берлоги... мы ж не столичные, местечковые; а конфа моя, и клиентов немало...

Я бы не советовал, проверка, это нормально, но формирование... Во первых частенько при формирование присутствуют ошибки, неправильные буквы, смена фамилиии и т.п. Ну и будут вам звонки типа не работает, деньги дерете....



Автор: Нерезидент Баланса
Добавлено: #32  Вт Мар 14, 2006 13:29:33
Заголовок сообщения:

Однако многие требуют...


Автор: d.Fedor
Добавлено: #33  Вт Мар 14, 2006 14:51:35
Заголовок сообщения:

В сад, то биш к пенсионному фонду. Я спокойно даю номер телефона ГПНФ и советую потребовать у них... Вопрос как-то снимаеться сам собой. Повторюсь, даже если раздобыть алгоритм, будет больше проблем. При введение Сиков была неразбериха, я это хорошо помню. Очень часто были ошибки, особенно в фамилиях. Потом проблемы возникали при передаче платежей, бухгалтер то вводил нормальные паспортные данные (чаще всего), а у человека при формирование сика ошиблись с буквой в фамилии, в итоге сик другой. Ну ладно человек пошел, оббил пороги исправил, другой махнул рукой, потом пошел на другую работу и снова эпопея и головная боль бухгалтера с возвращенными суммами... Здесь картинка будет та-же....


Автор: Нерезидент Баланса
Добавлено: #34  Сб Мар 18, 2006 08:46:00
Заголовок сообщения:

Поставил кнопку вызова SPC_gen, так что, если бухгалтер не очень ленивый, сможет проверить СИК.


Автор: Нерезидент Баланса
Добавлено: #35  Пн Мар 27, 2006 17:39:39
Заголовок сообщения:

Не про СИК,зато про генерацию,мож ктонить чёнить видел по генерации РНН


Автор: Технический
Добавлено: #36  Пн Мар 27, 2006 20:31:15
Заголовок сообщения:

(35)


Автор: Нерезидент Баланса
Добавлено: #37  Вт Мар 28, 2006 09:56:12
Заголовок сообщения:

to 36
Пасиба



Автор: Нерезидент Баланса
Добавлено: #38  Чт Янв 10, 2008 14:02:11
Заголовок сообщения:

Starican говорит:
г-ну Лоссу. Да, Старикан прав не всегда.
г-ну Карабинеру. Еще раз настойчиво рекомендую найти и просмотреть конфигурацию/и, где это функционал уже реализован...ИЛИ же - плюнуть слюной на все это...отмазавшись тем, что СКОРО СИКи будут отменены...

Эта ваша dll кривая в *, при многопоточном режиме она рушится, потому как руки ни из того места растут у того, кто ее собирал.
При просмотре в отладчике прекрасно видно, что она не поддерживает многопоточности.
Если уж этот алгоритм такая тайна, покрытая мраком, то давайте хоть DLL правильно под ось 32 соберем. Или для каждой платформы сделали бы либы, а лучше реализовали на java :).
Сразу видно госконтора со студентами.



Автор: Serp
Добавлено: #39  Вс Ноя 23, 2008 20:01:17
Заголовок сообщения: Алгоритм СИК, из недр инета...

Anonymous говорит:
Starican говорит:
г-ну Лоссу. Да, Старикан прав не всегда.
г-ну Карабинеру. Еще раз настойчиво рекомендую найти и просмотреть конфигурацию/и, где это функционал уже реализован...ИЛИ же - плюнуть слюной на все это...отмазавшись тем, что СКОРО СИКи будут отменены...

Эта ваша dll кривая в *, при многопоточном режиме она рушится, потому как руки ни из того места растут у того, кто ее собирал.
При просмотре в отладчике прекрасно видно, что она не поддерживает многопоточности.
Если уж этот алгоритм такая тайна, покрытая мраком, то давайте хоть DLL правильно под ось 32 соберем. Или для каждой платформы сделали бы либы, а лучше реализовали на java :).
Сразу видно госконтора со студентами.

Пожалте сударь!
#***
#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] = (Tv & 0x0F);
Bv[i*2+1] = ((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;
if( Temp > 0xFF ) { Ost = 1; } else { 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] = (V1 & 0xFF);
WorkByte[1] = ((V1 >> 8) & 0xFF);
WorkByte[2] = ((V1 >> 16) & 0xFF);
WorkByte[3] = ((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] = (V1 & 0xFF);
WorkByte[1] = ((V1 >> 8) & 0xFF);
WorkByte[2] = ((V1 >> 16) & 0xFF);
WorkByte[3] = ((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] = (V1 & 0xFF);
WorkByte[5] = ((V1 >> 8) & 0xFF);
WorkByte[6] = ((V1 >> 16) & 0xFF);
WorkByte[7] = ((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;
}

void main( argc, argv )

int argc;
char *argv[];

{
char Dta[256];
char Ric[256];

strcpy( Dta, "ФФФФФИИИИИООООО31121980" );
strcpy( Ric, "000000000000000T" );
MyTestData( argv[1], Ric );
MyTestRic( Ric );
printf( "%s\n", Ric );
}
#***

Вопросик только есть - стандарт СТ РК 1048 - работать НЕ будет?
Хто скажет?



  

Служба поддержки WWW.BALANS.KZ