31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
1

Delphi XE vs Delphi 7

07.05.2014, 14:41. Показов 1986. Ответов 14
Метки нет (Все метки)

Всем привет. На просторах интернета нашел класс для шифрования строки. На Delphi 7 она нормально шифруется и дешифруется, а на Delphi XE нет. В чем может быть проблема?
P.s. компилировал один и тот же проект.
Первое изображение с Delphi 7
Второе с Delphi XE
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Изображения
  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2014, 14:41
Ответы с готовыми решениями:

Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще...

ZipForge для Delphi Xe - интерфейс стал выглядеть как в Delphi 2007
Народ!!! Помоготи!!! Установил компонент ZipForge для Delphi Xe и после этого интерфейс моей...

Почему функция работающая в Delphi 7 не работает в Delphi 2007 и в 2009 ??
Данный код работал нормально в D7: procedure TForm1.Button1Click(Sender: TObject); begin...

Какова разница работы одного кода в Delphi 7 и в Delphi XE5?
Почему приложение состоящие из одинакового кода, но компилируемое в разных средах работает по...

14
пофигист широкого профиля
4398 / 2896 / 820
Регистрация: 15.07.2013
Сообщений: 16,716
07.05.2014, 14:45 2
Начиная с Д2009 Дельфийский тип string использует юникод
0
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
07.05.2014, 14:58  [ТС] 3
можно это как-нибудь исправить для XE?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31154 / 20362 / 7929
Регистрация: 22.10.2011
Сообщений: 35,295
Записей в блоге: 6
07.05.2014, 15:13 4
Ты ж не показываешь, какой класс нашел, значит, придется тебе исправлять самому... Телепаты поувольнялись все.
0
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
08.05.2014, 12:32  [ТС] 5
Телепаты всегда будут в строю)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
unit cipher;
 
interface
 
uses Windows, SysUtils;
 
type
  HCRYPTPROV  = ULONG;
  HCRYPTKEY   = ULONG;
 
  TPassSaver = class
  private
    hProv: HCRYPTPROV;   // криптопровайдер
    hSKey: HCRYPTKEY;    // сессионный ключ
  public
    constructor Create(pass: string);
    {* конструктор }
    destructor Destroy; override;
    {* деструктор }
    function HideStr(s: string): string;
    {* зашифровать строку }
    function ShowStr(s: string): string;
    {* расшифровать строку }
  end;
 
implementation
 
const
  ADVAPI32    = 'advapi32.dll';
  PROV_RSA_FULL    = 1;
  CRYPT_VERIFYCONTEXT = $F0000000;
  CALG_RC4         = ((3 shl 13) or (4 shl 9) or 1);
  CALG_RC2         = ((3 shl 13) or (3 shl 9) or 2);
  CALG_SHA         = ((4 shl 13) or 0 or 4);
 
Type
  ALG_ID = ULONG;
  PHCRYPTPROV = ^HCRYPTPROV;
  PHCRYPTKEY  = ^HCRYPTKEY;
  LPAWSTR = PWideChar;
  HCRYPTHASH  = ULONG;
  PHCRYPTHASH = ^HCRYPTHASH;
function CryptReleaseContext(hProv:HCRYPTPROV;dwFlags:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptReleaseContext';
function CryptAcquireContext(Prov:PHCRYPTPROV;Container:LPAWSTR;Provider:LPAWSTR;ProvType:DWORD;Flags:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptAcquireContextW';
function CryptEncrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len:PDWORD;BufLen:DWORD):BOOL;stdcall;external ADVAPI32 name 'CryptEncrypt';
function CryptDecrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len:PDWORD):BOOL;stdcall;external ADVAPI32 name 'CryptDecrypt';
function CryptCreateHash(Prov:HCRYPTPROV;Algid:ALG_ID;Key:HCRYPTKEY;Flags:LongInt;Hash:PHCRYPTHASH):BOOL;stdcall;external ADVAPI32 name 'CryptCreateHash';
function CryptHashData(Hash:HCRYPTHASH;Data:PBYTE;DataLen :LongInt;Flags:LongInt):BOOL;stdcall;external ADVAPI32 name 'CryptHashData';
function CryptDeriveKey(Prov:HCRYPTPROV;Algid:ALG_ID;BaseData:HCRYPTHASH;Flags:LongInt;Key:PHCRYPTKEY) :BOOL;stdcall;external ADVAPI32 name 'CryptDeriveKey';
function CryptDestroyHash(hHash :HCRYPTHASH) :BOOL;stdcall;external ADVAPI32 name 'CryptDestroyHash';
 
constructor TPassSaver.Create(pass: string);
var
  hash: HCRYPTHASH;
begin
  inherited Create;
  CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
  CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
  CryptHashData(hash, @pass[1], length(pass), 0);
  // Если в следующей строке заменить RC4 на RC2, то будет блочное шифрование
  // оно лучше тем, что в закрытом варианте кол-во символов неочевидно
  CryptDeriveKey(hProv, CALG_RC4, hash, 0, @hSKey);
  CryptDestroyHash(hash);
end;
 
destructor TPassSaver.Destroy;
begin
  CryptReleaseContext(hProv, 0);
  inherited;
end;
 
function StringToHex(s: string): string;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(s) do
    result := result + IntToHex(ord(s[i]), 2);
end;
 
function HexToString(s: string): string;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(s) div 2 do
    try result := result + chr(StrToInt('$' + copy(s, i*2-1, 2)));
    except result := result + '?'; end;
end;
 
function TPassSaver.HideStr(s: string): string;
var
  p:  PByte;
  sz: dword;
