まえがき
RFCを見ながらMD5を実装しようかなと思ったけど、その前にGoでシーザー暗号を実装してみようかなと思ってやってみた記事です。
コード
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strings"
"time"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("文字列を入力してください: ")
scanner.Scan()
str := scanner.Text()
s := rand.NewSource(time.Now().UnixNano())
r := rand.New(s)
n := byte(r.Intn(25))
convert := caesar_cipher(str, n)
fmt.Println(str, "を", n, "文字ずらすと", convert)
}
func caesar_cipher(str string, n byte) string {
convert := make([]string, len(str))
for i := 0; i < len(str); i++ {
var b byte
if str[i] >= 'A' && str[i] <= 'Z' {
if str[i]+n > 'Z' {
b = 'A' + (str[i] + n - 'Z') - 1
} else {
b = str[i] + n
}
} else if str[i] >= 'a' && str[i] <= 'z' {
if str[i]+n > 'z' {
b = 'a' + (str[i] + n - 'z') - 1
} else {
b = str[i] + n
}
} else {
b = str[i]
}
convert[i] = string(b)
}
return strings.Join(convert, "")
}
やってみてのあれそれ
大文字は大文字のままに、小文字は小文字のままにしたかったのでこんな感じの条件分岐。
標準入力で文字を入力して乱数で1-25文字ずらすようにしました。
最初はROT13作ってたけど流石に簡単すぎたので。
n := byte(r.Intn(25))
にして足すようにしたけど他にいい方法あるのかなあ。