暗号化はユーザー空間またはカーネル空間に実装されていますか?
公開/秘密鍵のペアはカーネル空間で生成されますか?
与えられた公開鍵または与えられた秘密鍵を使用して暗号化または復号化したり、暗号化方式でファイルに署名したりするのはどうですか?
これらの操作にはどのシステムコールが使用され、秘密鍵はどのように転送/検索されますか?
私は「非対称暗号化アルゴリズムの定義」ページを見ながら時間を費やしました。https://www.kernel.org/doc/html/v4.10/crypto/api-akcipher.html しかし、どの関数が何をしているのか、パラメータと戻り値のデータ構造が何であるかはわかりません。
つまり、どの構造の要素が秘密鍵に対応していますか?
答え1
見つかった文書は主にカーネルとライブラリの開発のためのものです。暗号プリミティブは、次の目的で使用されます。ネットワークセキュリティプロトコルスタックはカーネルで実行する必要があります。あなたのようにユーザー空間インターフェース章、公開鍵暗号化はユーザー空間からアクセスできません。それでも、キーが終わる場所を心配する必要はありません(ヒント:素晴らしい不透明な__ctx
メンバーが見えますか?)。興味深い部分は提供される機能です。
Linuxの暗号化ライブラリに興味があれば、OpenSSL、グヌTLSそしてLibgcryptおそらく最も一般的な選択でしょう。まだ一つあります。比較ページウィキペディアで。主にユーザー空間で実行され、カーネルCrypto APIを使用してパフォーマンスを向上させます。
編集する:Crypto APIを使用したい場合は、__ctx
各アルゴリズムに従ってそのメンバーに含まれる内容を確認できます。たとえば、rsa.c__ctx
、メンバーがcrypto_akcipher
aを指してstruct rsa_mpi_key
を使用してこれを取得できることがわかりますrsa_get_key()
。
答え2
別の考えられる解決策は、カーネルが暗号化されたシステムコールを実行するためにバッファから読み取られるように見えるため、いくつかのコードをシステムコールレベルまでデバッグしてカーネルとインタフェースする場所を見つけることです。