age

Filippo Valsorda, проект age · лицензия BSD-3-Clause

Шифрует файлы с ключами, договоры и выгрузки клиентов перед отправкой или копией в облако. Файл, зашифрованный по открытым ключам, открывает секретный ключ любого из получателей.

macOS · Linux · WindowsНа компьютере, на сервере и в контейнереБесплатно, BSD-3-Clause

✓ Проверено 17.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: age v1.3.2 из готового архива выпуска на GitHub, сумма sha256 сверена с выпуском. Что именно проверяли

Установить агентом ↓

Какую задачу решает

Консольная программа для шифрования файлов. Агент создаёт пару ключей, шифрует файл или папку для одного или нескольких получателей по их открытым ключам и расшифровывает своим секретным ключом. Файлов настроек у age нет.

  • Шифрует файл для одного или нескольких получателей по открытым ключам вида age1.... В прогоне договор зашифровали для двоих, и его открыли оба ключа. Посторонний ключ получил отказ с кодом 1.
  • Шифрует папку проекта целиком вместе с tar: tar czf - -C /work proekt | age -R keys/recipients.txt > out/proekt.tar.gz.age. В прогоне все три файла папки после расшифровки совпали с исходными по sha256.
  • С ключом -a делает текстовый вид между строками BEGIN AGE ENCRYPTED FILE и END AGE ENCRYPTED FILE. Такой файл состоит из букв ASCII и годится для письма, а age -d сама распознаёт этот вид при расшифровке.
  • Принимает открытый ключ SSH ed25519 как ключ получателя и расшифровывает парным секретным ключом SSH. В прогоне файл .env прошёл этот путь туда и обратно без расхождений.
  • Команда age-inspect без расшифровки показывает, для каких типов ключей зашифрован файл и из чего складывается его размер, а с --json выдаёт то же в JSON.

Пример результата

Говоришь агенту

Зашифруй договор proekt/docs/dogovor.pdf для меня и коллеги. Мой открытый ключ лежит в keys/my.pub, его ключ - в keys/colleague.pub. Потом проверь, что открыть договор могут оба.

Что получится

Мы прогнали этот сценарий на тестовом файле в 2 000 000 байт. Агент собрал оба открытых ключа в keys/recipients.txt, и age -R keys/recipients.txt -o out/dogovor.pdf.age proekt/docs/dogovor.pdf создала файл на 2 000 778 байт. age-inspect показала двух получателей X25519. Договор расшифровали своим ключом и ключом коллеги, суммы sha256 обеих копий совпали с исходным файлом. Посторонний ключ age не приняла: ответ no identity matched any of the recipients, код 1.

Паспорт

Кто делает
Filippo Valsorda, проект age
Исходный код
github.com/FiloSottile/age
Лицензия
BSD-3-Clause
Версия
v1.3.2 на 17.10.2026
Системы
macOS · Linux · Windows
Где работает
На компьютере, на сервере и в контейнере
Цена
Бесплатно
Проверка
Проверено 17.10

Установить агентом

Для Claude Code, Codex, Hermes и любого агента с терминалом
Установи программу «age». Работай по шагам и после каждого коротко говори, что сделал.

Что это за программа (каталог smyslokod.ru, официальные источники сверены 17.10.2026):
- официальный сайт: https://age-encryption.org
- исходный код: https://github.com/FiloSottile/age
- инструкция по установке: https://github.com/FiloSottile/age/blob/v1.3.2/doc/age.1.ronn
- актуальная версия на 17.10.2026: v1.3.2
- лицензия: BSD-3-Clause
- для работы нужно (в отдельных случаях): Homebrew - только для установки через Homebrew на Mac

