Автор Тема: [Криптография] Функции шифрования AES128, AES192, AES256 (CBC) совместимые с PHP OpenSSL  (Прочитано 3916 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Категория: Кодирование, Шифрование, Microsoft Cryptographic Service Provider, OpenSSL, openssl_encrypt, openssl_decrypt, php, AES, Rijndael

Описание:
Библиотека предназначена для шифрования текста  симметричным алгоритмом блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит) с использованием пользовательского пароля.
Функции используют для шифрования Microsoft Cryptographic Service Provider в AutoIt и стандартную библиотеку OpenSSL в PHP.

Особенности:
  • Библиотека не имеет внешних зависимостей.
  • Работает с текстом в кодировке UTF-8
  • Шифрованные данные преобразовывает в формат Base64 для удобной передачи по сети
  • Использует Microsoft API для шифрования/дешифрирование
  • Ключ формируется на основе пользовательского пароля и алгоритма SHA256
  • В отличии от _Crypt_DecryptData использует начальный вектор инициализации (Initialization vector (IV))

Функции:
Код: AutoIt [Выделить]

;Функция шифрования (Данные, пароль, алгоритм)
_CryptPhp_EncryptString($sData, $sCode[, $sAlgo = 'AES-192-CBC'])
;Функция дешифрирования (Данные, пароль, алгоритм)
_CryptPhp_DecryptString($sData, $sCode[, $sAlgo = 'AES-192-CBC'])



Пример:
Код: AutoIt [Выделить]
#include "CryptPhp.au3"
Local $sData = 'A pointer to a DWORD value that indicates the length of the pbData buffer.'
Local $sCode = '123_MyPassword!'

Local $sEncrypted = _CryptPhp_EncryptString($sData, $sCode)
ConsoleWrite(@error & ' ' & @extended & ' ' & $sEncrypted & @CRLF)

Local $sDecrypted = _CryptPhp_DecryptString($sEncrypted, $sCode)
ConsoleWrite(@error & ' ' & @extended & ' ' & $sDecrypted & @CRLF)


PHP класс:
Код: (php) [Выделить]
  1. class CryptPhp
  2. {
  3.     private $cipherAlgorithm;
  4.     private $hashAlgorithm;
  5.     private $iv_num_bytes;
  6.  
  7.     public function __construct($cipherAlgorithm = 'AES-192-CBC')
  8.     {
  9.         $this->cipherAlgorithm = $cipherAlgorithm;
  10.         $this->hashAlgorithm = 'SHA256';
  11.         $this->iv_num_bytes = openssl_cipher_iv_length($cipherAlgorithm);
  12.  
  13.         if ( ! in_array($cipherAlgorithm, openssl_get_cipher_methods(true))) {
  14.             throw new \Exception("CryptPhp:: - unknown cipher algo {$cipherAlgorithm}");
  15.         }
  16.  
  17.         if ( ! in_array($this->hashAlgorithm, openssl_get_md_methods(true))) {
  18.             throw new \Exception("CryptPhp:: - unknown hash algo {$this->hashAlgorithm}");
  19.         }
  20.     }
  21.  
  22.     public function encryptString($in, $key)
  23.     {
  24.         $iv = mcrypt_create_iv($this->iv_num_bytes, MCRYPT_DEV_URANDOM);
  25.         $hash = openssl_digest($key, $this->hashAlgorithm, true);
  26.         $encrypted = openssl_encrypt($in, $this->cipherAlgorithm, $hash, OPENSSL_RAW_DATA, $iv);
  27.         if ($encrypted === false) {
  28.             throw new \Exception('CryptPhp::encryptString - Encryption failed: ' . openssl_error_string());
  29.         }
  30.         return base64_encode($iv . $encrypted);
  31.     }
  32.  
  33.     public function decryptString($in, $key)
  34.     {
  35.         $raw = base64_decode($in);
  36.         if (strlen($raw) < $this->iv_num_bytes) {
  37.             throw new \Exception('CryptPhp::decryptString - ' .
  38.                 'data length ' . strlen($raw) . " is less than iv length {$this->iv_num_bytes}");
  39.         }
  40.         $iv = substr($raw, 0, $this->iv_num_bytes);
  41.         $raw = substr($raw, $this->iv_num_bytes);
  42.         $hash = openssl_digest($key, $this->hashAlgorithm, true);
  43.         $res = openssl_decrypt($raw, $this->cipherAlgorithm, $hash, OPENSSL_RAW_DATA, $iv);
  44.         if ($res === false) {
  45.             throw new \Exception('CryptPhp::decryptString - decryption failed: ' . openssl_error_string());
  46.         }
  47.         return $res;
  48.     }
  49. }

