ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

picoCTFでMod 26といた

はじめに

気になってた picoCTF をはじめてみた 手始めにいくつか問題といたんだけどcryptoの1問め?のMod 26がおもしろかったのでメモ

こういうプログラムパズルみたいなのめっちゃ好きなんだよな

ちなみにネタバレを含むので自分で解きたい人はブラウザバック(死語)してください

Mod 26の問題

Cryptography can be easy, do you know what ROT13 is? cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}

解説

というわけで文字をずらしましょう。picoCTFはflagの形式が picoCTF{XXX} の形式になるっぽい。先頭の cvpbPGS はずらすと picoCTF となるのでやはりそのとおりにやれば良いっぽい

素朴にガーッとかいて実行

package main

import "fmt"

func main() {
    str := "cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}"
    fmt.Println(rot13(str))
}

var lower = "abcdefghijklmnopqrstuvwxyz"
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

func rot13(str string) string {
    var result string
    for _, v := range str {
        char := v
        if v >= 'A' && v <= 'Z' {
            alphabetIdx := int((v - 'A' + 13) % 26)
            char = rune(upper[alphabetIdx])
        }
        if v >= 'a' && v <= 'z' {
            alphabetIdx := int((v - 'a' + 13) % 26)
            char = rune(lower[alphabetIdx])
        }
        result += string(char)
    }
    return result
}

実行すると picoCTF{next_time_I'll_try_2_rounds_of_rot13_hWqFsgzu} が得られる。
この値を入力すると問題はクリアです(ちなみに末尾の乱数っぽいのは回答者ごとに異なるっぽい)

この文章も遊び心があって、つぎはこの文字を2回rot13にかけてごらん?といってるんですが2回実行すると26 mod 26は0なのでもとに戻ります。(ボケッとしてて実際に2回やって同じやんけガッハッハとなった)