Может ли кто-нибудь дать мне код для шифрования и расшифровки строк Unicode в delphi firemonkey Mobile? Я пробовал все с помощью xor с другими библиотеками, и ничего. Всегда есть символы, которые не считаются символом евро. Если кто-то может мне помочь, буду признателен.Шифровать и расшифровывать строку Unicode
Редактировать: Спасибо, Ханс, но всегда у меня такая же проблема с stringstream. Этот код работает отлично в окнах, но ИОС дает мне эту ошибку: «Нет отображения для символа Unicode существует в кодовой странице целевых многобайтной»
unit UMain;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, ElAES,
FMX.StdCtrls, FMX.Layouts, FMX.Memo, Math;
type
TForm2 = class(TForm)
ToolBar1: TToolBar;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
Layout1: TLayout;
Button1: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
PASSWORD = '1234';
var
Form2: TForm2;
implementation
{$R *.fmx}
{$R *.iPhone.fmx IOS}
function StringToHex(S: string): string;
var
i: integer;
begin
Result := '';
// Go throught every single characters, and convert them
// to hexadecimal...
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 := '';
// Go throught every single hexadecimal characters, and convert
// them to ASCII characters...
for i := 1 to Length(S) do
begin
// Only process chunk of 2 digit Hexadecimal...
if ((i mod 2) = 1) then
Result := Result + Chr(StrToInt('0x' + Copy(S, i, 2)));
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Source: TStringStream;
Dest: TStringStream;
Key: TAESKey128;
begin
try
Source := TStringStream.Create(Memo1.Text);
Dest := TStringStream.Create('');
FillChar(Key, SizeOf(Key), 0);
Move(PChar(PASSWORD)^, Key, Min(SizeOf(Key), Length(PASSWORD)));
EncryptAESStreamECB(Source, 0, Key, Dest);
//Memo1.Lines.BeginUpdate;
Memo1.Text := Dest.DataString;
//Memo1.Lines.EndUpdate;
Label2.Text := 'Texto Encriptado';
Source.Free;
Dest.Free;
except on E: Exception do
begin
ShowMessage(e.ToString);
Source.Free;
Dest.Free;
Memo1.Text :='';
end;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
var
Source: TStringStream;
Dest: TStringStream;
Key: TAESKey128;
Size: integer;
begin
try
Source := TStringStream.Create(Trim(Memo1.Text));
Dest := TStringStream.Create('');
Size := Source.Size;
Source.ReadBuffer(Size, SizeOf(Size));
FillChar(Key, SizeOf(Key), 0);
Move(PChar(PASSWORD)^, Key, Min(SizeOf(Key), Length(PASSWORD)));
Source.Position := 0;
DecryptAESStreamECB(Source, Source.Size - Source.Position, Key, Dest);
Memo1.Text := Trim(Dest.DataString);
Label2.Text := 'Texto Original';
Source.Free;
Dest.Free;
except on E: Exception do
begin
ShowMessage(e.ToString);
Source.Free;
Dest.Free;
Memo1.Text :='';
end;
end;
end;
end.
Я также пытался создать stringstream с этим:
Source := TStringStream.Create(Trim(Memo1.Text) , TEncoding.Unicode) ;
и иногда работает хорошо, а иногда дает мне следующую ошибку: "Лос-суррогат обугленной без предшествующего высокого суррогатного полукокса с индексом:. 8. chaeck, что строка закодирована правильно Любые идеями
Вы не зашифровать/расшифровать строки. Шифрование работает с двоичными данными. Вам нужно решить, как закодировать текст, а затем какой алгоритм шифрования использовать. Только вы можете решить. –
Очень важно для части после расшифровки ** знать **, какие данные были зашифрованы. Строка также имеет кодировку (ANSI, UTF8, UTF16, ...), которую вы должны знать, чтобы получить ожидаемую информацию из байтового супа. То же самое с изображением. Вам нужно знать, что это образ и тип изображения (BMP, JPG, TIFF, ...) –
Этот вопрос не соответствует теме, потому что stackoverflow не является сайтом «дайте мне код». –