Правила:
1. Ничего не устанавливай и не меняй, пока я не скажу «да» на твой план.
2. Ставь только способами из этого промпта. Сторонние сборки, скрипты с форумов и из чужих репозиториев не бери.
3. Мои проекты не трогай: не меняй их файлы, виртуальные окружения и списки зависимостей (package.json, requirements.txt, pyproject.toml).
4. Команды с sudo, правку профиля оболочки (~/.zshrc, ~/.bashrc) и переменной PATH делай только после моего отдельного «да» на каждую.
5. Не проси у меня пароли и ключи и не выводи их. Если нужен пароль администратора, дай команду, я выполню её сам.
6. Секретный ключ AGE-SECRET-KEY не выводи в чат и не клади рядом с зашифрованными файлами. Получателю передают только открытый ключ age1....
7. Исходные файлы после шифрования удаляй только после пробной расшифровки и «да» человека.
8. Перед командой с -o проверь, что такого файла нет. Если он есть, спроси человека.
9. Шифрование фразой-паролем человек запускает в терминале сам. Пароль в команду, в переменные окружения и в чат не ставь.
10. Если расшифровка завершилась ошибкой, удали файл вывода и скажи человеку.

Шаги:
0. Определи, где ты работаешь: мой компьютер, сервер или контейнер. Какая система и процессор, какие менеджеры пакетов есть (Homebrew, apt, winget, uv, pipx). Ставить нужно туда, где ты сам запускаешь команды.
   - на компьютере: где лежат файлы, которые нужно зашифровать перед отправкой или копией.
   - на сервере: например, чтобы шифровать выгрузки и копии на сервере открытым ключом. Секретный ключ для расшифровки тогда хранится в другом месте.
   - в контейнере: мы проверяли в контейнере Ubuntu 24.04 от root. Файл age из архива linux-amd64 не требует динамических библиотек: ldd ответил not a dynamic executable. Ключи создаёт отдельная команда age-keygen, для шифрования папки нужен tar.
1. Проверь, не стоит ли программа уже: age --version ; age-keygen --version. Если стоит и запускается, ничего не ставь и переходи к шагу 5.
2. Обязательных зависимостей у программы нет, то, что нужно в отдельных случаях, перечислено выше. Проверь свободное место на диске: нужно Архив выпуска для Linux x86-64 - 19 405 817 байт. Три команды age, age-keygen и age-inspect занимают 15 540 081 байт, вместе с четырьмя плагинами из архива в прогоне вышло 32 672 019 байт. Пакет Ubuntu 24.04 по данным apt занимает 5969 kB. Зашифрованный файл больше исходного на заголовок и служебные байты: в прогоне 2 000 000 байт превратились в 2 000 778..
3. Составь план: каким одним способом из списка ниже будешь ставить, что появится на диске и сколько места займёт, что поменяется в системе и как потом удалить. Покажи план и жди моего «да».
   Способы из официальных источников:
   - macOS, Homebrew: brew install age (Так советует README проекта. На 17.10.2026 формула ставила 1.3.2. Мы не проверяли.)
   - Windows, winget: winget install --id FiloSottile.age (Так советует README проекта. Пакет 1.3.2 берёт архив age-v1.3.2-windows-amd64.zip с GitHub и добавляет команды age, age-keygen, age-inspect и плагин age-plugin-batchpass. Мы не проверяли.)
   - Linux, готовый файл с GitHub: curl -sSfLO https://github.com/FiloSottile/age/releases/download/v1.3.2/age-v1.3.2-linux-amd64.tar.gz && tar xzf age-v1.3.2-linux-amd64.tar.gz && mkdir -p ~/.local/bin && install -m 755 age/age age/age-keygen age/age-inspect ~/.local/bin/ (Сумму архива сверь с контрольной суммой на странице выпуска (на GitHub она подписана Digest): у linux-amd64 это sha256 cbe24006683f8eb669266162894b9a522a1af52f2665fbc63a4bb032ed26ac10. Мы ставили так, сумма совпала. Папка ~/.local/bin должна быть в PATH. В архиве есть ещё плагины age-plugin-pq, age-plugin-tag, age-plugin-tagpq и age-plugin-batchpass, в прогоне мы клали в ~/.local/bin и их.)
   - Linux, apt (пакет Ubuntu): sudo apt-get install age (README проекта даёт apt для Ubuntu 22.04 и новее. В Ubuntu 24.04 это 1.1.1, мы поставили и вывели версию. В пакете нет age-inspect и постквантовых ключей.)
