2014-10-13 3 views
-2

Может ли кто-нибудь дать мне код для шифрования и расшифровки строк 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, что строка закодирована правильно Любые идеями

+5

Вы не зашифровать/расшифровать строки. Шифрование работает с двоичными данными. Вам нужно решить, как закодировать текст, а затем какой алгоритм шифрования использовать. Только вы можете решить. –

+1

Очень важно для части после расшифровки ** знать **, какие данные были зашифрованы. Строка также имеет кодировку (ANSI, UTF8, UTF16, ...), которую вы должны знать, чтобы получить ожидаемую информацию из байтового супа. То же самое с изображением. Вам нужно знать, что это образ и тип изображения (BMP, JPG, TIFF, ...) –

+2

Этот вопрос не соответствует теме, потому что stackoverflow не является сайтом «дайте мне код». –

ответ

4

использовать стандартизированные LIB? вместо того, чтобы пытаться создать собственное решение для шифрования. Например, существует несколько алгоритмов шифрования AES для Delphi (например, Eldos which is included in the NativeXML library). Написать строку (MyString) к потоку и зашифровать его:

var 
    lSourceStream: TStringStream; 
    lDestinationStream: TMemoryStream; 
begin 
    lSourceStream := TStringStream.Create(MyString); 
    lDestinationStream := TMemoryStream.Create; 
    AESencrypt(lSourceStream,lDestinationStream); 
    lDestinationStream.SaveToFile(<filename>); 
end; 
+1

Какое кодирование кода используется этим кодом? –

+1

Еще один интересный вопрос: какой ключ шифрования и режим работы используются здесь? – kludg

+0

@DavidHeffernan: Он использует кодировку по умолчанию, но чтобы убедиться, что используется Unicode, добавьте аргумент: TStringStream.Create (MyString, TEncoding.UniCode). – Hans

Смежные вопросы