PHP пример:
Код: (php) [Выделить]
  1. $data = 'A pointer to a DWORD value that indicates the length of the pbData buffer.';
  2. $code = '123_MyPassword!';
  3.  
  4. $crypt = new CryptPhp();
  5. $encrypted = $crypt->encryptString($data, $code);
  6. $decrypted = $crypt->decryptString($encrypted, $code);
  7.  
  8. echo "encrypted => $encrypted\n";
  9. echo "decrypted => $decrypted\n";

Примечание: Для Windows XP вместо SHA256 используйте SHA1

Файл: Скачать CryptPhp.au3

Источник: autoit-script.ru
Автор(ы): inververs

Русское сообщество AutoIt


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
inververs
1. Я так понимаю, PHP код для примера совместимости?
2. Почему CryptPhp? Как  следствие, вытекающие из пункта 1?

Скорблю и помню.




Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Garrett
Да, тут php для того, что бы показать, как это делать именно на php, что бы полученный результат был совместим.
Я показал необходимый минимум для этих функций, где используется вектор инициализации, хэширование ключа, пароль и сам текст.
Результат я отдаю как iv + данные и кодирую в base64, т.к везде(в любом языке) должны быть функции для работы с ним.

Хочу отметить, что подходы к шифрованию текста могут отличаться. Например, в результат может быть подмешена соль, или ключ может быть сформирован по другим алгоритмам, поэтому нужно обращать внимание на используемый подход в вашем фреймворке или библиотеке.
« Последнее редактирование: Февраль 11, 2017, 17:40:41 от Garrett »

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1444
  • Репутация: 216
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
Спасибо, возьму в копилку.
(нажмите для показа/скрытия)

Русское сообщество AutoIt


Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Alofa
Вы можете в код дописать так:
Код: AutoIt [Выделить]
    Switch $sAlgo
        Case 'AES-128-CBC', 0x0000660e
            $iAlg = 0x0000660e ;$CALG_AES_128
...
 

и тогда алгоритм можно будет передать константой

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2815
  • Репутация: 474
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
inververs:ok:
(нажмите для показа/скрытия)
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
joiner
(нажмите для показа/скрытия)

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
inververs
(нажмите для показа/скрытия)

Русское сообщество AutoIt


Оффлайн Vanguger [?]

  • Новичок
  • *
  • Сообщений: 36
  • Репутация: 0
  • Пол: Мужской
    • Webarion
    • Награды
  • Версия AutoIt: 3.3.14.0
У меня указанный код почему-то не расшифровывает. Выдаёт:

0 0 J5kT/MPbHFvqCGEzJrm2EVt73JFGlkHaol7M3symEpdYhggHAnlUhNIqptmnVjt47FyeO7bk6SvuP9l1xpvomBXB1XPLAf3fN5sJhRrZbA1t+RO9s5fyLz+0b5Wjg7Jc
9 0 False

В библиотеке это следующие строки:
Код: AutoIt [Выделить]
        ;Determinate buffer size
        $aRet = DllCall($hAdvapi32, "bool", "CryptDecrypt", "handle", $hKey, "handle", 0, "bool", True, "dword", 0, _
            "struct*", Null, "dword*", BinaryLen($bEncrypted))
        If @error Or Not $aRet[0] Then ExitLoop SetError(9, @error, 1)


Подскажите пожалуйста с чем это связано, как исправить?

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135

  • Автор темы
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0

Вот этот код можете комментировать
Код: AutoIt [Выделить]
        ;Determinate buffer size
