Шифрование aes-256-gcm - надо разжевать и написать шаблон пример

melutsk

Client
Регистрация
03.08.2016
Сообщения
1 347
Благодарностей
1 257
Баллы
113
Есть данные, они шифруются через код

C#:
   public static function encryptPassword(
        $password,
        $publicKeyId,
        $publicKey)
    {
        $key = openssl_random_pseudo_bytes(32);
        $iv = openssl_random_pseudo_bytes(12);
        $time = time();

        openssl_public_encrypt($key ,$encryptedAesKey, base64_decode($publicKey));
        $encrypted = openssl_encrypt($password, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, strval($time));

        $payload = base64_encode("\x01" | pack('n', intval($publicKeyId)) . $iv . pack('s', strlen($encryptedAesKey)) . $encryptedAesKey . $tag . $encrypted);

        return sprintf('#PWD_INSTAGRAM:4:%s:%s', $time, $payload);
    }
Есть default public key (ID: 41):

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvcu1KMDR1vzuBr9iYKW8
KWmhT8CVUBRkchiO8861H7zIOYRwkQrkeHA+0mkBo3Ly1PiLXDkbKQZyeqZbspke
4e7WgFNwT23jHfRMV/cNPxjPEy4kxNEbzLET6GlWepGdXFhzHfnS1PinGQzj0ZOU
ZM3pQjgGRL9fAf8brt1ewhQ5XtpvKFdPyQq5BkeFEDKoInDsC/yKDWRAx2twgPFr
CYUzAB8/yXuL30ErTHT79bt3yTnv1fRtE19tROIlBuqruwSBk9gGq/LuvSECgsl5
z4VcpHXhgZt6MhrAj6y9vAAxO2RVrt0Mq4OY4HgyYz9Wlr1vAxXXGAAYIvrhAYLP
7QIDAQAB
-----END PUBLIC KEY-----


Public Key returned on API responses (ID: 205):

const IG_LOGIN_ANDROID_PUBLIC_KEY= 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1enRZOEZvUlRGRU9mK1RkTGlUdAplN3FIQXY1cmdBMmk5RkQ0YjgzZk1GK3hheW14b0xSdU5KTitRanJ3dnBuSm1LQ0QxNGd3K2w3TGQ0RHkvRHVFCkRiZlpKcmRRWkJIT3drS3RqdDdkNWlhZFdOSjdLczlBM0NNbzB5UktyZFBGU1dsS21lQVJsTlFrVXF0YkNmTzcKT2phY3ZYV2dJcGlqTkdJRVk4UkdzRWJWZmdxSmsrZzhuQWZiT0xjNmEwbTMxckJWZUJ6Z0hkYWExeFNKOGJHcQplbG4zbWh4WDU2cmpTOG5LZGk4MzRZSlNaV3VxUHZmWWUrbEV6Nk5laU1FMEo3dE80eWxmeWlPQ05ycnF3SnJnCjBXWTFEeDd4MHlZajdrN1NkUWVLVUVaZ3FjNUFuVitjNUQ2SjJTSTlGMnNoZWxGNWVvZjJOYkl2TmFNakpSRDgKb1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==';



Формат



Sample (Hex representation):

01 **(ID: 0x01)**
cd **(Pub. ID: 205)**
3d5c3a5c044d5c07f94ea2f5 **(IV)**
0001 **(256 RSA length little endian)**
47e81a1588e7d650b512d56e992ef5b1ce24050d64eb33626cdb695edb595c2b73f0205683ef9f84a6ebceb6e5f2384bd094caa47b3d8912bda5ddb03f7c2668501414639edc3fd9e47ddd6ab1cead3900699c7625dc35a6e85b696d9a4585a142fc7d99df6cdb685d555567a9fb69816996e776509f80ff360556c4d2b2819bbdd048ca3b6d30a70d40db28b40a3de6903ebfdf6adfd3d1674ba0dc1ec6adf39ac95fadece4e88a7b6ac598e8c58b639aa75ae27ee406caee1155bbc817e7014d24f69592715b63257124a067a326d0db7794540543c95492255438c280b6768662983983b5e82e67bc5371de391ce00c2e8c864e97a9aa9612acf977a19abd **RSA Enc. Key**
f7364edeba87bc2e3dd73c31f51e9898 **AES GCM TAG**
b92c412352e9d519bc2733 **Enc. PW**



Надо все это обернуть в шарп код. Цену и контакты в личку.
 
Регистрация
27.09.2019
Сообщения
69
Благодарностей
44
Баллы
18
Хоть тема и не новая, вдруг кому будет полезно.

Данная схема шифрования используется при авторизации аккаунтов инстаграм с использованием апи приложения для андроид.

Как видно из кода php, на входе у нас есть пароль, идентификатор публичного ключа и сам ключ. (отдаются сервером)
Далее создаются два массива с рандомным набором байт, которые будут являться: ключом шифрования (32 байта) для шифра AES-GCM и вектором инициализации (12 байт) - iv или nonce. В данном случае, iv передается серверу в открытом виде, т.к. он уникален при каждой операции шифрования, а сам ключ, хоть он и тоже уникален, но чтобы не скомпрометировать пароль - шифруется с помощью алгоритма rsa и полученного открытого ключа. На стороне сервера имеется секретный ключ, с помощью которого производится операция расшифровки.

Остается сгенерировать шифр для нашего пароля, а в качестве дополнительных данных аутентификации используется строка time - unixtime в секундах, которая также передается в открытом виде серверу. Данный шифр обновляется внесением скрытого сообщения (в этом случае - пароля для учетной записи инстаграм) и делится на две части: массив байт длиной равной длине пароля и AES GCM TAG - равный 16 байтам.

Все байты укладываются в последовательность, которая указана в первом посте и кодируются в строку base64.

В шарпе стандартные механизмы по работе с AES-GCM шифрованием достуны для .NET 5.0 и .NET Core 3.0 и 3.1, что, как я понимаю не подходит для ZennoPoster. Но с этой задачей также прекрасно справляется библиотека BounceCastle, которую можно использовать для этих целей. RSA алгоритм можно использовать как из коробки, так и из указанной выше библиотеки.

Но при авторизации через браузер используется немного иная схема шифрования (в частности шифрование ключа AES-GCM) и другая последовательность байт, так что данный способ не подойдет.
 
  • Спасибо
Реакции: Metrix и RoyalBank

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)