AGE(1) General Commands Manual AGE(1)

age - ابزار ساده، مدرن و امن برای رمزنگاری فایل‌ها

age [--encrypt] (-r RECIPIENT | -R PATH)... [--armor] [-o OUTPUT] [INPUT]
age [--encrypt] --passphrase [--armor] [-o OUTPUT] [INPUT]
age --decrypt [-i PATH | -j PLUGIN]... [-o OUTPUT] [INPUT]

دستور age فایل ورودی INPUT را رمزگذاری یا رمزگشایی کرده و در OUTPUT می‌نویسد. آرگومان INPUT اختیاری است و به طور پیش‌فرض از ورودی استاندارد استفاده می‌کند. تنها یک فایل INPUT را می‌توان مشخص کرد. اگر -o تعیین نشود، مقدار OUTPUT خروجی استاندارد خواهد بود.

اگر -p/--passphrase تعیین شود، فایل با یک عبارت عبور که به صورت تعاملی درخواست می‌شود رمزگذاری خواهد شد. در غیر این صورت، برای یک یا چند دریافت‌کننده RECIPIENTS که با -r/--recipient یا -R/--recipients-file مشخص شده‌اند رمزگذاری می‌شود. هر یک از دریافت‌کنندگان می‌توانند فایل را رمزگشایی کنند.

در حالت رمزگشایی -d/--decrypt، فایل‌های رمزگذاری‌شده با عبارت عبور به طور خودکار شناسایی شده و عبارت عبور به صورت تعاملی درخواست می‌شود. در غیر این صورت، از یک یا چند هویت IDENTITIES که با -i/--identity مشخص شده‌اند برای رمزگشایی فایل استفاده می‌گردد.

فایل‌های رمزگذاری‌شده با age باینری و غیرقابل دستکاری هستند، با حدود ۲۰۰ بایت سرریز به ازای هر دریافت‌کننده به اضافه ۱۶ بایت در هر ۶۴ کیلوبایت متن خام.

نوشتن فایل رمزگذاری یا رمزگشایی‌شده در OUTPUT به جای خروجی استاندارد. اگر OUTPUT از قبل وجود داشته باشد، بازنویسی خواهد شد.
اگر رمزگذاری بدون --armor انجام شود، age از خروجی دادن داده باینری به ترمینال (TTY) خودداری می‌کند. این رفتار را می‌توان با مشخص کردن - به عنوان OUTPUT تغییر داد.
نمایش نسخه و خروج.

