MAKING PAPER CRYPTOGRAPHY TOOLSをSplunkで

[MAKING PAPER CRYPTOGRAPHY TOOLS](http://inventwithpython.com/hacking/chapter1.html)
をみていて、紙じゃなくてSplunkでやってみようと思って作りました。

[Splunk Answersで直前に文字列Shiftをいろいろ](https://community.splunk.com/t5/Splunk-Search/How-to-convert-version-number-so-the-dots-are-consistent/m-p/534408#M151016)とやっていたせいもあります。

#code


```xml:cipher_wheel.xml
<form>
  <label>cipher_wheel</label>
  <search id="bases">
    <query>| makeresults
| eval alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
| fields - _time
</query>
    <earliest>-24h@h</earliest>
    <latest>now</latest>
    <sampleRatio>1</sampleRatio>
  </search>
  <fieldset submitButton="false">
    <input type="dropdown" token="from">
      <label>初期値</label>
      <fieldForLabel>label</fieldForLabel>
      <fieldForValue>cypher</fieldForValue>
      <search>
        <query>| makeresults
        | eval cypher="A"
| eval label=cypher</query>
      </search>
    </input>
    <input type="dropdown" token="to">
      <label>変換後</label>
      <fieldForLabel>label</fieldForLabel>
      <fieldForValue>alpha</fieldForValue>
      <search base="bases">
        <query>| eval alpha=split(alpha,"")
          | mvexpand alpha
| eval label=alpha</query>
      </search>
    </input>
    <input type="text" token="planeText">
      <label>planeText</label>
    </input>
    <input type="text" token="cipherText">
      <label>cipherText</label>
    </input>
  </fieldset>
  <row>
    <panel depends="$alwayshide$">
      <table>
        <search base="bases">
          <done>
            <set token="regex_decode">$result.regex1$</set>
            <set token="regex_encode">$result.regex2$</set>
            <set token="beta">$result.beta$</set>
          </done>
          <query>| eval to="$to$"
| eval beta=substr(substr(alpha,mvfind(split(alpha,""),to)+1).alpha,0,26)
| eval regex1="y/".beta."/".alpha."/"
| eval regex2="y/".alpha."/".beta."/"</query>
        </search>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <title>cipher table</title>
        <search>
          <query>| makeresults
| eval beta="$beta$"
| eval alpha=split("ABCDEFGHIJKLMNOPQRSTUVWXYZ","")
| stats values(beta) as beta by alpha
| streamstats count
| eval beta=substr(beta,count,1)
| eval count = 1
| xyseries count alpha beta
| fields - count</query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
        </search>
        <option name="drilldown">none</option>
      </table>
    </panel>
  </row>
  <row>
    <panel>
      <table>
        <title>encode</title>
        <search>
          <query>| makeresults
| eval text="$planeText$"
| append [| makeresults
| eval text=upper("$planeText$")
| rex field=text mode=sed "$regex_encode$"]
| fields - _time</query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
        </search>
        <option name="drilldown">none</option>
      </table>
    </panel>
    <panel>
      <table>
        <title>decode</title>
        <search>
          <query>| makeresults
| eval text="$cipherText$"
| append [| makeresults
| eval text=upper("$cipherText$")
| rex field=text mode=sed "$regex_decode$"]
| fields - _time</query>
          <earliest>-24h@h</earliest>
          <latest>now</latest>
        </search>
        <option name="drilldown">none</option>
      </table>
    </panel>
  </row>
</form>
```

#画面
![cipher_wheel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/96292cd3-fb41-dafb-0dd7-536e93ff2ada.png)



#解説

- Splunkだと文字をasciiコードに変換するコマンドがないので、表から引っ張ってきた方がはやいです。
    - `eval tmp=printf("%c",６５)`のように逆はある。
- `rex` のオプション `mode=sed`の`y//`は逐一文字を変換してもらえるので、この場合に最適
    - [command reference:rex](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Rex)
- 大文字小文字を考えていないので、`upper()`を使って全部大文字にしてしまっている。
- ダッシュボードのトークンで文字列を持っていくと、このように引数として使えるので便利
    - `| rex field=text mode=sed "$regex_encode$"]`

#まとめ

Splunkのダッシュボードでちょこっとした感じで作ってみました。
`substr()`の引数が以外と忘れやすいです。`0`から始まらないし。

*cipher*を*cypher*と書いていた名残が残っています:sweat: