Перейти к содержанию
Fire Monkey от А до Я
  • 1

[Android] Шифрование


brunnengi

Вопрос

Рекомендуемые сообщения

  • 0
  • Модераторы

В GetIt есть LockBox VCL and FMX 2.1. Вполне юзабельно.

Зашифровать:
    AES := TLbRijndael.Create(nil);
    try
      AES.CipherMode := TLbCipherMode.cmCBC;
      AES.KeySize := TLbKeySizeRDL.ks256;
      AES.GenerateKey(Passphrase);
      FPassword := AES.EncryptString(Value);
    finally
      AES.Free;
    end;

Расшифровать:
    AES := TLbRijndael.Create(nil);
    try
      AES.CipherMode := TLbCipherMode.cmCBC;
      AES.KeySize := TLbKeySizeRDL.ks256;
      AES.GenerateKey(Passphrase);
      Result := AES.DecryptString(FPassword);
    finally
      AES.Free;
    end;

 

p.s. Тему перенёс в подходящий раздел

Ссылка на комментарий
  • 0
2 минуты назад, Andrey Efimov сказал:

В GetIt есть LockBox VCL and FMX 2.1. Вполне юзабельно.


Зашифровать:
    AES := TLbRijndael.Create(nil);
    try
      AES.CipherMode := TLbCipherMode.cmCBC;
      AES.KeySize := TLbKeySizeRDL.ks256;
      AES.GenerateKey(Passphrase);
      FPassword := AES.EncryptString(Value);
    finally
      AES.Free;
    end;

Расшифровать:
    AES := TLbRijndael.Create(nil);
    try
      AES.CipherMode := TLbCipherMode.cmCBC;
      AES.KeySize := TLbKeySizeRDL.ks256;
      AES.GenerateKey(Passphrase);
      Result := AES.DecryptString(FPassword);
    finally
      AES.Free;
    end;

 

p.s. Тему перенёс в подходящий раздел

Смогут ли эти данные быть расшифрованными в php?

Ссылка на комментарий
  • 0
  • Модераторы
4 минуты назад, sviat9440 сказал:

Смогут ли эти данные быть расшифрованными в php?

Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https (Post методом) он передавался открыто (тут уж как заказчик сказал, так и делаем).

Ссылка на комментарий
  • 0
Только что, Andrey Efimov сказал:

Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https он передавался открыто (тут уж как заказчик сказал, так и делаем).

Ясно. Просто у меня не получилось расшифровать. Может что-то неправильно делал...

Ссылка на комментарий
  • 0

Удалось зашифровать и дешифровать текст в трех ЯП Delphi, PHP, GoLang

PHP. Используется phpseclib v1.0.7

<?php
// phpseclib 1.0.7
// http://phpseclib.sourceforge.net 
set_include_path('phpseclib');
include('Crypt/AES.php');

$my_key = 'HJORNYCZJXJBUGOA';
$my_iv = '1234567890ABCDEF';
$text = 'Проверка UTF8 текста';
$cipher = new Crypt_AES(); // CRYPT_AES_MODE_CBC
$cipher->setKeyLength(128);
$cipher->setKey($my_key);
$cipher->setIV($my_iv);
echo base64_encode($cipher->encrypt($text)).PHP_EOL;

 

Delphi. Использую TMS Cryptography Pack

uses CryptBase, AESObj, MiscObj;

function AesEncryption:String;
var
  AES: TAESEncryption;
begin
  AES := TAESEncryption.Create(nil);
  try
    AES.AType := atCBC;
    AES.KeyLength := kl128;
    AES.OutputFormat := base64;
    AES.Key := 'HJORNYCZJXJBUGOA';
    AES.IVMode := AESObj.userdefined;
    AES.IV := '1234567890ABCDEF';
    result := AES.Encrypt('Проверка UTF8 текста');
  finally
    AES.Free;
  end;
end;

GoLang. Все родное. Запустить в песочнице

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

func PKCS5Padding(src []byte, blockSize int) []byte {
    padding := blockSize - len(src)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(src, padtext...)
}

func PKCS5UnPadding(src []byte) []byte {
    length := len(src)
    unpadding := int(src[length-1])
    return src[:(length - unpadding)]
}

func AesEncryption(key, iv, plainText []byte) ([]byte, error) {

    block, err := aes.NewCipher(key)

    if err != nil {
        return nil, err
    }

    blockSize := block.BlockSize()
    origData := PKCS5Padding(plainText, blockSize)
    blockMode := cipher.NewCBCEncrypter(block, iv)
    cryted := make([]byte, len(origData))
    blockMode.CryptBlocks(cryted, origData)
    return cryted, nil
}

func AesDecryption(key, iv, cipherText []byte) ([]byte, error) {

    block, err := aes.NewCipher(key)

    if err != nil {
        return nil, err
    }

    blockMode := cipher.NewCBCDecrypter(block, iv)
    origData := make([]byte, len(cipherText))
    blockMode.CryptBlocks(origData, cipherText)
    origData = PKCS5UnPadding(origData)
    return origData, nil
}

func main() {
    originalText := "Проверка UTF8 текста"
    fmt.Println(originalText)
    mytext := []byte(originalText)

    key := []byte("HJORNYCZJXJBUGOA")
    iv := []byte("1234567890ABCDEF")

    cryptoText, err := AesEncryption(key, iv, mytext)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(base64.StdEncoding.EncodeToString(cryptoText))
    decryptedText, _ := AesDecryption(key, iv, cryptoText)
    fmt.Println(string(decryptedText))
}

 