رمزگذاری INPUT به OUTPUT. این حالت پیش‌فرض است.
رمزگذاری برای دریافت‌کننده مشخص‌شده صریح RECIPIENT. برای قالب‌های ممکن دریافت‌کننده، به بخش دریافت‌کنندگان و هویت‌ها مراجعه کنید.
این گزینه می‌تواند تکرار شده و با سایر فلگ‌های دریافت‌کننده ترکیب شود و فایل توسط هر یک از دریافت‌کنندگان ارائه‌شده به طور مستقل قابل رمزگشایی خواهد بود.
رمزگذاری برای دریافت‌کنندگان RECIPIENTS فهرست‌شده در فایل واقع در PATH (در هر سطر یک دریافت‌کننده). خطوط خالی و خطوطی که با # آغاز می‌شوند به عنوان توضیح نادیده گرفته می‌شوند.
اگر PATH برابر - باشد، دریافت‌کنندگان از ورودی استاندارد خوانده می‌شوند. در این صورت، آرگومان INPUT باید مشخص شود.
این گزینه می‌تواند تکرار شده و با سایر فلگ‌های دریافت‌کننده ترکیب شود و فایل توسط تمام دریافت‌کنندگان ارائه‌شده به طور مستقل رمزگشایی گردد.
رمزگذاری با عبارت عبور، که به صورت تعاملی از ترمینال درخواست می‌شود. برنامه age پیشنهاد تولید خودکار یک عبارت عبور امن را خواهد داد.
این گزینه را نمی‌توان همراه با سایر فلگ‌های دریافت‌کننده استفاده کرد.
رمزگذاری در قالب متنی فقط اسکی "armored".
قالب armored در age نگارش دقیقی از PEM با نوع AGE ENCRYPTED FILE، بیس۶۴ استاندارد دقیق، بدون سرآیند و بدون پشتیبانی از داده‌های اضافی در ابتدا یا انتها است.
فرآیند رمزگشایی به طور شفاف حالت متنی ASCII armored را شناسایی و باز می‌کند.
رمزگذاری برای دریافت‌کنندگان RECIPIENTS متناظر با هویت‌های IDENTITIES فهرست‌شده در فایل واقع در PATH. این معادل تبدیل فایل موجود در PATH به فایل دریافت‌کنندگان با age-keygen -y و سپس ارسال آن به -R/--recipients-file است.
برای ساختار PATH، تعریف -i/--identity در بخش گزینه‌های رمزگشایی را ببینید.
هنگام استفاده از -i/--identity در حالت رمزگذاری، باید -e/--encrypt به طور صریح مشخص شود تا از سردرگمی جلوگیری به عمل آید.
رمزگذاری با استفاده از افزونه بدون داده PLUGIN.
این معادل استفاده از -i/--identity با فایلی است که شامل یک هویت افزونه منفرد بدون رمزگذاری داده‌های خاص افزونه باشد.
هنگام استفاده از -j در حالت رمزگذاری، باید -e/--encrypt به صراحت مشخص شود.

رمزگشایی INPUT به OUTPUT.
اگر INPUT با عبارت عبور رمزگذاری شده باشد، به طور خودکار شناسایی شده و عبارت عبور به صورت تعاملی درخواست می‌شود. در غیر این صورت، از هویت‌های IDENTITIES مشخص‌شده با -i/--identity استفاده می‌شود.
حالت متنی ASCII armoring به صورت خودکار شناسایی و رمزگشایی می‌شود.
رمزگشایی با استفاده از هویت‌های IDENTITIES در PATH.
مقدار PATH می‌تواند یکی از موارد زیر باشد:
الف. فایلی که هویت‌های IDENTITIES را در هر سطر فهرست کرده باشد. خطوط خالی و خطوط شروع‌شده با "#" به عنوان توضیح نادیده گرفته می‌شوند.
ب. یک فایل age رمزگذاری‌شده با عبارت عبور که حاوی هویت‌های IDENTITIES در هر سطر مانند بالا باشد. عبارت عبور به صورت تعاملی درخواست می‌شود. توجه داشته باشید که فایل‌های هویت محافظت‌شده با عبارت عبور برای اکثر کاربردها ضروری نیستند، زیرا دسترسی به فایل هویت رمزگذاری‌شده به منزله دسترسی به کل سیستم است.
ج. فایل کلید خصوصی SSH در قالب‌های PKCS#1، PKCS#8 یا OpenSSH. اگر کلید خصوصی دارای رمز عبور باشد، کلمه عبور تنها در صورتی که هویت SSH با فایل مطابقت داشته باشد به صورت تعاملی پرسیده می‌شود. برای اطلاعات بیشتر از جمله انواع کلیدهای پشتیبانی‌شده، بخش کلیدهای SSH را ببینید.
د. مقدار "-" که باعث خواندن یکی از موارد بالا از ورودی استاندارد می‌شود. در این صورت، آرگومان INPUT باید تعیین گردد.
این گزینه می‌تواند تکرار شود. هویت‌ها به ترتیب ارائه آزمایش می‌شوند و اولین هویتی که با یکی از دریافت‌کنندگان فایل همخوانی داشته باشد استفاده می‌شود. هویت‌های استفاده‌نشده نادیده گرفته می‌شوند، اما اگر فایل ورودی INPUT با عبارت عبور رمزگذاری شده باشد و -i/--identity مشخص شود، خطا رخ خواهد داد.
رمزگشایی با استفاده از افزونه بدون داده PLUGIN.
این معادل استفاده از -i/--identity با فایلی است که شامل یک هویت افزونه منفرد فاقد داده‌های خاص افزونه باشد.

دریافت‌کنندگان (RECIPIENTS) مقادیر عمومی مانند کلید عمومی هستند که فایل می‌تواند برای آن‌ها رمزگذاری شود. هویت‌ها (IDENTITIES) مقادیر خصوصی مانند کلید خصوصی هستند که امکان رمزگشایی فایل رمزگذاری‌شده برای RECIPIENT متناظر را فراهم می‌سازند.

جفت کلیدهای بومی age با دستور age-keygen(1) تولید می‌شوند و کدگذاری‌های کوتاه و رمزنگاری قوی بر پایه الگوریتم X25519 برای کلیدهای کلاسیک و X25519 + ML-KEM-768 برای کلیدهای هیبریدی پساکوانتومی فراهم می‌آورند. کلیدهای هیبریدی پساکوانتومی در برابر رایانه‌های کوانتومی آینده امن هستند و برای بیشتر کاربردها توصیه می‌شوند.

کدگذاری هیبریدی دریافت‌کننده (RECIPIENT) با age1pq1 آغاز می‌شود و به این صورت است:

age1pq167[... 1950 more characters ...]

کدگذاری هیبریدی هویت (IDENTITY) با AGE-SECRET-KEY-PQ-1 آغاز می‌شود و مانند زیر است:

AGE-SECRET-KEY-PQ-1K30MYPZAHAXHR22YHH27EGDVLU0QNSUH3DSV7J7NR3X6D9LHXNWSDLTV4T

کدگذاری کلاسیک دریافت‌کننده (RECIPIENT) با age1 آغاز می‌شود:

age1gde3ncmahlqd9gg50tanl99r960llztrhfapnmx853s4tjum03uqfssgdh

کدگذاری کلاسیک هویت (IDENTITY) با AGE-SECRET-KEY-1 آغاز می‌شود:

AGE-SECRET-KEY-1KTYK6RVLN5TAPE7VF6FQQSKZ9HWWCDSKUGXXNUQDWZ7XXT5YK5LSF3UTKQ

یک فایل نمی‌تواند به طور همزمان برای هر دو نوع کلید کلاسیک و پساکوانتومی رمزگذاری شود، زیرا این کار امنیت پساکوانتومی رمزنگاری را از بین می‌برد.

یک فایل رمزگذاری‌شده بدون دسترسی به هویت متناظر نمی‌تواند به دریافت‌کننده بومی مرتبط شود.

به عنوان یک قابلیت تسهیل‌کننده، age از رمزگذاری برای کلیدهای RSA یا Ed25519 در ssh(1) نیز پشتیبانی می‌کند. کلیدهای RSA باید حداقل ۲۰۴۸ بیتی باشند. این قابلیت از رمزنگاری پیچیده‌تری استفاده می‌کند و فقط زمانی باید استفاده شود که کلید بومی برای دریافت‌کننده در دسترس نباشد. توجه داشته باشید که کلیدهای SSH ممکن است به صورت بلندمدت توسط دریافت‌کننده محافظت نشوند، زیرا هنگام استفاده صرفاً برای احراز هویت قابل باطل‌سازی هستند.

کدگذاری RECIPIENT در واقع یک کلید عمومی SSH در قالب authorized_keys است (بخش مربوطه در sshd(8) را ببینید)، که با ssh-rsa یا ssh-ed25519 شروع می‌شود، مانند:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDULTit0KUehbi[...]GU4BtElAbzh8=
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH9pO5pz22JZEas[...]l1uZc31FGYMXa

توضیحات انتهای خط، در صورت وجود، نادیده گرفته می‌شوند.

