MAKING PAPER CRYPTOGRAPHY TOOLSをSplunkで


MAKING PAPER CRYPTOGRAPHY TOOLS
をみていて、紙じゃなくてSplunkでやってみようと思って作りました。

Splunk Answersで直前に文字列Shiftをいろいろとやっていたせいもあります。

code

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>

画面

解説

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

まとめ

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

ciphercypherと書いていた名残が残っています