PageSourceSearch

https://students-tech.blog/post/age

html students-tech.blog collected 2026-10-05 22:52:35 UTC 30,126 bytes, 65 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-US" dir="ltr">
3  <head>
4    <meta charset="utf-8">
5    <meta name="viewport" content="width=device-width,initial-scale=1">
6    <title>ageを使ってファイルを暗号化してみる | 学生たちの技術ブログ</title>
7    <meta name="description" content="直感的に理解しづらいファイルの暗号化を簡単にできるツールageを紹介">
8    <meta name="generator" content="VitePress v1.6.3">
9    <link rel="preload stylesheet" href="/assets/style.ofBjCEtq.css" as="style">
10    <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11    
12    
12<script type="module" src="/assets/app.Btev9-JB.js"></script>
12
13    <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14    <link rel="modulepreload" href="/assets/chunks/framework.CmsrXLN2.js">
15    <link rel="modulepreload" href="/assets/chunks/theme.xfW5Djw4.js">
16    <link rel="modulepreload" href="/assets/chunks/katex.ChWnQ-fc.js">
17    <link rel="modulepreload" href="/assets/chunks/dagre-FFZHY6LT.CjyuyzO8.js">
18    <link rel="modulepreload" href="/assets/chunks/c4Diagram-6F6E4RAY.BTh60Apf.js">
19    <link rel="modulepreload" href="/assets/chunks/flowDiagram-PKI6S5ZS.BlOgvB_k.js">
20    <link rel="modulepreload" href="/assets/chunks/erDiagram-R3QVA2FD.fxCDRYX2.js">
21    <link rel="modulepreload" href="/assets/chunks/gitGraphDiagram-GW3U2K7C.vh4lvYxX.js">
22    <link rel="modulepreload" href="/assets/chunks/ganttDiagram-EK5VF46D.6X5bwtCm.js">
23    <link rel="modulepreload" href="/assets/chunks/infoDiagram-XT3IWWJI.CnoxQs88.js">
24    <link rel="modulepreload" href="/assets/chunks/pieDiagram-NIOCPIFQ.bToBWpCi.js">
25    <link rel="modulepreload" href="/assets/chunks/quadrantDiagram-2OG54O6I.LbUZ_9aZ.js">
26    <link rel="modulepreload" href="/assets/chunks/xychartDiagram-H2YORKM3.CC1b80LN.js">
27    <link rel="modulepreload" href="/assets/chunks/requirementDiagram-SO3GGRV7.DNu0EAvr.js">
28    <link rel="modulepreload" href="/assets/chunks/sequenceDiagram-ZIKVLSP4.DpVlfvf7.js">
29    <link rel="modulepreload" href="/assets/chunks/classDiagram-BGRH5UQR.DWI8COmP.js">
30    <link rel="modulepreload" href="/assets/chunks/classDiagram-v2-O24JOBDK.DWI8COmP.js">
31    <link rel="modulepreload" href="/assets/chunks/stateDiagram-XX37X6EN.CKNWgOP5.js">
32    <link rel="modulepreload" href="/assets/chunks/stateDiagram-v2-GD6S3NHB.BpGAgcBP.js">
33    <link rel="modulepreload" href="/assets/chunks/journeyDiagram-EWQZEKCU.Mr20EXFF.js">
34    <link rel="modulepreload" href="/assets/chunks/timeline-definition-RI47OAVP.DaU5jXef.js">
35    <link rel="modulepreload" href="/assets/chunks/mindmap-definition-CZNETY7S.BcLeOqhw.js">
36    <link rel="modulepreload" href="/assets/chunks/kanban-definition-ILFWEQ3N.Ce1gjRLR.js">
37    <link rel="modulepreload" href="/assets/chunks/sankeyDiagram-4UZDY2LN.WXNx8qfP.js">
38    <link rel="modulepreload" href="/assets/chunks/diagram-5UYTHUR4.eZPZbeAi.js">
39    <link rel="modulepreload" href="/assets/chunks/diagram-ZTM2IBQH.BVRWFjF2.js">
40    <link rel="modulepreload" href="/assets/chunks/blockDiagram-PHRCVELO.BvGBElWu.js">
41    <link rel="modulepreload" href="/assets/chunks/architectureDiagram-NQ2NVSRB.BLmAEpSo.js">
42    <link rel="modulepreload" href="/assets/chunks/diagram-3EMPZRKU.BDpoDJet.js">
43    <link rel="modulepreload" href="/assets/chunks/virtual_mermaid-config.DDnGl6nM.js">
44    <link rel="modulepreload" href="/assets/post_age.md.CK70qJz5.lean.js">
45    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
vendor: 68 bytes, lines 45-46
45
46    <script async src="https://www.googletagmanager.com/gtag/js?id=
46G-SBRRP4LRT6
vendor: 16 bytes, lines 46-47
46"></script>
47    
47<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-SBRRP4LRT6");</script>
47
48    
48<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
48
49    
49<script>(adsbygoogle=window.adsbygoogle||[]).push({google_ad_client:"ca-pub-1395471808093411",enable_page_level_ads:!0});</script>
49
50    
50<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
50
51    
51<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
51
52  </head>
53  <body>
54    <div id="app"><div class="Layout" data-v-5d98c3a5><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0b0ada53></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0b0ada53>Skip to content</a><!--]--><!----><header class="VPNav" data-v-5d98c3a5 data-v-ae24b3ad><div class="VPNavBar" data-v-ae24b3ad data-v-6aa21345><div class="wrapper" data-v-6aa21345><div class="container" data-v-6aa21345><div class="title" data-v-6aa21345><div class="VPNavBarTitle" data-v-6aa21345 data-v-1168a8e4><a class="title" href="/" data-v-1168a8e4><!--[--><!--]--><!----><span data-v-1168a8e4>学生たちの技術ブログ</span><!--[--><!--]--></a></div></div><div class="content" data-v-6aa21345><div class="content-body" data-v-6aa21345><!--[--><!--]--><div class="VPNavBarSearch search" data-v-6aa21345><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-6aa21345 data-v-dc692963><span id="main-nav-aria-label" class="visually-hidden" data-v-dc692963> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-dc692963 data-v-e56f3d57><!--[--><span data-v-e56f3d57>ホーム</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/post/" tabindex="0" data-v-dc692963 data-v-e56f3d57><!--[--><span data-v-e56f3d57>投稿</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-6aa21345 data-v-6c893767><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6c893767 data-v-5337faa4 data-v-1d5665e3><span class="check" data-v-1d5665e3><span class="icon" data-v-1d5665e3><!--[--><span class="vpi-sun sun" data-v-5337faa4></span><span class="vpi-moon moon" data-v-5337faa4></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-6aa21345 data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/xd-tech/linux-blog" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-bd121fe5><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-6aa21345 data-v-bb2aa2f0 data-v-cf11d7a2><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-cf11d7a2><span class="vpi-more-horizontal icon" data-v-cf11d7a2></span></button><div class="menu" data-v-cf11d7a2><div class="VPMenu" data-v-cf11d7a2 data-v-b98bc113><!----><!--[--><!--[--><!----><div class="group" data-v-bb2aa2f0><div class="item appearance" data-v-bb2aa2f0><p class="label" data-v-bb2aa2f0>Appearance</p><div class="appearance-action" data-v-bb2aa2f0><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-bb2aa2f0 data-v-5337faa4 data-v-1d5665e3><span class="check" data-v-1d5665e3><span class="icon" data-v-1d5665e3><!--[--><span class="vpi-sun sun" data-v-5337faa4></span><span class="vpi-moon moon" data-v-5337faa4></span><!--]--></span></span></button></div></div></div><div class="group" data-v-bb2aa2f0><div class="item social-links" data-v-bb2aa2f0><div class="VPSocialLinks social-links-list" data-v-bb2aa2f0 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/xd-tech/linux-blog" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-bd121fe5><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-6aa21345 data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><div class="divider" data-v-6aa21345><div class="divider-line" data-v-6aa21345></div></div></div><!----></header><div class="VPLocalNav empty fixed" data-v-5d98c3a5 data-v-a6f0e41e><div class="container" data-v-a6f0e41e><!----><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-a6f0e41e data-v-8a42e2b4><button data-v-8a42e2b4>Return to top</button><!----></div></div></div><!----><div class="VPContent" id="VPContent" data-v-5d98c3a5 data-v-1428d186><div class="VPDoc has-aside" data-v-1428d186 data-v-39a288b8><!--[--><!--]--><div class="container" data-v-39a288b8><div class="left-aside aside" data-v-39a288b8><div class="aside-curtain" data-v-39a288b8></div><div class="aside-container" data-v-39a288b8><div class="aside-content" data-v-39a288b8><div class="VPDocAside" data-v-39a288b8 data-v-3f215769><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-3f215769 data-v-a5bbad30><div class="content" data-v-a5bbad30><div class="outline-marker" data-v-a5bbad30></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-a5bbad30>On this page</div><ul class="VPDocOutlineItem root" data-v-a5bbad30 data-v-b933a997><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-39a288b8><div class="content-container" data-v-39a288b8><!--[--><!--]--><main class="main" data-v-39a288b8><div style="position:relative;" class="vp-doc _post_age" data-v-39a288b8><div>
54<h1 id="ageを使ってファイルを暗号化してみる" tabindex="-1">ageを使ってファイルを暗号化してみる <a class="header-anchor" href="#ageを使ってファイルを暗号化してみる" aria-label="Permalink to &quot;ageを使ってファイルを暗号化してみる&quot;">​</a></h1><p>最近様々なプラットフォームでファイルの送受信をしますが、残念ながらまだ暗号化されたファイルの送受信のための方法として定着している方法はなく(pgpがかなり頑張っていたが一般に浸透していない)、<a href="https://ja.wikipedia.org/wiki/PPAP_(%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)" target="_blank" rel="noreferrer">PPAP</a>が未だに使われているのが現状です。</p><p>この記事では<a href="https://github.com/FiloSottile/age" target="_blank" rel="noreferrer">age</a>というツールを使って簡単にファイルを暗号化して送ったり、自分用に保存したりする方法について解説してみようかと思います。このツールがいずれ流行ってほしいという気持ちで書いてみています。半分は個人的なメモ目的です。</p><div class="warning custom-block"><p class="custom-block-title">WARNING</p><p>この記事に書かれている方法を用いて暗号化されたファイルの扱いについては<strong>自己責任</strong>でお願いします。脆弱な鍵による情報漏洩や、データの破損について当記事では責任を負いません。</p></div><h2 id="暗号化と復号化" tabindex="-1">暗号化と復号化 <a class="header-anchor" href="#暗号化と復号化" aria-label="Permalink to &quot;暗号化と復号化&quot;">​</a></h2><h3 id="概要" tabindex="-1">概要 <a class="header-anchor" href="#概要" aria-label="Permalink to &quot;概要&quot;">​</a></h3><div class="mermaid"></div><h3 id="ファイルの暗号化" tabindex="-1">ファイルの暗号化 <a class="header-anchor" href="#ファイルの暗号化" aria-label="Permalink to &quot;ファイルの暗号化&quot;">​</a></h3><p><strong>前提</strong></p><ul><li>送りたいファイルは<code>hello.txt</code></li><li>暗号化されたファイルは<code>hello.age</code>に保存</li><li>ファイルを送りたい相手または自分のSSH公開鍵が次のようにrecepients.txtファイルに書き込まれている(相手がGithubユーザーの場合<code>github.com/*username*.keys</code>で鍵が分かる)</li></ul><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM/QhUXk6LPpFd97zUow1bHkkF1CvRAjCG1iIfg5BBhd</span></span>
55<span class="line"><span>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHznJQ8IDhutvWvChU6zk9LpKN0GOVtUbAREYUu2agpU</span></span>
56<span class="line"><span>...</span></span></code></pre></div><p>次のコマンドで暗号化できる</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> age</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -R</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> recepients.txt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.age</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.txt</span></span>
57<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># OR</span></span>
58<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.txt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> age</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -R</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> recepients.txt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.age</span></span></code></pre></div><p><strong>ファイルの復号化</strong></p><ul><li>公開鍵に対応する秘密鍵が.ssh/id_ed25519に保存さã
58‚Œã¦ã„ã‚‹</li><li>復号化されたファイルは<code>hello.txt</code>に保存</li></ul><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> age</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .ssh/id_ed25519</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.txt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.age</span></span>
59<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># OR</span></span>
60<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.age</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> age</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .ssh/id_ed25519</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> hello.txt</span></span></code></pre></div><h2 id="ageの紹介" tabindex="-1">ageの紹介 <a class="header-anchor" href="#ageの紹介" aria-label="Permalink to &quot;ageの紹介&quot;">​</a></h2><p><a href="https://github.com/FiloSottile/age" target="_blank" rel="noreferrer">age</a>のGithubのREADMEの一部を意訳するとこう書かれています</p><blockquote><p>ageはシンプルでモダンなファイル暗号化ツールであり、フォーマットであり、Goのライブラリである。 小さく明示的な鍵を使い、設定等はなく、UNIXスタイルのcomposabilityを持つ。</p></blockquote><p>(ここでcomposabilityは他のツールと組み合わせてコマンドラインで使えることを指すと思われるが良い訳が出てこなかった)</p><p>ということらしいです。 ファイルの暗号化には他にもツールとして<a href="https://gnupg.org/" target="_blank" rel="noreferrer">gpg</a>や<a href="https://www.openssl.org/" target="_blank" rel="noreferrer">openssl</a>を活用できますが、個人的にはageの使い方が非常にわかりやすいのはありがたいですね。</p><p>では書かれていることについてそれぞれ踏み込んでみましょう。</p><h3 id="シンプルでモダンなファイル暗号化ツール" tabindex="-1">シンプルでモダンなファイル暗号化ツール <a class="header-anchor" href="#シンプルでモダンなファイル暗号化ツール" aria-label="Permalink to &quot;シンプルでモダンなファイル暗号化ツール&quot;">​</a></h3><p>暗号化、復号化がそれぞれ一行でできる!SSHの鍵で暗号化できる!それで十分ですかね?</p><p>実装されている言語がGo(またはスペック準拠のrageの場合はRust)である点もモダンである点ですね。 ちなみにスペックの詳細を見ても、用いられている暗号アルゴリズムが比較的にモダンで誤用しにくい仕様となっています。</p><h3 id="フォーマットとしてのage" tabindex="-1">フォーマットとしてのage <a class="header-anchor" href="#フォーマットとしてのage" aria-label="Permalink to &quot;フォーマットとしてのage&quot;">​</a></h3><p>ageは暗号化されたファイルフォーマットとしての役割も持っています。ファイルフォーマットや暗号化方式は次のページにかかれています。 <a href="https://age-encryption.org/v1" target="_blank" rel="noreferrer">https://age-encryption.org/v1</a></p><p>スペックに準拠していれば他のプログラムからage互換のファイルが読み書きできますね!</p><h3 id="goのライブラリとしてのage" tabindex="-1">Goのライブラリとしてのage <a class="header-anchor" href="#goのライブラリとしてのage" aria-label="Permalink to &quot;Goのライブラリとしてのage&quot;">​</a></h3><p>ageのスペック準拠のプログラムが書きやすいということでã
60™ã­ã€‚<a href="https://pkg.go.dev/filippo.io/age" target="_blank" rel="noreferrer">Goのライブラリ</a>として使うこともできますし、<a href="https://crates.io/crates/age" target="_blank" rel="noreferrer">Rustのライブラリ</a>も作られているようですね</p><h3 id="小さく明示的な鍵が使われている" tabindex="-1">小さく明示的な鍵が使われている <a class="header-anchor" href="#小さく明示的な鍵が使われている" aria-label="Permalink to &quot;小さく明示的な鍵が使われている&quot;">​</a></h3><p>ageで使える鍵は2種類あります。 どちらかの方法で鍵ペアを作成し公開鍵を事前に相手に渡しておく必要があります。</p><ul><li>ssh鍵ペア(ssh-rsa, ssh-ed25519)</li><li>ageで生成した鍵ペア</li></ul><p>ssh鍵の使い勝手が良いのでそれを使うケースが多そうですね。 GitHubをSSHで利用している人は<code>github.com/アカウント名.key</code>でSSHの公開鍵をすべて確認できるので事前にもらっておく手間も省けますね。 ちなみに私の公開鍵は <a href="https://github.com/pineapplehunter.keys" target="_blank" rel="noreferrer">https://github.com/pineapplehunter.keys</a> で見れます</p><h4 id="ssh鍵の生成" tabindex="-1">SSH鍵の生成 <a class="header-anchor" href="#ssh鍵の生成" aria-label="Permalink to &quot;SSH鍵の生成&quot;">​</a></h4><p>鍵の生成についてはSSHの場合はつぎのコマンドでできます(ed25519がオススメ)</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ssh-keygen</span></span></code></pre></div><p>生成された鍵ペアの<code>.pub</code>がついている方を公開して暗号化してもらい、拡張子のついていない方で復号化します。</p><h4 id="age鍵の生成" tabindex="-1">age鍵の生成 <a class="header-anchor" href="#age鍵の生成" aria-label="Permalink to &quot;age鍵の生成&quot;">​</a></h4><p>ageの鍵ペアの生成は次のコマンドでできます</p><div class="language-shell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> age-keygen</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> keys.txt</span></span>
61<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Public</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> key:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> age1a2s0ptca3x87xea8x9c04xm0gup5ydmqhjnnyxm2pyxqmla9mq5qgpakkx</span></span></code></pre></div><p>keys.txtを覗くと秘密鍵と公開鍵が格納されていると思います。大文字が秘密鍵で、小文字が公開鍵です。</p><h3 id="設定等はなくunixスタイルのcomposabilityがある" tabindex="-1">設定等はなくUNIXスタイルのcomposabilityがある <a class="header-anchor" href="#設定等はなくunixスタイルのcomposabilityがある" aria-label="Permalink to &quot;設定等はなくUNIXスタイルのcomposabilityがある&quot;">​</a></h3><p>ageは設定やConfigファイルがありません。入力ファイルと鍵ファイルだけでプログラムを動かすことができます。 他のコマンドと組み合わせることで標準入出力で暗号化、復号化もできますね。</p><h2 id="ageを活用した他のツール" tabindex="-1">ageを活用した他のツール <a class="header-anchor" href="#ageを活用した他のツール" aria-label="Permalink to &quot;ageを活用した他のツール&quot;">​</a></h2><p>もしageについて興味が湧いた方がいれば、こちらもチェックしてみてください。 ageを用いた様々なプログラム、プラグイン、age自体の実装などが見れます。</p><p><a href="https://github.com/FiloSottile/awesome-age" target="_blank" rel="noreferrer">https://github.com/FiloSottile/awesome-age</a></p><p>例えば私も使っている<a href="https://github.com/ryantm/agenix" target="_blank" rel="noreferrer">agenix</a>というツールはNixOSで秘匿されたデータを扱うことを可能にしています。 NixOSではOSに関わる設定ファイルをすべて平文で<code>/nix/store</code>に保存する方法を採用しており、NixOSの設定ファイルをGitHubにアップロードする際には重要なデータを公開したくはありません。 そこで、agenixはマシンのrootアカウントのssh鍵を使ってageで暗号化さã
61‚ŒãŸãƒ•ァイルをnix,gitで管理する方法を採用しています。 起動時にagenixによりrootのSSH鍵を使って復号化されたファイルがファイルシステムに配置されます。 こうすることでgithubのtokenなどの機密情報を遠慮なく暗号化された状態でGitHubに投稿できます。</p><h2 id="ageを流行らせるために-自分の感想" tabindex="-1">ageを流行らせるために!(自分の感想) <a class="header-anchor" href="#ageを流行らせるために-自分の感想" aria-label="Permalink to &quot;ageを流行らせるために!(自分の感想)&quot;">​</a></h2><p>個人的にはageは数あるファイルの暗号化の方法の中でもかなり簡単な気がしています。 暗号化のアルゴリズムについてもage側でよろしく決めてもらっているので選ぶ必要がないというのが利用者からして(誰かに使ってもらう際にも)便利ですね。</p><p>手法としては問題ない気がするので後はUIを整えてあげると使ってくれる人が増えてくれるのではないかと思っています。 誰かそれぞれのプラットフォームで使いやすいUI作ってくれないかな〜。(アドレス帳+ファイルをドラッグ・アンド・ドロップできれば良い気がする。)</p><p>暇なときに作ってみるか?</p></div></div></main><footer class="VPDocFooter" data-v-39a288b8 data-v-e257564d><!--[--><!--]--><div class="edit-info" data-v-e257564d><div class="edit-link" data-v-e257564d><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/xd-tech/linux-blog/edit/main/page/post/age.md" target="_blank" rel="noreferrer" data-v-e257564d><!--[--><span class="vpi-square-pen edit-link-icon" data-v-e257564d></span> Edit this page<!--]--></a></div><div class="last-updated" data-v-e257564d><p class="VPLastUpdated" data-v-e257564d data-v-e98dd255>Last updated: <time datetime="2025-07-16T05:47:33.000Z" data-v-e98dd255></time></p></div></div><!----></footer><!--[--><!--[--><!--[--><div data-v-9ec66795><div class="info-container" data-v-9ec66795><img src="/imgs/pineapplehunter.png" alt="profile picture" id="profileimg" data-v-9ec66795><div class="info-texts" data-v-9ec66795><div id="username" data-v-9ec66795>Pineapplehunter</div><div data-v-9ec66795><span id="bio" data-v-9ec66795>農工大生のLinux好きの人です。</span></div><div data-v-9ec66795><a href="#" data-v-9ec66795>more info</a></div></div></div></div><!--]--><!--]--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
62    
62<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"CoiKsOzM\",\"post_2020akeome.md\":\"fiG9MH7i\",\"post_age.md\":\"CK70qJz5\",\"post_arch-vivado.md\":\"Q7ldb1Tr\",\"post_audio_desktop.md\":\"ZmYVHapo\",\"post_beatoraja-on-linux.md\":\"IMLlG8xo\",\"post_bms-on-linux.md\":\"BOh9G9lV\",\"post_brave.md\":\"BDbIsnLk\",\"post_change-gcc.md\":\"9FF6pJSg\",\"post_clang-tidy.md\":\"BuWfroeH\",\"post_customize_distro.md\":\"C2RltTgQ\",\"post_dataset.md\":\"_Ygps7BK\",\"post_entr.md\":\"Ce_-RooW\",\"post_felica.md\":\"C5MRquCv\",\"post_foldername.md\":\"C-sJcoPR\",\"post_font-ligature.md\":\"CVsT1IJb\",\"post_gitgit.md\":\"DBiWabS4\",\"post_gpp-on-windows.md\":\"Ca-qUajb\",\"post_how-to-use-bash.md\":\"D3ufis_e\",\"post_i3_battery.md\":\"Cf8wtdyP\",\"post_i3setting.md\":\"CGXIcIAs\",\"post_i3wm-commands.md\":\"C_kZJucQ\",\"post_index.md\":\"WRKHO-Tz\",\"post_install-clang.md\":\"C4RhyXsA\",\"post_japanize-matplotlib.md\":\"CgxPvDA_\",\"post_julia-openblas-error.md\":\"BSDMSHAa\",\"post_lets-oss.md\":\"B9sJIFJr\",\"post_light.md\":\"CGEVWewk\",\"post_maas-japan.md\":\"D3OgmtVA\",\"post_make.md\":\"DlTYKEhg\",\"post_markdowndocs.md\":\"DMfGyYIB\",\"post_mozc-autostart.md\":\"BYy_EbpF\",\"post_nix-cross-compile.md\":\"BlnARFHM\",\"post_nix-develop.md\":\"Abo6cJcV\",\"post_nvm-node-install.md\":\"CNxJJJox\",\"post_office.md\":\"DdVD_L0_\",\"post_python-dev-2020.md\":\"BpVXd0jY\",\"post_sudo-setuid.md\":\"fUpUil6U\",\"post_sushida.md\":\"CQGRU-kE\",\"post_systemd-startup.md\":\"C8Mz2GRD\",\"post_taberi-.md\":\"XU_Hwa1B\",\"post_tectonic.md\":\"pGYzaCqN\",\"post_usb_format.md\":\"CXdvkVeg\",\"post_wacom2mac.md\":\"BIDSMrnT\",\"post_win-virt-nixos.md\":\"BGFJqRgc\",\"post_ybacklight.md\":\"TzTX09ji\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"学生たちの技術ブログ\",\"description\":\"学生たちが技術について話しています\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"ホーム\",\"link\":\"/\"},{\"text\":\"投稿\",\"link\":\"/post/\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/xd-tech/linux-blog\"}],\"search\":{\"provider\":\"local\"},\"aside\":\"left\",\"editLink\":{\"pattern\":\"https://github.com/xd-tech/linux-blog/edit/main/page/:path\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
62
63    
64  </body>
65</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.