در فایل‌های دریافت‌کنندگان که به -R/--recipients-file ارسال می‌شوند، کلیدهای عمومی نامعتبر اما معتبر SSH با یک هشدار نادیده گرفته می‌شوند تا استفاده از فایل‌های authorized_keys یا .keys در گیت‌هاب تسهیل شود. (مثال‌ها را ببینید).

یک هویت (IDENTITY) یک فایل کلید خصوصی SSH است که به صورت جداگانه به -i/--identity داده می‌شود. توجه داشته باشید کلیدهایی که روی توکن‌های سخت‌افزاری مانند YubiKey نگهداری می‌شوند یا از طریق ssh-agent(1) در دسترس هستند پشتیبانی نمی‌شوند.

یک فایل رمزگذاری‌شده می‌تواند به کلید عمومی SSH که برای آن رمزگذاری شده پیوند یابد. این کار به منظور شناسایی کلید خصوصی صحیح SSH توسط age پیش از درخواست کلمه عبور آن صورت می‌گیرد.

برنامه age می‌تواند از طریق افزونه‌ها توسعه یابد. یک افزونه تنها در صورتی بارگذاری می‌شود که یک RECIPIENT یا IDENTITY متناظر با آن مشخص شده باشد. (صرفاً رمزگشایی فایلی که با افزونه رمزگذاری شده به دلایل امنیتی منجر به بارگذاری خودکار افزونه نمی‌شود).

یک RECIPIENT برای افزونه‌ای با نام example با age1example1 آغاز می‌شود، در حالی که یک IDENTITY با AGE-PLUGIN-EXAMPLE-1 شروع می‌گردد. هر دوی آن‌ها داده‌های دلخواه مختص افزونه را در بر داشته و توسط افزونه تولید می‌شوند.

هنگامی که یکی از آن‌ها مشخص شود، age برنامه age-plugin-example را در متغیر PATH جستجو کرده و آن را جهت انجام رمزگذاری یا رمزگشایی سرآیند فایل اجرا می‌کند. افزونه ممکن است ورودی‌هایی را از طریق age از کاربر برای تکمیل عملیات درخواست کند.

افزونه‌ها را می‌توان آزادانه با سایر افزونه‌ها یا کلیدهای بومی ترکیب کرد.

یک افزونه محدود به رمزگذاری یا رمزگشایی فایل‌هایی نیست که مختص آن ساخته شده‌اند. مثلاً افزونه می‌تواند برای رمزگشایی فایل‌های رمزگذاری‌شده برای یک دریافت‌کننده بومی X25519 یا حتی با عبارت عبور استفاده شود. به همین ترتیب، افزونه می‌تواند فایلی را رمزگذاری کند که بدون استفاده از هیچ افزونه‌ای قابل رمزگشایی باشد.

افزونه‌هایی که تمایز بین هویت و دریافت‌کننده در آن‌ها معنا ندارد (مانند افزونه‌های رمزنگاری متقارن) ممکن است تنها یک IDENTITY تولید کنند و از کاربر بخواهند با فلگ‌های -e/--encrypt و -i/--identity رمزگذاری را انجام دهد. افزونه‌هایی که مفهوم هویت‌های مجزا در آن‌ها صدق نمی‌کند (مانند افزونه رمزگذاری با کلمه عبور) ممکن است کاربر را به استفاده از فلگ -j هدایت کنند.

ابزار age می‌تواند مستقیماً برای دریافت‌کنندگانی که با age1tag1 (با استفاده از P-256 ECDH) یا age1tagpq1 (با استفاده از هیبرید پساکوانتومی ML-KEM-768 + P-256) شروع می‌شوند رمزگذاری کند. این کلیدها برای بخش عمومی کلیدهای خصوصی سخت‌افزاری در نظر گرفته شده‌اند.

این کلیدها به طور مستقیم پشتیبانی می‌شوند تا نیازی به نصب افزونه (که ممکن است وابسته به سیستم‌عامل باشد) در سمت فرستنده نباشد.