4. Установи по согласованному плану. Если что-то идёт не так, как в плане, остановись и спроси.
5. Проверь результат:
   - age --version: программа запускается без ошибки;
   - Во временной папке создай тестовую папку проекта: файл договора в 2 000 000 байт, выгрузку на 500 строк и файл .env с ненастоящими ключами. Создай два ключа, зашифруй .env для себя, договор для двоих, папку целиком через tar и выгрузку в текстовом виде с -a. Расшифруй всё и сверь суммы sha256 с исходными, проверь, что открытого текста в зашифрованных файлах нет. Проверь чужой ключ, испорченный файл, повтор age-keygen в тот же файл, -p без терминала, постквантовый ключ, ключ SSH и перезапись -o. Делай это во временной папке и не трогай мои файлы.
     mkdir -p /work/dl && cd /work/dl && curl -sSfLO https://github.com/FiloSottile/age/releases/download/v1.3.2/age-v1.3.2-linux-amd64.tar.gz && echo 'cbe24006683f8eb669266162894b9a522a1af52f2665fbc63a4bb032ed26ac10  age-v1.3.2-linux-amd64.tar.gz' | sha256sum -c
     cd /work/dl && tar xzf age-v1.3.2-linux-amd64.tar.gz && mkdir -p ~/.local/bin && install -m 755 age/age age/age-keygen age/age-inspect age/age-plugin-* ~/.local/bin/
     export PATH=$HOME/.local/bin:$PATH && age --version && age-keygen --version && age-inspect --version
     mkdir -p /work/proekt/docs && cd /work/proekt && head -c 2000000 /dev/urandom > docs/dogovor.pdf && python3 -c "import csv,random;random.seed(7);f=open('docs/klienty.csv','w',newline='',encoding='utf-8');w=csv.writer(f);w.writerow(['id','imya','email','summa']);[w.writerow([i,'Клиент '+str(i),'client'+str(i)+'@example.com',random.randint(100,99999)]) for i in range(1,501)];f.close();open('.env','w').write('API_TOKEN=test-token-not-real-123456\nDB_PASSWORD=test-password-not-real\n')"
     cd /work && mkdir -p keys out && age-keygen -o keys/my-key.txt && age-keygen -o keys/colleague-key.txt && age-keygen -y keys/my-key.txt > keys/my.pub && age-keygen -y keys/colleague-key.txt > keys/colleague.pub && cat keys/my.pub keys/colleague.pub > keys/recipients.txt
     cd /work && age -r "$(cat keys/my.pub)" -o out/env.age proekt/.env && age -R keys/recipients.txt -o out/dogovor.pdf.age proekt/docs/dogovor.pdf
     cd /work && tar czf - -C /work proekt | age -R keys/recipients.txt > out/proekt.tar.gz.age && age -a -r "$(cat keys/my.pub)" -o out/klienty.csv.age.txt proekt/docs/klienty.csv
     cd /work && age-inspect out/dogovor.pdf.age && age-inspect --json out/dogovor.pdf.age
     cd /work && mkdir -p dec/tree && age -d -i keys/my-key.txt -o dec/.env out/env.age && age -d -i keys/my-key.txt -o dec/dogovor-my.pdf out/dogovor.pdf.age && age -d -i keys/colleague-key.txt -o dec/dogovor-colleague.pdf out/dogovor.pdf.age && age -d -i keys/my-key.txt -o dec/klienty.csv out/klienty.csv.age.txt
     cd /work && age -d -i keys/colleague-key.txt out/proekt.tar.gz.age | tar xzf - -C dec/tree
     cd /work && sha256sum proekt/.env dec/.env dec/tree/proekt/.env proekt/docs/dogovor.pdf dec/dogovor-my.pdf dec/dogovor-colleague.pdf dec/tree/proekt/docs/dogovor.pdf proekt/docs/klienty.csv dec/klienty.csv dec/tree/proekt/docs/klienty.csv
     cd /work && grep -c -a -e API_TOKEN -e client1@example.com out/env.age out/klienty.csv.age.txt out/proekt.tar.gz.age; head -1 out/klienty.csv.age.txt
     cd /work && age-keygen -o keys/third-key.txt && age -d -i keys/third-key.txt -o dec/wrong.pdf out/dogovor.pdf.age; echo $?
     cd /work && cp out/dogovor.pdf.age /tmp/broken.age && python3 -c "p='/tmp/broken.age';b=bytearray(open(p,'rb').read());b[len(b)//2]^=1;open(p,'wb').write(bytes(b))" && age -d -i keys/my-key.txt -o dec/broken.pdf /tmp/broken.age; echo $?; stat -c %s dec/broken.pdf
     cd /work && sha256sum keys/my-key.txt && age-keygen -o keys/my-key.txt; echo $?; sha256sum keys/my-key.txt
     cd /work && age -p -o /tmp/p.age proekt/.env < /dev/null; echo $?
     cd /work && age-keygen -pq -o keys/pq-key.txt && age-keygen -y keys/pq-key.txt > keys/pq.pub && age -R keys/pq.pub -o out/dogovor-pq.age proekt/docs/dogovor.pdf && age -d -i keys/pq-key.txt out/dogovor-pq.age | cmp - proekt/docs/dogovor.pdf && age-inspect out/dogovor-pq.age
     cd /work && age -R keys/pq.pub -r "$(cat keys/my.pub)" -o /tmp/mix.age proekt/.env; echo $?
     apt-get update && apt-get -y install openssh-client
     cd /work && ssh-keygen -q -t ed25519 -N '' -f /tmp/id_test && age -R /tmp/id_test.pub -o /tmp/ssh.age proekt/.env && age -d -i /tmp/id_test /tmp/ssh.age | cmp - proekt/.env && echo ssh-same
     cd /work && echo old > /tmp/exists.txt && age -d -i keys/my-key.txt -o /tmp/exists.txt out/env.age && cmp /tmp/exists.txt proekt/.env && echo replaced
     rm -f ~/.local/bin/age ~/.local/bin/age-keygen ~/.local/bin/age-inspect ~/.local/bin/age-plugin-pq ~/.local/bin/age-plugin-tag ~/.local/bin/age-plugin-tagpq ~/.local/bin/age-plugin-batchpass && hash -r && ! command -v age && echo removed
   - если ты работаешь в папке моего проекта, покажи git status: от установки в проекте не должно появиться изменений.
