brunnengi Опубликовано 7 октября, 2016 Поделиться Опубликовано 7 октября, 2016 Здравствуйте. Есть ли ку кого рабочие примеры с шифрованием, что бы под андроидом работало? RSA, AES и т.д. Цитата Ссылка на комментарий
0 Модераторы Andrey Efimov Опубликовано 26 ноября, 2016 Модераторы Поделиться Опубликовано 26 ноября, 2016 В 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. Тему перенёс в подходящий раздел Равиль Зарипов (ZuBy) и Gingercat 2 Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 26 ноября, 2016 Поделиться Опубликовано 26 ноября, 2016 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 Модераторы Andrey Efimov Опубликовано 26 ноября, 2016 Модераторы Поделиться Опубликовано 26 ноября, 2016 4 минуты назад, sviat9440 сказал: Смогут ли эти данные быть расшифрованными в php? Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https (Post методом) он передавался открыто (тут уж как заказчик сказал, так и делаем). Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 26 ноября, 2016 Поделиться Опубликовано 26 ноября, 2016 Только что, Andrey Efimov сказал: Не знаю, не пробовал. Была задача: хранить на устройстве в зашифрованном виде пароль, а потом при обращении к сайту по https он передавался открыто (тут уж как заказчик сказал, так и делаем). Ясно. Просто у меня не получилось расшифровать. Может что-то неправильно делал... Цитата Ссылка на комментарий
0 Дмитрий Ш. Опубликовано 13 сентября, 2017 Поделиться Опубликовано 13 сентября, 2017 Удалось зашифровать и дешифровать текст в трех ЯП 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 не нашел. Ingalime и Rusland 2 Цитата Ссылка на комментарий
0 Дмитрий Ш. Опубликовано 22 сентября, 2017 Поделиться Опубликовано 22 сентября, 2017 в дополнение преидущего поста, нашел бесплатное решение для 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 работает, главное использовать вектор один Ingalime 1 Цитата Ссылка на комментарий
0 IgorK11 Опубликовано 20 февраля, 2020 Поделиться Опубликовано 20 февраля, 2020 (изменено) Хочу использовать свой алгоритм в приложении, какие могут быть подводные камни потом в работе? Пакеты потом будут по 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; Изменено 20 февраля, 2020 пользователем IgorK11 Цитата Ссылка на комментарий
0 Slym Опубликовано 20 февраля, 2020 Поделиться Опубликовано 20 февраля, 2020 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 IgorK11 Опубликовано 20 февраля, 2020 Поделиться Опубликовано 20 февраля, 2020 (изменено) Так? 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? Изменено 20 февраля, 2020 пользователем IgorK11 Цитата Ссылка на комментарий
0 Slym Опубликовано 20 февраля, 2020 Поделиться Опубликовано 20 февраля, 2020 (изменено) 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 "магический" тип как строка: работает + Изменено 20 февраля, 2020 пользователем Slym Цитата Ссылка на комментарий
0 IgorK11 Опубликовано 22 февраля, 2020 Поделиться Опубликовано 22 февраля, 2020 (изменено) Про подводные камни разных кодировок в 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); Изменено 22 февраля, 2020 пользователем IgorK11 Цитата Ссылка на комментарий
Вопрос
brunnengi
Здравствуйте.
Есть ли ку кого рабочие примеры с шифрованием, что бы под андроидом работало? RSA, AES и т.д.
Ссылка на комментарий
11 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.