برچسب (tag) به مشاهده‌گر امکان می‌دهد فایل‌ها را با دریافت‌کننده تطبیق دهد (اما نه فایل‌ها را با یکدیگر بدون اطلاع از دریافت‌کننده)، که این ویژگی برای کلیدهای سخت‌افزاری که نیازمند تعامل کاربر برای هر عملیات هستند مطلوب است.

برنامه age کد وضعیت 0 را برمی‌گرداند اگر و تنها اگر رمزگذاری یا رمزگشایی برای کل محتوای ورودی موفقیت‌آمیز باشد.

اگر خطایی حین رمزگشایی رخ دهد، ممکن است بخشی از خروجی تولید شود، اما تنها در صورتی که اعتبارسنجی امنیتی آن امکان‌پذیر بوده باشد. هیچ خروجی تاییدنشده‌ای هرگز منتشر نمی‌شود.

فایل‌های رمزگذاری‌شده با نسخه پایدار age (غیر آلفا، بتا یا نامزد انتشار) با تمام نسخه‌های بعدی ابزار قابل رمزگشایی هستند.

اگر رمزگشایی فایل‌های قدیمی‌تر خطر امنیتی داشته باشد، ممکن است به طور پیش‌فرض منجر به خطا شود که در این حالت فلگی برای اجبار به انجام عملیات ارائه خواهد شد.

تولید یک هویت جدید پساکوانتومی، رمزگذاری داده‌ها و سپس رمزگشایی:

$ age-keygen -pq -o key.txt
Public key: age1pq167[... 1950 more characters ...]
$ tar cvz ~/data | age -r age1pq167[...] > data.tar.gz.age
$ age -d -o data.tar.gz -i key.txt data.tar.gz.age

رمزگذاری فایل example.jpg برای چند دریافت‌کننده و ذخیره در example.jpg.age:

$ age -o example.jpg.age -r age1pq167[...] -r age1pq1e3[...] example.jpg

رمزگذاری برای فهرستی از دریافت‌کنندگان:

$ cat > recipients.txt
# Alice
age1pq167[... 1950 more characters ...]
# Bob
age1pq1e3[... 1950 more characters ...]
$ age -R recipients.txt example.jpg > example.jpg.age

رمزگذاری و رمزگشایی فایل با استفاده از عبارت عبور:

$ age -p secrets.txt > secrets.txt.age
Enter passphrase (leave empty to autogenerate a secure one):
Using the autogenerated passphrase "release-response-step-brand-wrap-ankle-pair-unusual-sword-train".
$ age -d secrets.txt.age > secrets.txt
Enter passphrase:

رمزگذاری و رمزگشایی با فایل هویت محافظت‌شده با عبارت عبور:

$ age-keygen | age -p > key.age
Public key: age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5
Enter passphrase (leave empty to autogenerate a secure one):
Using the autogenerated passphrase "hip-roast-boring-snake-mention-east-wasp-honey-input-actress".
$ age -r age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5 secrets.txt > secrets.txt.age
$ age -d -i key.age secrets.txt.age > secrets.txt
Enter passphrase for identity file "key.age":

رمزگذاری و رمزگشایی با کلید عمومی SSH:

$ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age
$ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg

رمزگذاری و رمزگشایی با age-plugin-yubikey:

$ age-plugin-yubikey # run interactive setup, generate identity file and obtain recipient
$ age -r age1yubikey1qwt50d05nh5vutpdzmlg5wn80xq5negm4uj9ghv0snvdd3yysf5yw3rhl3t secrets.txt > secrets.txt.age
$ age -d -i age-yubikey-identity-388178f3.txt secrets.txt.age

رمزگذاری برای کلیدهای SSH یک کاربر گیت‌هاب:

$ curl https://github.com/benjojo.keys | age -R - example.jpg > example.jpg.age

age-keygen(1), age-inspect(1)

Filippo Valsorda age@filippo.io

August 2026