6. Итог одним сообщением: что установлено, какой версии и куда, сколько места заняло, что поменялось в системе и как всё удалить (macOS, Homebrew: brew uninstall age; Windows, winget: winget uninstall --id FiloSottile.age; Linux, готовый файл с GitHub: rm -f ~/.local/bin/age ~/.local/bin/age-keygen ~/.local/bin/age-inspect ~/.local/bin/age-plugin-pq ~/.local/bin/age-plugin-tag ~/.local/bin/age-plugin-tagpq ~/.local/bin/age-plugin-batchpass; Linux, apt (пакет Ubuntu): sudo apt-get purge age).

Если на любом шаге ошибка, не чини наугад: покажи текст ошибки и скажи, что, по-твоему, случилось. Частые проблемы: https://smyslokod.ru/cli/age#problemy

Промпт собран из официальных инструкций, сверенных 17.10.2026. Агент сначала проверит, что уже стоит, покажет план с местом на диске и способом удаления и без твоего «да» ничего не поставит.

Как ставят вручную

Способы из официальных источников, у каждого ссылка на первоисточник.

  • macOS · Homebrew · источник

    brew install age

    Так советует README проекта. На 17.10.2026 формула ставила 1.3.2. Мы не проверяли.

  • Windows · winget · источник

    winget install --id FiloSottile.age

    Так советует README проекта. Пакет 1.3.2 берёт архив age-v1.3.2-windows-amd64.zip с GitHub и добавляет команды age, age-keygen, age-inspect и плагин age-plugin-batchpass. Мы не проверяли.

  • Linux · готовый файл с GitHub · источник

    curl -sSfLO https://github.com/FiloSottile/age/releases/download/v1.3.2/age-v1.3.2-linux-amd64.tar.gz && tar xzf age-v1.3.2-linux-amd64.tar.gz && mkdir -p ~/.local/bin && install -m 755 age/age age/age-keygen age/age-inspect ~/.local/bin/

    Сумму архива сверь с контрольной суммой на странице выпуска (на GitHub она подписана Digest): у linux-amd64 это sha256 cbe24006683f8eb669266162894b9a522a1af52f2665fbc63a4bb032ed26ac10. Мы ставили так, сумма совпала. Папка ~/.local/bin должна быть в PATH. В архиве есть ещё плагины age-plugin-pq, age-plugin-tag, age-plugin-tagpq и age-plugin-batchpass, в прогоне мы клали в ~/.local/bin и их.

  • Linux · apt (пакет Ubuntu) · источник

    sudo apt-get install age

    README проекта даёт apt для Ubuntu 22.04 и новее. В Ubuntu 24.04 это 1.1.1, мы поставили и вывели версию. В пакете нет age-inspect и постквантовых ключей.

