AESについて

0.前書き

ゼミで「AESについて」という大味なタイトルで輪講をしました。
頑張ったのにゼミ内だけで済ませるのはもったいない気がしたのでそこで使用した資料を上げておこうと思います。

いつも書いている前書きは最後に入れてます。

1.AESとは

www.slideshare.net

1.1.参考文献及び動画など

[暗号入門] 実装して理解する AES - YouTube
-日本語の文献が非常に少ない中、詳細な説明と実装しながらの解説が大変参考になりました。感謝しかありません。ほんとに。

C#でAES暗号化アルゴリズムを外部ライブラリに一切頼らず完全実装してみた - Qiita
-スーパー中学生のスーパー記事です。すごい、未来は明るい。プログラムから処理内容を理解したいときにかなり読みました。感謝です。

AESを理解する - Qiita
-日本語でここまでしっかりとした詳細な解説を書かれている記事はこれだけだと思います、言い回しやわからないことがあったらここを読んでいました。正直輪講なのに本よりこっち読んでました、先生ごめんなさい、書いてくれた方、ありがとうございます...

その他コメントを書くと長くなるのでコメントは省略させていただきますが、以下の論文や記事にも大変助けられました。世の中のネットに所感や解説をあげてくれている人間に足を向けて寝られません。

共通鍵ブロック暗号の変遷(なぜかタイトルの埋め込みがうまくいかない)
https://www.risk.tsukuba.ac.jp/pdf/group-work2005/2005group-4-resume.pdf

AES (Rijndael) の MixColumns を理解する | 晴耕雨読

また、スライド内で紹介している記事もありますのでそちらも是非ご参照ください。

2.近況報告

お久しぶり過ぎます、Sorasukeです。
毎週更新するとか言っといて全然更新してませんでした。

この1か月くらい、くっっっっっっっっそ忙しい毎日を過ごしておりました。

家に帰ってからパソコンや教材と向き合っていて全くゲームする時間もなく、月頭から教習も始まりまして、この1か月くらいは学校かバイト先か教習か、家にいるときはずっとゼミの輪講資料を作成していた、といった感じです。
なんとかゼミの輪講も終わり、教習も少し落ち着いてきて、バイトも少し仕事を減らして頂いてるので記事を書く時間ができました。

あ、無事インターンも決まりました。1社は何度かプロコンなどでお話したことのある企業様で、もう1社様は正直受かると思ってなかった大手ESサイトを運営している企業様です。詳細はいつか話せればなと思います、許可もとらなきゃですね。

一般的にも広く普及しているAESですが、その構造や処理の内容について理解されている方は日本語の文献の少なさからあまり居ないのかな、と思いました。今回はゼミでの発表用に作成した資料を貼って終わりとさせていただきますが、何かご質問等ありましたらコメント頂けたら返すかもしれません。

また、今回初めてSlideShareを埋め込んでみたのですが、見づらいと自分で思ったら何か変えるかもしれません。

それでは今日は疲れてるので早いですがこの辺で。では。

スパニングツリー/STPとは

f:id:Tsunamayomayo:20210610233252p:plain

1.まえがき

どうもです、Sorasukeです。
テストが終わり、ようやく色々な事が落ち着いたと思えば新しくやる事が増えたりとなかなかに忙しい毎日を送っています。
先々週あたりで書こうと思ってたんですがなかなか書く時間が取れなかった内容がいくつかありますので、それらについてを今週は何個か上げようと思います。
今回はSTPことスパニングツリープロトコルです。

2.事前知識

スパニングツリーは、スイッチを使って経路冗長化する際に発生するループの発生を抑えるものです。

経路冗長化を行うと、一般にブロードキャストストームというものが発生します。
ネットワーク機器は通常、ブロードキャスト通信というものを一定期間ごとに自動で行っています。これは、ブロードキャストアドレスというアドレスを使用して同一LAN上の全てのノードにデータを送る通信です。