;~      $aRet = DllCa1ll($hAdvapi32, "bool", "CryptDecrypt", "handle", $hKey, "handle", 0, "bool", True, "dword", 0, _
;~          "struct*", Null, "dword*", BinaryLen($bEncrypted))
;~      If @error Or Not $aRet[0] Then ExitLoop SetError(9, @error, 1)

А чуть ниже поменяйте так:
Код: AutoIt [Выделить]
       
        ;Create buffer
        Local $hBuffCipherText = DllStructCreate('byte[' & BinaryLen($bEncrypted) & ']')
        DllStructSetData($hBuffCipherText, 1, $bEncrypted)

        ;Decrypt
        $aRet = DllCall($hAdvapi32, "bool", "CryptDecrypt", "handle", $hKey, "handle", 0, "bool", True, "dword", 0, _
            "struct*", $hBuffCipherText, "dword*", DllStructGetSize($hBuffCipherText))
        If @error Or Not $aRet[0] Then ExitLoop SetError(10, @error, 1)

 

Так должно заработать
« Последнее редактирование: Июль 26, 2017, 21:06:45 от inververs »

Оффлайн Vanguger [?]

  • Новичок
  • *
  • Сообщений: 36
  • Репутация: 0
  • Пол: Мужской
    • Webarion
    • Награды
  • Версия AutoIt: 3.3.14.0
Появляется msgbox с заголовком 87 и текстом 80 Параметр задан неверно. У меня Win7.


Добавлено: Июль 26, 2017, 21:41:27
Вот этот код можете комментировать
Код: AutoIt [Выделить]
        ;Determinate buffer size
;~      $aRet = DllCa1ll($hAdvapi32, "bool", "CryptDecrypt", "handle", $hKey, "handle", 0, "bool", True, "dword", 0, _
;~          "struct*", Null, "dword*", BinaryLen($bEncrypted))
;~      If @error Or Not $aRet[0] Then ExitLoop SetError(9, @error, 1)

А чуть ниже поменяйте так:
Код: AutoIt [Выделить]
       
        ;Create buffer
        Local $hBuffCipherText = DllStructCreate('byte[' & BinaryLen($bEncrypted) & ']')
        DllStructSetData($hBuffCipherText, 1, $bEncrypted)

        ;Decrypt
        $aRet = DllCall($hAdvapi32, "bool", "CryptDecrypt", "handle", $hKey, "handle", 0, "bool", True, "dword", 0, _
            "struct*", $hBuffCipherText, "dword*", DllStructGetSize($hBuffCipherText))
        If @error Or Not $aRet[0] Then ExitLoop SetError(10, @error, 1)

 

Так должно заработать

Да, так заработало! Благодарю Вас!
В чём же тут была причина, можете рассказать?
« Последнее редактирование: Июль 26, 2017, 21:41:27 от Vanguger, Причина: Объединение сообщений »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
8534 Просмотров
Последний ответ Июль 12, 2012, 23:54:46
от Afonichev
6 Ответов
4173 Просмотров
Последний ответ Июль 25, 2012, 23:36:49
от inververs
5 Ответов
2686 Просмотров
Последний ответ Декабрь 31, 2012, 15:10:09
от Medic84
33 Ответов
13414 Просмотров
Последний ответ Март 27, 2015, 20:17:48
от Yashied
2 Ответов
2237 Просмотров
Последний ответ Ноябрь 24, 2013, 15:10:57
от MnM
1 Ответов
1555 Просмотров
Последний ответ Октябрь 16, 2013, 22:02:34
от Garrett
0 Ответов
1057 Просмотров
Последний ответ Октябрь 16, 2013, 21:27:39
от madmasles
0 Ответов
1099 Просмотров
Последний ответ Январь 21, 2014, 12:12:05
от RUVATA
0 Ответов
914 Просмотров
Последний ответ Декабрь 20, 2014, 22:42:19
от ahjkcfout7
4 Ответов
1442 Просмотров
Последний ответ Декабрь 02, 2015, 16:07:10
от Sln