Как удалить

  • macOS, Homebrew: brew uninstall age
  • Windows, winget: winget uninstall --id FiloSottile.age
  • Linux, готовый файл с GitHub: rm -f ~/.local/bin/age ~/.local/bin/age-keygen ~/.local/bin/age-inspect ~/.local/bin/age-plugin-pq ~/.local/bin/age-plugin-tag ~/.local/bin/age-plugin-tagpq ~/.local/bin/age-plugin-batchpass
  • Linux, apt (пакет Ubuntu): sudo apt-get purge age

Что нужно для работы

  • Homebrew (в отдельных случаях) - только для установки через Homebrew на Mac

Системы

  • macOS - ставится через Homebrew, есть готовые архивы для Apple Silicon и Intel. На Mac мы не проверяли.
  • Linux - мы проверяли готовый архив для x86-64 на Ubuntu 24.04. В выпуске есть архивы и для arm64 и arm. Пакет Ubuntu 24.04 старше выпуска: 1.1.1, без age-inspect и без постквантовых ключей.
  • Windows - ставится через winget, пакет FiloSottile.age берёт архив выпуска с GitHub. На Windows мы не проверяли.

Где запускать

Ставить нужно туда, где работает агент: на твой компьютер, сервер или в контейнер.

  • На компьютере - где лежат файлы, которые нужно зашифровать перед отправкой или копией.
  • На сервере - например, чтобы шифровать выгрузки и копии на сервере открытым ключом. Секретный ключ для расшифровки тогда хранится в другом месте.
  • В контейнере - мы проверяли в контейнере Ubuntu 24.04 от root. Файл age из архива linux-amd64 не требует динамических библиотек: ldd ответил not a dynamic executable. Ключи создаёт отдельная команда age-keygen, для шифрования папки нужен tar.

Сколько ресурсов нужно

Место на диске
Архив выпуска для Linux x86-64 - 19 405 817 байт. Три команды age, age-keygen и age-inspect занимают 15 540 081 байт, вместе с четырьмя плагинами из архива в прогоне вышло 32 672 019 байт. Пакет Ubuntu 24.04 по данным apt занимает 5969 kB. Зашифрованный файл больше исходного на заголовок и служебные байты: в прогоне 2 000 000 байт превратились в 2 000 778.
Память
Отдельно не мерили.
Сеть
В нашем прогоне шифрования и расшифровки обычными ключами age в записи соединений не было ни одного адреса. Шифрование ключом SSH шло в одной записи соединений с установкой openssh-client через apt, отдельной записи только для него нет, поэтому о его соединениях мы ничего не пишем. Сторонние плагины age запускает как отдельные программы, их работу с сетью мы не проверяли. Скачивание архива шло к github.com (140.82.121.4) и release-assets.githubusercontent.com (185.199.108.133-185.199.111.133), порт 443, плюс DNS контейнера 127.0.0.11. Установка openssh-client и пакета age через apt ходила к archive.ubuntu.com и security.ubuntu.com (91.189.91.81-83, 91.189.92.22-24, 185.125.190.81-83, порт 80). Ещё apt обращался к deb.nodesource.com (104.20.45.190, 172.66.150.169): это источник Node.js в образе нашей песочницы, к age он отношения не имеет. Доступ из России мы не проверяли.

Скачивание и распаковка архива заняли 1,4 секунды. Задача целиком, с ключами, четырьмя зашифрованными файлами и расшифровкой, заняла около секунды.

Лицензия и платные замены