一般にブロードキャスト通信はARPDHCP、ルーティングアップデートパケットの通信などで行われています。一度WireSharkを使ったことがある方は見たことがあるかもしれません。

ブロードキャスト通信は通常すべてのネットワーク機器がフレームを受信した時点で伝送が終了するのですが、冗長化したネットワークでネットワークが円環状になっていると延々ブロードキャスト通信を横に投げてしまうので、帯域を圧迫して通信のほとんどがブロードキャスト通信で圧迫され、他の通信ができなくなる、といったことが発生します。
はい、これをブロードキャストストーム、と呼びます。

これを予防するための機能がスパニングツリーです。

3.スパニングツリーとは

以下のように経路冗長化したネットワークがあるとします。
f:id:Tsunamayomayo:20210610225314p:plain

このネットワークの経路を、以下のように一部遮断します。
この遮断したポートをブロッキングポートと呼びます。
f:id:Tsunamayomayo:20210610225501p:plain

そうすることで、以下のようなツリー構成になります。
これにより、物理的には円環状に構成されたネットワークが論理的にはツリー構成となっているため、ブロキャスストームは発生しなくなります。 f:id:Tsunamayomayo:20210610225639p:plain

ちなみにですが、ここで上のルートに障害が起きた場合は自動で上のルートを遮断し、下側のルートを使って通信を行うように経路が切り替わります。
このようなツリー型の構成ではトップのネットワーク機器をルートブリッジなどと呼んだりします。

4.ルートブリッジの決め方

先ほど例を上げたネットワークではルートブリッジが分かりやすかったと思いますが、実際には複雑なネットワークが絡み合っており、想像するのが難しいと思います。

そこでどのようにルートブリッジが決められているかを知ることで、どのようなネットワークでもルートブリッジが分かるようになりましょう。

ルートブリッジは、ブリッジIDを使って計算されます。
計算には、プライオリティとMACアドレスの二つの数字が使用されます。
このブリッジIDが最も小さい値のスイッチがルートブリッジとして設定され、ツリー構造のトップになります。
f:id:Tsunamayomayo:20210610230557p:plain

このプライオリティは手動で設定することができます。

5.プライオリティの設定方法

STPの設定に必要なVLANやtrunkの設定については省略します。
最初からの設定が気になる、パケトレで実践してみたいという方は、以下のサイトを参考にするなどしてください。
peace3110.oops.jp

Switch>enable
Switch#conf t
Switch(config)#spanning-tree vlan 10 priority 8192
Switch(config)#end
↓設定の確認
Switch#show spanning-tree vlan 10

6.BPDU

ここは少し応用編というか、ちょっと難しいところです。
先ほど障害発生時に自動でうんぬんという話を書きました。
この処理はBPDUというフレームによって行われています。
このBPDUは色々な要素を使用しています。
全部書くと大変なので、いくつか抜粋して紹介します。

RootID

ルートブリッジのブリッジIDです。
8byteのデータサイズです。
ルートブリッジやブロッキングポートの判別に使用されます。

BridgeID

スイッチ自身のブリッジIDです。
同じく8byteのデータサイズです。
ルートブリッジやブロッキングポートの判別に使用されます。

Max Age

BPDUの最大保持時間です。
2byteのデータサイズです。
デフォルトの設定値である20sを超えてもBPDUが返ってこない場合は障害が発生したと認識されます。

その他

全体像は以下のサイトを参考にしてください。
www.infraexpert.com

6.おわりに

バイト先でSTPについての講師をやることがあったので、そのときに勉強した内容を折角なのでまとめてみました。
ご不明点などあればコメントいただければ返すかもしれません。
なかなか書けていませんでしたが、やっぱり書くと自分の中でスッとまとまる感覚がしていいですね、勉強会を開催したくなる…とまではいきませんがLT会などで人に話したくなる気持ちは少しわかったかもしれません。
それでは、また。

Ansibleに入門したので勉強したノートをまとめてみる

まえがき

APEXやってレポート書いてバイトしていたらいつの間にか2週間経ってました。
…初回で週1とか言ってたのにね
バイト先でAnsibleを使った勉強会の開催をすることになり、そこで使う資料を作り終えたので、そこから要所要所を抜粋しつつ自分の言葉で落とし込むためにまとめていこうと思います。

Ansibleとは

サーバーやネットワーク機器に対して、あらかじめ用意した設定ファイル(Playbookと呼ぶ)に従って自動で設定やインストールなどを行う構成管理ツール。

Ansibleや設定ファイルを用意する必要はありますが、一度用意してしまえば使いまわすこともできるので、多くのサーバーの設定を行いたいときなどに便利です。

余談

ちなみにこういった手動ではなく自動で構成管理を行うような行為をInfrastructure as Codeというそうです。最近流行ってるらしいですね、あんまり聞いたことないですが業界によるんでしょうか?

IaCについては以下が分かりやすかったです。
IaC(Infrastructure as Code)とは

Ansibleのインストール

AnsibleはPythonを使ったツールです。
dnfでもインストールできるらしいですが、自分はできなかったのでpip3でインストールしました。  

インストール手順

$dnf install python3
$python3 -V
Python 3.6.8
$pip3 install ansible
$ansible --version

Playbookとは

Playbookは、ターゲットノードに対する設計書手順のことをいいます。
AnsibleではこのPlaybookをYAMLという書式で記述することになっているのですが、このYAMLの書き方が特殊でちょっとめんどくさいです。

YAMLとは

YAMLが特徴的なのはインデントです。
このインデントをスペース空白2つ分で表します。
注意なのが、
・記述にタブを使うことができないこと
・インデントが間違ってるとエラーを吐くこと
ここが書くときにスペース連打する必要があって面倒です。

実際に使ってみる

Playbookを書いてみる

※␣が全角になっちゃうのでレイアウトぐちゃぐちゃですが半角スペースです

$vi ansible-test.yml

-␣name: Ansible-test
␣␣hosts: localhost
␣␣vars:
␣␣␣␣ansible_become: yes
␣␣␣␣ansible_become_method: sudo
␣␣tasks:
␣␣name: change hostname
␣␣-␣hostname:
␣␣␣␣␣␣name: Ansible-user

文法チェック

Ansibleには文法チェック機能が付いています。
サーバーの変更はシステムに大きな変更を与えることがあるので、実行前に間違った書き方がないかどうかを確認しておきましょう。

$ansible-playbook -i hosts ansible-test.yml --syntax-check
playbook: ansible-test.yml

↑問題がなければ上記のように何も出てこない

テスト実行

実際にどういった挙動が起きるのかを確認することができます。
ここでは実際の実行結果が出力されますが、ターゲットノードには反映されてないので注意です。
PLAY RECAPを見て、すべてokになっていることを確認しましょう。

[admin@tsuna ansible]$ ansible-playbook ansible-test.yml --ask-pass

SSH password:(パスワードを入力)
PLAY [Ansible-test] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [change hostname] *********************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

本番実行

ここまでクリアしていれば、あとは実行するだけです。

[admin@tsuna ansible]$ansible-playbook hosts ansible-test.yml --ask-pass

(checkと一緒なので省略)

確認

ホストネームが変わっていることを確認します。

$hostname

Ansible-user

自分ではなく対象サーバーに実行する

今回の環境

  • ホスト:192.168.100.3
  • ゲスト:192.168.56.1

Playbook

[root@tsuna ansible]# vi ansible-test2.yml

-␣name: install something
␣␣hosts: server
␣␣vars:
␣␣␣␣ansible_become: yes
␣␣␣␣ansible_become_method: sudo
␣␣tasks:
␣␣-␣name: Install Vsftpd
␣␣␣␣yum:
␣␣␣␣␣␣name: vsftpd
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Ftp
␣␣␣␣yum:
␣␣␣␣␣␣name: ftp
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Chrony
␣␣␣␣yum:
␣␣␣␣␣␣name: chrony
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Httpd
␣␣␣␣yum:
␣␣␣␣␣␣name: httpd
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Php
␣␣␣␣yum:
␣␣␣␣␣␣name: php
␣␣␣␣␣␣state: latest
␣␣-␣name: Install mariadb-server
␣␣␣␣yum:
␣␣␣␣␣␣name: mariadb-server
␣␣␣␣␣␣state: latest
␣␣-␣name: Install Php-mysqlnd ␣␣␣␣yum:
␣␣␣␣␣␣name: php-mysqlnd
␣␣␣␣␣␣state: latest

インベントリ

インベントリとは

Playbookをどのホストノードに対して実行するのかを記述したファイルのことです。
IPアドレスやユーザネーム、パスワードなどを記述します。
自分に対してのときは書かない方がすっきりするので書きませんでしたが、ターゲットノードが存在するときにはごちゃつくので書くことをおすすめします。

インベントリ

[root@tsuna ansible]# vi hosts

[server]
192.168.56.1 ansible-user=root

ちなみに

AnsibleはSSHでターゲットノードの設定を行うのですが、一般的にはパスワード認証ではなく公開鍵認証を使います。

チェック、実行

$ansible-playbook -i hosts ansible-test2.yml --private-key="~/.ssh/id_rsa"

1人用とやってることは同じなので省略します。
公開鍵認証を行う場合にはprivate-keyオプションをつけて秘密鍵のパスを指定してください。

できましたでしょうか?
エラーが起きた場合は以下のサイトなどを参考にしてください。AnsibleはCentOSやその人の環境次第で色々なエラーが起きます。
もともと「空のサーバーに対する環境構築ソフト」、という前提で開発されたものなのかもしれませんね。

curecode.jp

qiita.com

おわり

以上です
久々にMarkdown書きましたがやっぱりちょっと書きづらいですね
公開鍵認証については今回省きましたが、理解しているとAnsibleについても理解しやすくなると思います
ちょっとサボってたぶん長めに書きました、ちなみにテスト実行はしてないので間違ってることもあるかもしれません(コメントで訂正くれたら直します ) Ansibleを募集要項に書いてある会社もそこそこあったので、慣れておくと多少有利に働くこともあるかもしれないですね
自分はインターン2社落ちてるのでなんともいえないですが…
では、今回はここで。

2021/05/20追記

なんかもやっとしてたので確認したらエラーが凄かったです、すみません。訂正して色々修正、追記しました。
何を言いたいのかがぐちゃってたので、自分に対してと外に対してで分けることにしました、少しでもわかりやすくなってたら嬉しいです。

参考

ansibleでLinuxユーザーの作成と鍵認証を設定する - Qiita

Amazon.co.jp: Ansible構築・運用ガイドブック インフラ自動化のための現場のノウハウ (Compass Books) eBook: 八木澤 健人: Kindleストア

Cisco AnyConnect Secure Mobility ClientでVPNが張れない

今日あった備忘録です。

AnyConnectでVPNを張る際、他のユーザがログインしているとVPNを張れない(以下のエラーが発生する)のですが、その解決に30分くらいかかったので解決法を置いておきます。

【エラーメッセージ】

AnyConnect profile settings mandate a single local user, but multiple local users are currently logged
into your computer. A VPN connection will be not be established

 

【解決方法】

ほかのWindowsユーザをログアウトさせる

 

【感想】

ユーザがどーのこーのって書いてあるの、正直なんのユーザかよくわからなかったんですが、Windowsユーザのことでした。紛らわしい

とはいっても、"into your computer"って言ってるんだからそりゃそうだって感じもしますけどね、エラー起きてるときって視野狭くなりがちだったり良く分からないこと考えがちなので気付けなくてもしょうがないです。

今日はいつかやる気がしていたルータとスイッチを落としたりもして集中力がなかった気がする、気をつけよう

シフト暗号の総当たり

まえがき

どうもです。お久しぶりです。

インターンや就職に提出するための技術的な話をする場が欲しいと思い、今日から定期的になんかしら書いていこうと思います。(ついでにMarkdownも慣れたい)

初回はシーザー及びシフト暗号です。(配属された研究室が暗号系だったので)

シーザー暗号

アルファベットで表記されたある文字列(以降平文)を3文字ずらすことで暗号化する。

例)

平文:abcdefg

暗号:DEFGHI

 

有名な奴です。ゲームやアニメなんかでも使われることがありますね。

実装も簡単ですが、有名なだけに突破もされやすいです。

シフト暗号

シーザー暗号の改良版。ずらす値を固定するのではなく、任意の数とする方法。

例)

平文:abcdefg

暗号:BCDEFGH

実装

総当たりでの復号の実装です。

#include <iostream>
#include <bits/stdc++.h>
#include <string>

using namespace std;

int main(void){
    string s;
    cout << "入力文字列:";
    cin >> s;
    cout << "復号文字列:" << endl;
    for(int i=0;i<26;i++){
        for(int j=0;j<s.size();j++){
            cout << char('a'+(s.at(j)-'A'+i)%26);
        }
        cout << endl;
    }
}

実行結果

f:id:Tsunamayomayo:20210430183058j:plain

解説

任意の文字列sについて、i文字ずつずらして表示するプログラムです。

アルファベットが26文字なのでそれを26回for文で回して総当たりします。

多分一番わかりづらいであろう以下の1行についてだけ解説します。

cout << char('a'+(s.at(j) - 'A' + i)%26);

s.at(j) - 'A' + i

暗号化された文字列のj文字目[s.at(j)]が「A」から何文字ずれているかを計算し、ずらす分の数字iを加算します。


'a'+(s.at(j) - 'A' + i)%26

加算した対象文字を26で割り、その余り分を'a'に加算することで、i文字分ずらして表示しています。


文字コードがわからん、って人はAtCoder あたりを見てください。

今回の場合、意味を成した文字列になっているのは「helloworld」、よって暗号化に使われた鍵は、ずれた文字数である「4」ですね。

あとがき

今回書くにあたって参考にした本:暗号技術のすべて

平文を小文字、暗号を大文字で書くとかって決まりがあるの、初めて知りました。そういやLinuxでauthorized_keysみたとき全部大文字だったなーなんてことを思い返しながら読んでました。

あとMarkdown、ちゃんと書くのは初めてだったんですが、正直よくわからんまま書き終えました。

まあこれから慣れていくでしょう。週に1本出せたらいいかなって感じのペースで更新していこうと思います。

iPhoneの色々な設定の話

先日、寝れなかったのでiPhoneの標準アプリ、設定を端から端までいろいろ見て、調べてみるってことをやっていました

そこでいくつか気になった設定があるのでご紹介します

 

1.睡眠モード

f:id:Tsunamayomayo:20201117004655p:image

就寝時間を設定したり起床時間を設定することで自動でアラームをかけたり、おやすみモードを設定してくれたり、画像のようにロック画面が簡素になったりします

ふとした時に(そろそろ寝なきゃ)とは思うのでいいかもしれない

 

2.サウンド認識

f:id:Tsunamayomayo:20201117005018p:image

特定の音をiPhoneが拾った時、通知してくれるものです

音には炎の音(火事防止)、水が流れてる音(流しっぱなし防止)、クラクション(事故防止)など、10何種類かあって面白かったです。

実際に水道で試してみたところあまり検知精度は良くなさそうな感じでした

デフォルトはオフになってます

 

3.背面タップ

なんかTwitterでもバズっていましたが、背面をダブルタップ、又はトリプルタップすることでスクリーンショットやアプリを開くなどといったショートカットが行える機能です

私は割と厚めの手帳型ケースを使っているのですが、それでもしっかりと反応してくれました。すごい。

ただ私は音楽聴いてる時無意味に背面をタップしてリズムを取ったりすることがあるのでそういう人には向いてないかもしれませんね

(実際今は設定きってます)

 

4.トラッキング

f:id:Tsunamayomayo:20201117005537p:image

これ、Twitterで話題になりそうなもんですけどね。

アプリがユーザーがどんなアプリを使っているか、どんなWebサイトを見ているかのデータを求めてきたときにそのデータを渡すことで広告のカスタマイズとかが行われるものです。

アプリや検索エンジン内で広告のカスタムをオフにすると多分この機能を切っているのかな?

これを切ってからアダルト気味な広告や変なゲームの広告が目に見えて減りました(多分)

洋服とか保険なんかが若干増えました

ただし他社よりお金をかけているようなゲームアプリの広告などは結局多く表示されたままです

アダルトな広告は釣ろうとしてるおっさんの姿が目に浮かんで不快だから表示しないで欲しいんですけどね

仕方ない

 

 

とまあこんな感じで暇を潰していました

結局睡眠モードつけても寝れないのでこんなしょうもないことをつらつらと書いてしまっているんですけどね

ではまた

夢の話

どうも、今回は夢の話です

もう二度見ているので何かあるのかなぁなんて思ってとりあえず形に残しておこうと思います

以下夢

 

修学旅行、私たちはバスでどこかわからない施設に連れていかれる。

そこで教員が居ないので探していると、放送で『今から出される料理を全て食え。』とだけ言われる。一人一食分、大したことのない量だ。

しかし大したことない量の料理、それが何度も、何度も出てくる。合計で7回。

絶望しているとまた放送で教員の声がする

『食わなきゃ全員連帯で退学』

女子や少食の男子はもちろん食べきれない。そうじゃない人たちでも苦しんでいた。そんな中、一人が食い終わると、追加で課題が与えられる。『絵を描け。』と言われ、何種類かのテーマだけ与えられる。無茶苦茶だ。

なんとかみんなで協力して食事を平らげたところで、周りを見渡すと何人かが居なくなっていた。見るとドアがあり、その先にいくとリタイアができるようだ。しかしギブアップするとバスには乗れない。周りのみんなに迷惑をかけたくない、こんなに食べれない、死んでしまう、そんな気持ちに負けた人が諦めてどこだか分からないこの場所で死ぬことを決意した事を悟る。

(ここで色々あったような気がするが、夢なので忘れた、割愛)

時刻は夜になり、日を跨ぎ、朝になった。

やがて全ての課題を終えて8名程度の学生だけが息も絶え絶えになりながら残っていた。

そこで終了の放送が流れ、私たちは『講評』を受けた。 

『見る価値もない』『終わらせた気概は認めるが終わらせるために早く描きすぎだ』

など様々な罵倒の声を聞きながら、ただ一人、終わる直前でリタイアした生徒の絵が

『素晴らしい』と言われた。『これを描いた者はどこに行った?』と聞かれたりしたが、私たちは何も言わなかった。

帰りのバスに乗ると、来る時は「楽しみだね」「何するんだろうね」などといった会話をしていたのに、人数は半分になり、みんな暗い顔をしている。

何かを教員がずっと話しかけていたが、何も聞くことができなかった。

 

そこで今回も、前回も夢が醒めた。

夢、終わり

 

深層心理を写しているのか。

俺としてはかなり好みなストーリーなので、そういったものを無意識に構築しているのか。

何かを暗示しているのか。

意味なんてないんでしょうが、少し深読みして夢を楽しんだという私が夢を見たというだけのつまらない話でした。

 

 

22時半なんて中途半端に起きてしまった。

眠るにも眠れなさそうだし、これからどうしよう。