begin
  sz := Length(s);
  GetMem(p, sz + 8); move(s[1], p^, sz);
  if CryptEncrypt(hSKey, 0, true, 0, p, @sz, sz + 8) then
  begin
    SetLength(result, sz);
    move(p^, result[1], sz);
    result := StringToHex(result);
  end else result := s;
  FreeMem(p);
end;
 
function TPassSaver.ShowStr(s: string): string;
var
  p:  PByte;
  sz: dword;
begin
  s := HexToString(s);
  sz := Length(s);
  GetMem(p, sz); move(s[1], p^, sz);
  if CryptDecrypt(hSKey, 0, true, 0, p, @sz) then
  begin
    SetLength(result, sz);
    move(p^, result[1], sz);
  end else result := s;
  FreeMem(p);
end;
 
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
  Form1: TForm1;
  ps:    TPassSaver;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  ps := TPassSaver.Create('460180F1-A607-4729-BE83-A53297851AC4');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ps.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := ps.HideStr(Edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit3.Text := ps.ShowStr(Edit2.Text)
end;
как-то так

Добавлено через 20 часов 59 минут
Никаких идей?
0
fatal error
136 / 128 / 29
Регистрация: 10.04.2012
Сообщений: 357
08.05.2014, 13:44 6
Для начала замени все string на AnsiString

Во вторых вот эта функа выдает при строке Pass в XE - 'a9Qe'
А в delphi 7 - 'a9Qй'

Delphi
1
2
3
4
5
6
7
8
9
function HexToString(s: AnsiString): AnsiString;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(AnsiString(s)) div 2 do
    try result := result + chr(StrToInt('$' + copy(AnsiString(s), i*2-1, 2)));
    except result := result + '?'; end;
end;
0
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
08.05.2014, 16:07  [ТС] 7
Заменил все string на ansistring и заменил ту функцию. Некоторые значения нормально переделывает, некоторые нет. А что еще надо исправить, чтобы нормально переводило?
0
fatal error
136 / 128 / 29
Регистрация: 10.04.2012
Сообщений: 357
08.05.2014, 16:18 8
Приведи код функции которую ты заменил
0
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
08.05.2014, 17:15  [ТС] 9
Вот этот
Delphi
1
2
3
4
5
6
7
8
9
function HexToString(s: string): string;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(s) div 2 do
    try result := result + chr(StrToInt('$' + copy(s, i*2-1, 2)));
    except result := result + '?'; end;
end;
на тот, что был скинут
Delphi
1
2
3
4
5
6
7
8
9
function HexToString(s: AnsiString): AnsiString;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(AnsiString(s)) div 2 do
    try result := result + chr(StrToInt('$' + copy(AnsiString(s), i*2-1, 2)));
    except result := result + '?'; end;
end;
0
fatal error
136 / 128 / 29
Регистрация: 10.04.2012
Сообщений: 357
08.05.2014, 17:32 10
Ну за тебя я делать не буду, времени у меня особо свободного нет, надо было вчера вылаживать...
В юните ciper в раздел uses добавляем dialogs

Код рихтуем вот так:
Delphi
1
2
3
4
5
6
  result := '';
  for i := 1 to Length(s) div 2 do
  begin
  ShowMessage (chr(StrToInt('$' + copy(s, i*2-1, 2))) + ' -' + copy(s, i*2-1, 2));
  result := result + chr(StrToInt('$' + copy(s, i*2-1, 2)));
  end;
И пробуем запускать в XE и 7 (но уже с исправлениями AnsiString)
0
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
08.05.2014, 19:14  [ТС] 11
Теперь шифрует в 7 и ХЕ одинаково, но дешифрует по-разному. Некоторые символы декодирует одинаково, но не все...
0
fatal error
136 / 128 / 29
Регистрация: 10.04.2012
Сообщений: 357
09.05.2014, 12:12 12
Лучший ответ Сообщение было отмечено sheldon-yura как решение

Решение

Вот так исправить функцию:
Delphi
1
2
3
4
5
6
7
8
9
10
11
function HexToString(s: AnsiString): String;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length((s)) div 2 do
  begin
    try result := result + AnsiChar(StrToInt('$' + copy(AnsiString(s), i*2-1, 2)));
    except result := result + '?'; end;
end;
end;
и почитать надосуге - http://delphi-craft.blogspot.ru/
1
31 / 31 / 16
Регистрация: 02.11.2011
Сообщений: 216
09.05.2014, 14:42  [ТС] 13
ок. спасибо. тема закрыта
0
northener
09.05.2014, 14:58
  #14

Не по теме:

и почитать надосуге - http://delphi-craft.blogspot.ru/
Особенно вдохновляет в таких статьях рекомендация использовать функцию CharInSet вместо конструкции Char in ['a', 'b', 'c'] ибо это якобы решает проблему с проверкой вхождения символа во множество. Смотрел ли автор исходники этой функции?

0
U_Dimas
09.05.2014, 15:11     Delphi XE vs Delphi 7
  #15

Не по теме:

northener, ну можно откоментить в бложек, благо формат позволяет. Ну или предоставить свой вариант

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2014, 15:11

Помощь в написании контрольных, курсовых и дипломных работ здесь.

где найти delphi c компилятором? и с чего начинать программирование в delphi?
здравствуйте, вот начинаю изучать delphi с чего начинать лучше?

Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi
Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi?

У меня есть литература для изучения delphi 7. Могу ли я по ней изучить delphi 2010?
Всем привет. Очередной семестр в универе подходит к концу, а лабы по программированию сданы и мне...

В Delphi можно приравнивать строки? например уменя Массив из строк (Фамиоий и имён )|Delphi
нужно узнать есть одно фамильцы там они у меня в StringGrid.Cells 1 это фамилии а 2 столбец...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.