Лицензия BSD-3-Clause. Свободная лицензия: пользоваться можно бесплатно, в том числе в работе. Кто передаёт программу дальше, сохраняет уведомление об авторских правах, текст условий и отказ от гарантий, а у готовых файлов воспроизводит их в документации. Имена проекта и авторов для продвижения своих продуктов без письменного разрешения брать нельзя. Текст лицензии

Цена: Бесплатно. Программа бесплатная, лицензия BSD-3-Clause.

Платные замены

Платную замену мы не указываем. Эту задачу закрывают бесплатные GnuPG и 7-Zip, платные программы шифрования файлов мы не сверяли.

Бесплатные замены

  • GnuPG - Шифрование и подпись файлов и писем по стандарту OpenPGP. Возможностей больше, ключи и настройки сложнее. Мы её не проверяли.
  • rage - Вторая реализация age на Rust, README age называет её совместимой. Мы её не проверяли.
  • 7-Zip - Шифрует архив паролем. Подходит, когда получатель знает пароль и у него нет ключей age. В каталоге у неё своя карточка.

О чём помнить

  • Безопасность. Агент запускает age и age-keygen в терминале сам (exec). Если ключ получателя или секретный ключ относится к плагину, age ищет в PATH программу age-plugin-<имя> и запускает её, это тоже exec. Программа читает любой файл, путь к которому укажет агент, если у пользователя есть на него права (read), в том числе файлы секретных ключей. Пишет новые файлы по пути, который задаёт агент, с правами пользователя (write). Необратимые действия (acts) тоже есть. Ключ -o перезаписывает существующий файл без вопроса: в прогоне так заменился файл с другим текстом. Входа в учётные записи и сети age не требует.
  • Секретный ключ не восстановить. Если потеряны секретные ключи всех получателей файла и их копии, файл не открыть. Когда получателей несколько, хватит ключа любого из них: в прогоне договор открыли оба ключа по отдельности. Храните ключ отдельно от зашифрованных файлов и держите его копию в надёжном месте. age-keygen создала файл ключа с правами 600, а повторный запуск с тем же -o отказался его перезаписать: код 1, ключ остался прежним.
  • Если расшифровка оборвалась на испорченном файле, age завершается с кодом 1, но часть файла может остаться. В прогоне мы изменили один бит в середине зашифрованного договора, и до ошибки age успела записать 983 040 байт из 2 000 000. По справке программы в такой вывод попадает только проверенная часть, но файл всё равно неполный, его нужно удалить.
  • Шифрование фразой-паролем (-p) спрашивает пароль только с терминала. Без терминала age отвечает could not read passphrase и кодом 1. Такую команду человек запускает сам. Плагин age-plugin-batchpass читает пароль из переменной AGE_PASSPHRASE, но документация проекта предупреждает, что пароль так может попасть в историю команд, и советует ключи.
  • Постквантовые ключи (age-keygen -pq) появились в 1.3.0. Их открытый ключ длиной около 2000 знаков, и в один файл их нельзя смешивать с обычными: age отвечает can't mix post-quantum and classic recipients. Пакет Ubuntu 24.04 (1.1.1) таких ключей не знает.
  • При шифровании на ключ SSH в файле остаётся метка этого ключа, по ней видно, кому файл предназначен. Ключи из ssh-agent и с аппаратных токенов (YubiKey) как ключи SSH age не принимает, для YubiKey есть отдельный плагин.

Частые проблемы

age: error: no identity matched any of the recipients

Файл зашифрован для других ключей, переданный через -i ключ к нему не подходит. Возьми секретный ключ, парный одному из получателей. age-inspect покажет, для каких типов ключей зашифрован файл.

age: error: failed to decrypt and authenticate payload chunk, file may be corrupted or tampered with

Файл повреждён при передаче или изменён. В прогоне хватило одного изменённого бита. Удали частично записанный вывод и возьми исходную копию зашифрованного файла заново.

age: error: could not read passphrase: standard input is not a terminal

Ключ -p ждёт пароль с терминала, а агент запускает команды без него. Пусть человек выполнит команду в своём терминале или зашифруйте файл ключом age1....

age: error: incompatible recipients: can't mix post-quantum and classic recipients

