投稿

2023の投稿を表示しています

DockerとPodman

DockerとかPodman とか仮想っぽいものをつついてみる。 Linuxのカーネルの機能で複数環境を切り盛りする系のいろいろ Dockerさん入れてみた Docker Compose 2種類あるよ というわけで進化も速いとドキュメントも古いぞ、ということになったり。 継ぎ接ぎだらけで調べてみたりしている。 どのツールが残ってるのかわからんな。Machineってなに、どこに機能移行したの。 RaspberryPi に入れてみたり、Windows に Docker Desktop 入れてみたり。 Minecraft の バニラとかPaperMeのとか入れてみたらそれなりに動いたり動かなかったり癖ありな感じはする。 最近のJREの作り方も把握した。 これでイメージファイル小さくはできるけどそこそこ大きいのは大きい。ディスクがあればメモリー消費するのでもないからいいか。 Podmanの本が出ていた? ようなので半額ポイントバック買い。Dockerよりいろいろできそう。Podman Desktopの1.5も出てるっぽいので入れてみるとDockerと併用できる。どっちが走ってるんだかわからない状態。 Podman Desktop (Windows, Mac, Linux) Podman イン・アクション (電子書籍版) Docker 互換な上でGoogleのKubeなんとか寄りのことなどもできるとか。 RaspberryPiにもDockerを消し去って入れてみる。v3.0系しか入らなかったのでdocker compose 互換がない。 test版でバージョンあげてみようとして失敗。RaspberryPi OS を最新版で入れ直し。Podman v4.3.1 くらいがそのまま入ったよ。 podman-compose が使えるようになっていた。docker.io が省略できない以外はだいたい同じでも動くのかな。imageの残り方がなんか違う気もする。 dockerでbuild するのとdocker composeでbuildするのと環境変数の指定が違うのかどうなのか。パラメータの多いdocker / podman 単体で使いたくないので苦戦。 dockerとpodman、基本は同じなのでそれ以降行かないならどっち使ってもいい気がした。 古い環境はdockerの方が入れやすそ

Lenovo Tablet P11 Pro (2nd) でサブディスプレイ

製品案内ではMiracastでサブディスプレイにできる、とか書かれていたLenovo Tablet P11 Pro (2nd) だが、方法がわからず。 設定のどこかでできるっぽい記述もあるが、今はそんな項目もなく。 結局Lenovo Freestyle というアプリでサブディスプレイ化することが判明。 同じアカウントで設定して共有、あっさりできたが何か違わないか?

AES高速化をもう少し

割と最速だったJavaで作ったAES実装もJDKのAESがOpenSSLかなにかのハードウェア実装を使うようになったおかげで数倍の差がついてしまった。KCyper-2がまだよくわからないのでAESをつついてみたりPKIの方を見たり。 Intel CPU にはAES NI というAESの計算補助的なものがあり、AMD Ryzen 2600X でも使えるようになっていて速くなる。OpenSSLが対応しているのでJavaでもOpenSSL経由でいつのまにか使えるようになっていて、高速処理ができている。 AES NIもたぶん途中の計算をまとめられるだけまとめてあらかじめ計算しておき配列に押し込んで高速化をする手法。 ソフト的にも高速化していくと同じような実装になって普通に解説されているような実装の数十倍はやくなる。 特に競ってみようというわけではないが、いろいろなハッシュや暗号を実装してみるなかでAESも乗せてみたついでに高速化もしてみたというのが前回くらい。32bitまとめるところで高速化ができたが、64bitにしてみたらもう少し速くなった気がするのでそのあたりで止めておいた。 decode側は最適化をどうやればいいのかと思っていたら、計算順を変えることでencodeと同じように最適化できることもわかったので割と高速な方にすることはできた。encodeと同じように64bit化したらencode以上に速くなった。  AES-CBC Ryzen 7 5800X で 初期値 1400Mbps、JavaのJITが効いてくると1650Mbpsくらいまで速くなる印象。AES-NIだと初期値2500Mbpsくらいなのでかなり追いついている。AES単体だとまだまだ差は大きいが今は未計測。 元になるAESのコードが跡形もなくなってきているので、原型を留めたコードを別に残しておかないと何の参考にもならないなと。 速度比較、AES単体ではなく若干実用的なAES-CBCで比較してみることにして、JDKのコードと2倍くらいの差まで迫ることができる。ということはJDKのCBCが遅いのか。CBCで64bit演算してそのままAESに持っていくことで高速化できている感じ。JDKはそのあたりが遅い印象。 最近の主流はCBCからGCMかなんかになってきているようなので、そっちも実装したいが仕様だけ見てコード自

RSA鍵を作る

最近暗号系をいろいろ実装してみている中で PKCS #1 の RSA も必要になってきたので実装してみた。中身がわからないと使いにくいタイプ。 RSA は公開鍵暗号という形で秘密鍵、公開鍵の2つの鍵を使う。AESなどの共通鍵暗号とは違うところ。 公開鍵で暗号化、秘密鍵で復号ができるのがひとつめ。 秘密鍵で署名。公開鍵で検証。これが2つめ。  公開鍵暗号共通の特徴ではなくRSAの特徴のようなので注意。 アルゴリズム的にはガロア体と同じようなものを作って2つの状態を行き来してる感じがした。 何に使えるのか。ひととおりバイト列の暗号化などにも使えるが、速さが出ないので署名用途の方が主流で暗号化も一部用途に限定して使う場合が多い。 秘密鍵と公開鍵の中身を見ていく。 RSAは大きい数の因数分解が難しいというところから作られているので2つの素数から鍵を作る。 素数(prime)2つ(pとq)を決める。2048ビットのRSAだと1024ビットくらいの素数を2つ。今なら3072ビットくらいが最低ラインになってきているので1536ビットくらいの素数を2つ。 Java で作るのでいろいろ省略できるところは省略する。 乱数はjava.math.SecureRandom っぽいところから。安全かどうかは不明。他の要素があればいろいろ混ぜるとより安全かも。普通のRandomは安全ではない。 SecureRandom srnd = SecureRandom.getInstanceStorong(); BigInteger p = BigInteger.probablePrime( len / 2, srnd ); BigInteger q = BigInteger.probablePrime( len / 2, srnd ); これで素数2つを作ってくれるのでおまかせ。素数ではない場合もあるらしい。 modulus 素数2つを掛けたもの 変数名は n など。 BigInteger n = p.multiply(q); // n = p * q nをpとqに素因数分解するのが難しい。 次はeとdという指数(exponent)を決めていく。 eは公開指数(public exponent)、dは秘密指数(private exponent)。 e * d = 1 mod (p - 1)(q - 1)