Расшифровка AES GCM 256 с помощью pgcrypto (PostgreSQL)

#postgresql #encryption #aes-gcm #pgcrypto

#postgresql #шифрование #aes-gcm #pgcrypto

Вопрос:

Я пытаюсь расшифровать сообщение с помощью pgcrypto, которое зашифровано с помощью AES GCM 256.

Технические характеристики шифрования:

 Encryption algorithm     AES
Key                      [secret of listener] (64-character-long hexadecimal string in configuration)
Key length               256 bits (32 bytes)
Block mode               GCM
Padding                  None
Initialization vector    In HTTP header (X-Initialization-Vector)
Authentication tag       In HTTP header (X-Authentication-Tag)
 

Итак, я получаю:

  • Тело
  • Клавиша
  • iv_header
  • auth_tag

Я попробовал следующее

 with base as (
select
    'F8E2F759E528CB69375E51DB2AF9B53734E393' as body,
    '000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F' as key,
    '3D575574536D450F71AC76D8' as iv_header,
    '19FDD068C6F383C173D3A906F7BD1D83' as auth_tag
),
out as (
    select
        decrypt_iv(
            convert_to(concat(decode(body,'hex'),decode(auth_tag,'hex')),'LATIN1'),
            decode(key, 'hex'),
            decode(iv_header, 'hex'),
            'aes/pad:none'
        )
    from base
)

select * from out
 

Я продолжаю получать сообщение об ошибке decrypt_iv error: Data not a multiple of block size , в то время как я ожидал бы получить закодированное сообщение {"type": "PAYMENT"}

Я ожидаю, что что-то пойдет не так при декодировании и объединении body и auth_tag , но не могу понять, что.

Несколько заметок о том, что / почему я это сделал

  • Я auth_tag body связываю это с тем, как несколько источников описывают это именно так.
  • Я использую convert_to функцию, поскольку это кажется единственным способом объединения двух bytea значений

Мне удается расшифровать это сообщение на других языках (например, Snowflake или Python)

Если кто-нибудь видит, что я делаю неправильно, или имеет какие-то указания, это высоко ценится.

Комментарии:

1. Не могли бы вы показать код, который делает это на python?

2. Привет @jjanes, образец для разных языков можно найти здесь peachpayments.docs.oppwa.com/tutorials/webhooks /… Мне кажется, что пример Scala может быть полезен, поскольку он также добавляет auth_tag к зашифрованному телу. Надеюсь, это прояснит ситуацию.

Ответ №1:

pgcrypto говорит, что поддерживает только cbc и ecb. Я не криптограф, но я не думаю, что любой из них — это то же самое, что и GCM. Поэтому я не думаю, что вы можете сделать это с помощью pgcrypto. Я не знаю, почему это приводит к точной ошибке, которую вы получаете, но это также меня не удивляет.

Если бы мне действительно нужно было сделать это внутри базы данных, я думаю, я сделал бы это, написав функцию с помощью pl/python3u .

Комментарии:

1. Спасибо @jjanes, это имеет смысл, я надеялся, что GCM будет вариантом CBC / EBC. Я думаю, мы просто сделаем расшифровку вне базы данных. Спасибо, Крис