В одной команде смешаны постквантовый ключ age1pq1... и обычный age1.... Выпусти всем получателям ключи одного типа или зашифруй файл двумя отдельными командами.

age-keygen: error: failed to open output file "...": file exists

Файл ключа с таким именем уже есть, и age-keygen его не перезаписывает. Выбери другое имя. Старый ключ не удаляй, пока не убедишься, что им ничего не зашифровано.

Проверка

✓ Проверено 17.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: age v1.3.2 из готового архива выпуска на GitHub, сумма sha256 сверена с выпуском.

Когда
17.10.2026
Среда
Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: age v1.3.2 из готового архива выпуска на GitHub, сумма sha256 сверена с выпуском
Объём
Установили и прогнали задачу на тестовых данных
Что именно сделали
  1. Одноразовый контейнер Ubuntu 24.04 без данных и ключей, age в нём не было. Скачали архив age-v1.3.2-linux-amd64.tar.gz с GitHub (19 405 817 байт), его sha256 совпала с digest на странице выпуска. Распаковали и положили age, age-keygen, age-inspect и плагины в ~/.local/bin за 1,4 секунды. age --version вывела v1.3.2.
  2. Скрипт сам создал тестовую папку проекта: файл договора dogovor.pdf из 2 000 000 случайных байт, выгрузку klienty.csv на 500 строк с адресами example.com и файл .env с ненастоящими ключами.
  3. Ключи: age-keygen -o keys/my-key.txt и age-keygen -o keys/colleague-key.txt создали два секретных ключа с правами 600, age-keygen -y вывела их открытые ключи в keys/my.pub и keys/colleague.pub, оба собрали в keys/recipients.txt.
  4. Шифрование: age -r с моим ключом -o out/env.age proekt/.env, договор командой age -R keys/recipients.txt -o out/dogovor.pdf.age proekt/docs/dogovor.pdf, папку целиком через tar czf - -C /work proekt | age -R keys/recipients.txt, выгрузку в текстовом виде через age -a. age-inspect показала у договора двух получателей X25519 и размер 266 байт заголовка, 512 байт служебных и 2 000 000 байт данных, всего 2 000 778.
  5. Расшифровка: age -d -i со своим ключом и с ключом коллеги открыла договор, папка из архива распаковалась через tar. Суммы sha256 всех расшифрованных копий .env, договора и выгрузки совпали с исходными. Строки API_TOKEN не нашлось в зашифрованных env.age и архиве папки, адреса client1@example.com - в текстовом виде выгрузки. Задача шла под записью соединений, и в записи не было ни одного адреса.
  6. Ошибки и защита: посторонний ключ получил no identity matched any of the recipients и код 1. Файл с одним изменённым битом дал код 1 и ответ file may be corrupted or tampered with, до ошибки age записала 983 040 байт. Повторный age-keygen в тот же файл отказался с file exists, сумма ключа не изменилась. Ключ -p без терминала дал код 1. Смесь постквантового и обычного ключа дала can't mix post-quantum and classic recipients.
  7. Постквантовый ключ age-keygen -pq (открытый ключ 1960 байт с переводом строки) зашифровал и открыл договор, age-inspect показала mlkem768x25519. Ключ SSH ed25519, созданный ssh-keygen после установки openssh-client, зашифровал и открыл .env. Команда age -d -o поверх файла с другим текстом заменила его без вопроса.
  8. Пакет Ubuntu: apt-get install age поставила 1.1.1-1ubuntu0.24.04.3, age --version вывела 1.1.1, apt-get purge age её убрала. Архивную установку удалили командой rm с именами всех семи файлов из архива, после hash -r команды age в PATH не осталось. Отдельным прогоном все команды taskCommands карточки выполнили подряд в одной оболочке, каждая завершилась с кодом 0. Все проверки скрипт сделал сам и только после них напечатал TASK_OK.
ДатаВерсияОбъёмГдеИтог
17.10.2026v1.3.2задачаконтейнер, Linuxполучилось
17.10.2026v1.3.2задачаконтейнер, Linuxполучилось
17.10.2026v1.3.2задачаконтейнер, Linuxполучилось

«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.

Похожие программы

Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.