Go語言編程練手——凱撒加密

Go語言編程練手——凱撒加密


前言

自閉FW了小半個月,一下就來到8月份了,不想再肥宅下去了,于是整理了下之前實(shí)驗(yàn)課做過的一些東西,傳傳到github上。

今天整理的是大二上學(xué)期密碼學(xué)實(shí)驗(yàn)課的幾個實(shí)驗(yàn),用MFC寫的凱撒加密、DES、SM4、RSA。代碼和實(shí)驗(yàn)報告均傳到了github上了
https://github.com/Miracle778/my_Crypto_lab

剛好之前看了看Go語言,但感覺不怎么熟練,于是想著,用Go語言重寫下這幾個實(shí)驗(yàn)看看,于是有了這一篇水文。


下面部分是我今天寫之前做的簡單記錄,就粗糙著貼出來吧,各位看官就將就著看吧。


凱撒加密go語言實(shí)現(xiàn)

設(shè)計過程

分為三個模塊

1.輸入交互模塊

先選擇功能 加密或解密
選擇好后,輸入明文/密文,然后密鑰
把輸入的數(shù)據(jù)傳給加解密模塊

定義一個結(jié)構(gòu)體作為該模塊的傳遞消息格式

type Msg struct {
    Flag int // 0代表加密 1代表解密
    Data string //明文或密文
    Key int  //密鑰
}

密文和明文可以含有空格,于是Msg.Data用bufio.NewReader()進(jìn)行輸入
密文明文里也可以含有數(shù)字,數(shù)字加解密以10為一輪
如果用Scanf多次輸出的時候,千萬記得吃掉緩沖里的回車

//這兩行相當(dāng)于c語言getchar
inputReader := bufio.NewReader(os.Stdin)
 _, err := inputReader.ReadString('\n')

2.Caesar密碼算法模塊

根據(jù)輸入模塊傳進(jìn)來的參數(shù),進(jìn)行Caesar算法加/解密,然后把結(jié)果傳給輸出模塊

3.輸出結(jié)果

把加/解密結(jié)果輸出


代碼

圖也懶得截了,直接放代碼吧
代碼因?yàn)槭菐е炀欸o語言去的,所以盡可能多的用了一下東西
如不同的輸入、結(jié)構(gòu)體、自定義errors、異常處理等

//caesar.go
package main

import (
    "bufio"
    "errors"
    "fmt"
    "os"
)

var (
    message string
    cipher  string
    key     int
)

type Msg struct {
    Flag int // 選擇功能
    Data string
    Key  int
}

func main() {
    msg, err := typeIn()
    for err != nil {
        fmt.Println(err, "\n--------------------")
        msg, err = typeIn()
    }
    out := caesar(msg)
    fmt.Println(out)
}

func typeIn() (*Msg, error) {
    In := new(Msg)
    inputerr := errors.New("輸入錯誤,請重新輸入")

    fmt.Println("請輸入0或1選擇功能:\n0.加密\n1.解密")
    fmt.Scanf("%d", &In.Flag)
    //這兩行相當(dāng)于c語言getchar
    inputReader := bufio.NewReader(os.Stdin)
    _, err := inputReader.ReadString('\n')

    if In.Flag != 0 && In.Flag != 1 {
        return In, inputerr
    }
    fmt.Println("輸入你的明文或者密文")

    Data, _, err := inputReader.ReadLine()
    In.Data = string(Data)

    fmt.Println("輸入密鑰key")
    fmt.Scanf("%d", &In.Key)

    //吃回車
    _, err = inputReader.ReadString('\n')

    if err != nil {
        panic("typeIn()出錯")
    }

    return In, nil
}

func caesar(msg *Msg) string {
    data := []byte(msg.Data)
    var keyS, keyN byte
    if msg.Flag == 0 {
        //加密
        keyS = byte(msg.Key % 26)
        keyN = byte(msg.Key % 10)
    } else {
        //解密
        keyS = 26 - byte(msg.Key%26)
        keyN = 10 - byte(msg.Key%10)
    }
    for k, v := range data {
        if v >= 97 && v <= 122 {
            //小寫字母
            if v+keyS > 122 {
                v = v + keyS - 26
            } else {
                v = v + keyS
            }
            data[k] = v
        } else if v >= 65 && v <= 90 {
            //大寫字母
            if v+keyS > 90 {
                v = v + keyS - 26
            } else {
                v = v + keyS
            }
            data[k] = v
        } else if v >= 48 && v <= 57 {
            //數(shù)字
            if v+keyN > 57 {
                v = v + keyN - 10
            } else {
                v = v + keyN
            }
            data[k] = v
        }
    }
    res := string(data)
    return res
}


總結(jié)

Go語言也太難受了吧,代碼格式太強(qiáng)制了吧...,還是Python香。
懟著輸入搞了半天總算搞清楚Scan Scanf Scanln bufio.NewReader這幾個該怎么用了。

這幾天再整理整理,把之前幾個別的實(shí)驗(yàn)課的pyqt的項目跟python網(wǎng)絡(luò)編程的東西備份到github上去,哎,不知不覺就大四了...

好久沒水文章了,自閉了小半個月,是時候逃離肥宅狀態(tài)了。
前幾天也看了看Java反序列化的東西,過兩天貼上來。

最后引用一句著名藝術(shù)家lb的名言結(jié)束

總有人要當(dāng)FW 那為什么不能是我呢 (/dog


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容