Как зашифровать большой файл с помощью RSA?

Код https://play.golang.org/p/CUEqjsJq5c

Ошибка:

panic: crypto/rsa: message too long for RSA public key size

goroutine 1 [running]:
panic(0x4a6d80, 0xc420010420)
    /usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
    /tmp/sample.go:28 +0xfa

Размер файла 811 байт (для тестового шифрования собственного исходного файла). Я хочу зашифровать файлы побольше, 1..500 мб. Могу ли я сделать это с помощью RSA или нужно использовать другие методы?


person Андрей Антонов    schedule 25.10.2016    source источник
comment
RSA не подходит для шифрования больших файлов. Поищи в Гугле. Обычно создается небольшой ключ AES, который можно закодировать с помощью ключа RSA, а затем продолжить шифрование большого файла с помощью ключа AES (симметричное шифрование).   -  person icza    schedule 25.10.2016
comment
Помимо комментария @icza, в пакете golang rsa есть примечание по этому поводу: golang .org / src / crypto / rsa / rsa.go # L335   -  person Momer    schedule 25.10.2016
comment
Но в RSA нет необходимости шифровать симметричный ключ, если не требуется пара открытого / закрытого ключей. Что такое случай iuse для пары открытый / закрытый ключ   -  person zaph    schedule 25.10.2016


Ответы (2)


RSA может шифровать только данные, длина которых меньше (или равна) длине ключа.

Ответ заключается в том, чтобы зашифровать данные с помощью симметричного алгоритма, такого как AES, который предназначен для шифрования больших и малых данных.

Если требуется пара открытого / закрытого ключей RSA, зашифруйте симметричный (AES) ключ с помощью RSA. Это называется гибридным шифрованием, и, по сути, это то, как HTTPS шифрует данные.

Но, возможно, в RSA нет необходимости шифровать симметричный ключ, если не требуется пара открытого / закрытого ключей. В общем случае используется только симметричный (AES) и этот ключ. Каков вариант использования пары открытый / закрытый ключ?

person zaph    schedule 25.10.2016

Если вы не хотите разбивать файл на части, один из подходов заключается в создании случайного симметричного ключа R в эфире, шифровании большого файла случайным симметричным ключом EF=Sym(F, R) и отправке зашифрованного файла EF с симметричным ключом, зашифрованным вашим асимметричным публичным RSA. ключ Pub(R).

Шифрование:

+---------------------+      +--------------------+
|                     |      |                    |
| generate random key |      |   the large file   |
|        (R)          |      |        (F)         |
|                     |      |                    |
+--------+--------+---+      +----------+---------+
         |        |                     |
         |        +------------------+  |
         |                           |  |
         v                           v  v
+--------+------------+     +--------+--+------------+
|                     |     |                        |
| encrypt (R) with    |     | encrypt (F)            |
| your RSA public key |     | with symmetric key (R) |
|                     |     |                        |
|  ASym(PublicKey, R) |     |     EF = Sym(F, R)     |
|                     |     |                        |
+----------+----------+     +------------+-----------+
           |                             |
           +------------+ +--------------+
                        | |
                        v v
         +--------------+-+---------------+
         |                                |
         |   send this files to the peer  |
         |                                |
         |     ASym(PublicKey, R) + EF    |
         |                                |
         +--------------------------------+

Расшифровка:

   +----------------+        +--------------------+
   |                |        |                    |
   | EF = Sym(F, R) |        | ASym(PublicKey, R) |
   |                |        |                    |
   +-----+----------+        +---------+----------+
         |                             |
         |                             |
         |                             v
         |   +-------------------------+-----------------+
         |   |                                           |
         |   |             restore key (R)               |
         |   |                                           |
         |   | R <= ASym(PrivateKey, ASym(PublicKey, R)) |
         |   |                                           |
         |   +---------------------+---------------------+
         |                         |
         v                         v
     +---+-------------------------+---+
     |                                 |
     |       restore the file (F)      |
     |                                 |
     |      F <= Sym(Sym(F, R), R)     |
     |                                 |
     +---------------------------------+
person Mohsenasm    schedule 23.02.2020