@NickNameNew

Как расшифровать данные полученные от GooglePay google_data?

Нашел документацию от гугла, но есть платный контент https://developers.google.com/pay/api/android/guid...
Как расшифровать токен способа оплаты
Выполните следующие действия:

С помощью закрытого ключа и ephemeralPublicKey сформируйте 512-битный общий ключ, применив схему шифрования ECIES-KEM. Укажите следующие параметры:
эллиптическая кривая – NIST P-256 (prime256v1 в OpenSSL);
значения CheckMode, OldCofactorMode, SingleHashMode и CofactorMode равны 0;
функция кодировки – несжатый формат;
функция формирования ключа – HKDF с SHA256; она подробно описана в документе RFC 5869. Учтите следующее:
предоставлять соль не нужно (согласно стандарту RFC, массив данных должен быть эквивалентен соли на 32 нулевых байта).
Разделите сгенерированный ключ на два 256-битных ключа: symmetricEncryptionKey и macKey.
Убедитесь, что поле tag содержит допустимое значение MAC для encryptedMessage.

Чтобы сгенерировать MAC, используйте алгоритм HMAC (RFC 5869) с хеш-функцией SHA256, а также ключ macKey, полученный на этапе 2.

Примечание. Используйте алгоритмы сравнения массивов с постоянным временем работы, чтобы избежать атак по времени.
Расшифруйте encryptedMessage, используя алгоритм AES-256-CTR с учетом следующего:

нулевое значение IV;
нет заполнения;
ключ symmetricEncryptionKey, сформированный в шаге 2.


Читал что использую библиотеку tink от гугла, но не нашел примера с расшифровакой google_data

Может кто то сталкивался с такой проблемой, как расшифровать google_data от GooglePay ?
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
@NickNameNew Автор вопроса
Нашел пример https://github.com/google/tink/blob/master/docs/PY...
Hybrid Encryption
import tink
from tink import hybrid

plaintext = b'your data...'
context = b'context'

# Register all Hybrid primitives
hybrid.register()

# 1. Generate the private key material.
private_keyset_handle = tink.new_keyset_handle(hybrid.hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)

# Obtain the public key material.
public_keyset_handle = private_keyset_handle.public_keyset_handle()

# Encryption

# 2. Get the primitive.
hybrid_encrypt = public_keyset_handle.primitive(hybrid.HybridEncrypt)

# 3. Use the primitive.
ciphertext = hybrid_encrypt.encrypt(plaintext, context)

# Decryption

# 2. Get the primitive.
hybrid_decrypt = private_keyset_handle.primitive(hybrid.HybridDecrypt)

# 3. Use the primitive.
plaintext = hybrid_decrypt.decrypt(ciphertext, context)

Но не понял как сюда нужно подставлять приватный и публичный ключ и зачем тут context, в plaintext вроде бы нужно подставить зашыфрованые данные с переменой encryptedMessage
{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы