Arduino&Processingのシリアル通信による、楽器作成
競技プログラミングやセキュリティとは異なりますが・・・
授業でやったのでメモ書き
void setup() { Serial.begin(19200); } void loop() { int val = analogRead(0); Serial.println(val); delay(250); }
・Processing
import processing.serial.*; import ddf.minim.*; import ddf.minim.signals.*; PFont myFont; Minim minim; Serial arduino; AudioOutput out; int currentTime, prevTime; int x = 250, y = 250; void setup() { size(500, 500); arduino = new Serial(this, Serial.list()[2], 19200); arduino.bufferUntil('\n'); minim = new Minim(this); out = minim.getLineOut(Minim.STEREO); prevTime = millis(); //delay(5); currentTime = millis(); } void fadeToBlack() { noStroke(); fill(0, 10); rectMode(CORNER); rect(0, 0, width, height); } void draw() { for(int r = 0; r <= 360; r++) { ellipse(x * cos(r), y * sin(r), 5, 5); fill(255, 0, 0); } fadeToBlack(); } String indata = ""; void serialEvent(Serial port) { try { indata = port.readStringUntil('\n'); if(indata != null) { indata = trim(indata); int cdsVal = Integer.parseInt(indata); /* if(cdsVal >= 700) { currentTime = millis(); if(currentTime - prevTime > 1) { out.playNote("C4"); } prevTime = currentTime; } */ // many sounds if(cdsVal >= 900) { out.playNote("A3"); x = 100; y = 100; } else if(cdsVal >= 850) { out.playNote("B4"); x = 200; y = 200; } else if(cdsVal >= 800) { out.playNote("D4"); x = 300; y = 300; } else if(cdsVal >= 750) { out.playNote("F#4"); x = 400; y = 400; } else if(cdsVal >= 700) { out.playNote("G3"); x = 500; y = 500; } } } catch(Exception e) { e.printStackTrace(); } }
写真、伝わりますでしょうか・・・
すっごい汚い上に、回路図の記法もろくに知らない無知さが露呈してしまっているのですが・・・
大きさの都合上、図形の中に文字を避けたのがいくつかあります
まぁ、こんな感じの回路を組んで、Processing, Arduino、それぞれ別のポートを選んでいただいて、cdsの上に手をかざしたりすると音が鳴ります
また、暗さによって音が変化します
書庫作りコマンド
tarコマンドについてメモ書き
//必須(どちらか) //c = create(書庫作成) //x = extract(書庫抽出) //t = test(書庫表示:lsコマンドみたいな感じで表示) //オプション //z = gzip(gzip形式の場合、圧縮及び解凍にgzipを用いる) //v = verbose(作成、抽出時にファイル一覧を出力) //f = File(作成、抽出するファイルを指定)default値=/dev/rmt0 tar czvf example.tar.gz test1.txt test2.txt //圧縮 tar xzvf example.tar.gz //解凍 tar tzvf example.tar.gz //出力
AES(Advanced Encryption Standard)
AESというのはDESに代わって新しく定められた共通鍵暗号標準です
厳しい審査の元、多くの暗号化アルゴリズムから5つが選び抜かれました
MARS, RC6, Rijndael, Serpent, Twofish
この中でもっとも優秀であったのはRijndaelで、晴れてAESに選定されました
このRijndaelは複雑な仕組み(SPN構造)で暗号化を行います
入力:128ビットとします(128~256まで32bit単位で選択)
①SubBytes
256個の換字対応表を元に、1バイトごとに変換を行います
②ShiftRows
バイト単位に規則的にごちゃまぜする。
③MixColumns
4バイトの値に対してビット演算を行う
④AddRoundKey
ラウンド鍵とXORする
以上です。疲れましたか? これ1ラウンドです(笑)
見ての通り複雑な暗号化をしていますが、実はこれには数学的構造が用いられています
それってどういうことか? 数式で表せるなら、数学で解読できちゃいます
けど、あくまでこれは可能性で今の所不可能です。
解読できちゃってたらAESとして今も使われてるわけないよね(笑)
使い捨てパッド
簡単にいうとXORを使ったランダムビット列との暗号化、かつ鍵は毎回変更、です。
なんとびっくり
ゼッタイに解読できません。
理由は、解読文の正当性を証明できないからです。
エニグマ
エニグマはドイツで開発された暗号化及び複合化を行う機械のことをいう
機械含め、暗号化及び複合化に用いられるものは以下のとおり
・国防軍鍵表(日替わり鍵)
・エニグマ(電源、キー、プラグボード、ローター1、ローター2、ローター3、反射器、ランプ)
まず、国防軍鍵表というのは、日替わり鍵が記載された表のことで、日毎に鍵が変更される。この鍵が適宜変更されるというのは、他の暗号化アルゴリズムでも用いられたりするほど効果がある
次にエニグマについて、キーというのは入力である。この入力がプラグボード、ローター123をとおり反射器で跳ね返ってランプが点灯するといった仕組み
例えば、キーはアルファベットの一覧であることが考えられ、平文をそこに打ち込む。
文字1つ1つについて、日替わり鍵によって設定されたプラグボードを通り、ローターを通っていく(ローターはキーを打つごとに回るんだけど、ローター1が回転するとローター2は1/4回転して、ローター2が回転するとローター3も1/4回転するといった連鎖的な仕組みになっている)反射器で跳ね返り、戻ってきた結果はランプに出力される。
手順:
①日替わり鍵によってプラグボードやローターの設定をする
②アルファベット3文字を決めて、それを連続させた計6文字(=通信鍵)を暗号化(昔は通信がうまくいかないことがよくあったらしくて、損失しても大丈夫なようにこうしてるみたい)。
③通信鍵によってプラグボードやローターを再設定
④平文の暗号化
⑤通信鍵+暗号文を送る
当然、受け取り側はこれの逆をするわけです
当時、エニグマは多くの解読者によって解読対象となっていたのですが、なかなかとけませんでした
ですが、レイェフスキという人が解読して、世に広めました。その後、かの有名なアラン・チューリングがエニグマ解読器を作りました
隠すことによるセキュリティがまずかったんですね
また、他ならぬ人が鍵を決めていたのもマズかったんでしょう