Caesar暗号
久々にVIPの問題解いてみた。
http://vipprog.net/wiki/exercise.html#h54a0395
途中手こずったけどなんとか。
ただ、これがもっと大きな暗号文に適用可能かは不明。
計算量そんなでもないかな?
#include <iostream> #include <string> #include <algorithm> #include <cmath> using namespace std; string map="abcdefghijklmnopqrstuvwxyz .,-"; int add(char c) { for (int i=0; i<30; i++) { if (map[i]==c) return i; } return -1; } char sum(char c, int i) { int state=add(c); state-=i; if (state<0) state+=30; else if (state>=30) state-=30; return map[state]; } int main() { string uq="qdq-gi.q-a ziatmxxitmdqibtqi-ustbi ri.qmoqrcxi.qbubu zir -ibtqi-qp-qaai ripmymsqkir -ibtqi-qy dmxi ri.cnxuoi rruoumxakir -ibtqiqzmobyqzbkii-q.qmxi -imyqzpyqzbi rixmeaki -puzmzoqai -i-qscxmbu zaimzpir -i btq-iymbbq-a;iz -iatmxximzgi.q-a zinqiuzimzgiemgipuao-uyuzmbqpimsmuzabir -ia. za -uzsiacotiimi.qbubu zj"; string kstr="person"; int key=0; int i; for (i=0; i<uq.length()-5; i++) { bool flag = true; key=add(uq[i]) - add(kstr[0]); for (int j=1;j<5;j++) { if (add(uq[i+j]) == -1||kstr[j] != sum(uq[i+j],key)) { flag = false; break; } } if (flag) break; } for (i=0; i<uq.length(); i++) { if (uq[i]==';') continue; uq[i]=sum(uq[i],key); } cout<<uq<<endl; }
なぜかkeyを見つけるループないの条件文を文字のアドレスでたどってたらいくらやっても正解に辿りつかなかった。
上のように修正して一応は解けたけど、やっぱり間違えてた原因がいまいち不明。
追記: いつもなんかのアドレスを調べる関数の命名に困るんですけど命名規則的にはどうなんでしょう?