Проблема С Проверкой Подписи Через Capicom

#1
День добрый! У меня есть программа написанная на delphi 7, в ней производится подписание документов с помощью capicom. контент формируется следующим образом: SignedData.Content:=QryWhere.FieldByName('img2txt').AsVariant + DateToStr(sigDate);
после чего без проблем заверяется ЭЦП. и есть другая программа написанная на Embarcadero RAD Studio XE2 в которой производится проверка подписи следующим образом:
SignedData.Content:= VarToStr(ADOQ1.FieldByName('img2txt').AsVariant)+VarToStr(ADOQ1.FieldByName('DataSigA').AsString);
SignedData.Verify(Sig, true, 0);

при выполнении проверки вылетает неправильное значение Хеша.
Помогите пожалуйста реализовать грамотно проверку подписи, что бы не вылетало ошибок
 

sinkopa

Well-Known Member
#2
День добрый! У меня есть программа написанная на delphi 7, в ней производится подписание документов с помощью capicom. контент формируется следующим образом: SignedData.Content:=QryWhere.FieldByName('img2txt').AsVariant + DateToStr(sigDate);
после чего без проблем заверяется ЭЦП. и есть другая программа написанная на Embarcadero RAD Studio XE2 в которой производится проверка подписи следующим образом:
SignedData.Content:= VarToStr(ADOQ1.FieldByName('img2txt').AsVariant)+VarToStr(ADOQ1.FieldByName('DataSigA').AsString);
SignedData.Verify(Sig, true, 0);

при выполнении проверки вылетает неправильное значение Хеша.
Помогите пожалуйста реализовать грамотно проверку подписи, что бы не вылетало ошибок
Я не экстрасенс и кто такой у Вас SignedData.Content могу только догадываться... но подозреваю лажа вот тут
Код:
 + VarToStr(ADOQ1.FieldByName('DataSigA').AsString);
Либо поле берите как тип variant: VarToStr(ADOQ1.FieldByName('DataSigA').AsVariant)
Либо функцию VarToStr использовать не нужно.
Код:
SignedData.Content:= VarToStr(ADOQ1.FieldByName('img2txt').AsVariant)+ADOQ1.FieldByName('DataSigA').AsString;
Правда если у компилятора включена оптимизация, такое Ваше "нахальство" он может и подправить тихонько.
Ну тогда подозреваю что дело в строковом типе.
В Delphi 7 тип string это AnsiString (однобайтные символы) а в XE2 string это WideString (два байта на один символ).
Т.е. при одинаковом строковом содержании (например строка "Привет ХиТРый;)") длина в байтах у нее будет разная (для XE2 в два раза длиннее чем в Delphi 7).
Соответственно функция считающая Хеш даст разные результаты.