К сожалению бесплатной либы для Delphi, чтоб работало в WIN и Android не нашел.

 

Ссылка на комментарий
  • 0

в дополнение преидущего поста, нашел бесплатное решение для Delphi у китайских коллег QDAC3

uses qaes, NetEncoding;

procedure TForm1.InitEncrypt(var AES: TQAES);
var
  AKeyType: TQAESKeyType;
const
  AInitVector: TQAESBuffer = (49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 65, 66, 67, 68, 69, 70); // 1234567890ABCDEF
begin
  AKeyType := kt128;
  AES.AsCBC(AInitVector, 'HJORNYCZJXJBUGOA', AKeyType);
end;


procedure TForm1.DecryptClick(Sender: TObject);
var
  AES: TQAES;
  ABytes: TBytes;
begin
  InitEncrypt(AES);
  MemoText.Lines.Clear;
  MemoText.Lines.Add(AES.Decrypt(TNetEncoding.Base64.DecodeStringToBytes(MemoQAES.Lines.Text)));
end;

procedure TForm1.EncryptClick(Sender: TObject);
var
  AES: TQAES;
  ABytes: TBytes;
begin
  InitEncrypt(AES);
  AES.Encrypt(Trim(MemoText.Lines.Text), ABytes);

  MemoQAES.Lines.Clear;
  MemoQAES.Lines.Add(TNetEncoding.Base64.EncodeBytesToString(ABytes));
end;

проверка в GoLang и PHP работает, главное использовать вектор один 

 

Ссылка на комментарий
  • 0

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

function IntEncode(S, pwd: String): String;
var
  i, iimax: integer;
  SS, SSS, Sln : String;
begin

  pwd:=System.Hash.THashMD5.GetHashString(pwd);
  SS:=''; iimax:= Length(pwd);
 {$IFDEF ANDROID}
  for i:= 0 to Length(S)-1 do begin
 {$ELSE}
  for i:= 1 to Length(S) do begin
 {$ENDIF}
    SS:=SS + Chr(Ord(S[i]) Xor Ord(pwd[i Mod iimax]));
  end;
  result:= TNetEncoding.Base64.Encode(SS);
end;

 

Изменено пользователем IgorK11
Ссылка на комментарий
  • 0
30 минут назад, IgorK11 сказал:

{$IFDEF ANDROID} for i:= 0 to Length(S)-1 do begin {$ELSE} for i:= 1 to Length(S) do begin {$ENDIF}

1. for i:= low(s) to high(S) do
2. не шифруй строку - шифруй байты B:=TEncoding.Default.GetBytes(S);
$0030 (0) XOR $D0AF (Я) = $D09f - это блин шифрация половина текста плаинтекстом? у тебя хэш из латиницы с нулями в hi байте... 0 xor i = i
русский текст есть в D0 и D1 диапазонах - так что HashString фикция

делай на TBytes там нолей рандом

 

 

Ссылка на комментарий
  • 0

Так?

 

function IntEncode(S, pwd: String): String;
var
  i, iimax: integer;
  B, BPwd: TBytes;
begin
  B:= TEncoding.Default.GetBytes(S);
  BPwd:= TEncoding.Default.GetBytes(System.Hash.THashMD5.GetHashString(pwd));
  iimax:= High(BPwd);
  for i:= Low(B) to High(B) do begin
    B[i]:= B[i] Xor BPwd[i Mod iimax];
  end;
  result:= TNetEncoding.Base64.EncodeBytesToString(B);
end;

Чайниковский вопрос, как проще добавить в начало TBytes другой TBytes?

Изменено пользователем IgorK11
Ссылка на комментарий
  • 0
function IntEncode(const S, pwd: String): String;
var
  i, iimax: integer;
  B, BPwd: TBytes;
begin
  B:= TEncoding.Default.GetBytes(S);
  BPwd:= System.Hash.THashMD5.GetHashBytes(pwd);
  iimax:= High(BPwd);
  for i:= Low(B) to High(B) do
    B[i]:= B[i] Xor BPwd[i Mod iimax];
  result:= TNetEncoding.Base64.EncodeBytesToString(B);
end;

TBytes "магический" тип как строка: работает + 

Изменено пользователем Slym
Ссылка на комментарий
  • 0

Про подводные камни разных кодировок в TEncoding.Default на win/android забыли. Код выше не будет работать если закодировать на одной ос и раскодировать на другой, немного подправил, еще есть расхождение кода символа перевода строки и соответственно разной длины передаваемого результата кодирования с разных OS, но пока проблем в тестировании не возникало:

function IntEncode2(S, pwd: String): String;
var
  i, iimax: integer;
  B, BPwd, Bls: TBytes;
begin
  {$IF NOT defined(MSWINDOWS)}
    S:= Utf8ToAnsi(S);
  {$ENDIF}
  B:= TEncoding.ANSI.GetBytes(S);
  BPwd:= TEncoding.ANSI.GetBytes(pwd);
  iimax:= High(BPwd);
  for i:= Low(B) to High(B) do begin
    B[i]:= B[i] Xor BPwd[i Mod iimax];
  end;
  result:= TNetEncoding.Base64.EncodeBytesToString(B);
end;

pwd передается уже в md5

При декодировании использую result:= TEncoding.ANSI.GetString(B);

 

 

Изменено пользователем IgorK11
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...