美文网首页
Go语言编程练手——凯撒加密

Go语言编程练手——凯撒加密

作者: Miracle778 | 来源:发表于2019-08-02 00:19 被阅读0次

    Go语言编程练手——凯撒加密


    前言

    自闭FW了小半个月,一下就来到8月份了,不想再肥宅下去了,于是整理了下之前实验课做过的一些东西,传传到github上。

    今天整理的是大二上学期密码学实验课的几个实验,用MFC写的凯撒加密、DES、SM4、RSA。代码和实验报告均传到了github上了
    https://github.com/Miracle778/my_Crypto_lab

    刚好之前看了看Go语言,但感觉不怎么熟练,于是想着,用Go语言重写下这几个实验看看,于是有了这一篇水文。


    下面部分是我今天写之前做的简单记录,就粗糙着贴出来吧,各位看官就将就着看吧。


    凯撒加密go语言实现

    设计过程

    分为三个模块

    1.输入交互模块

    先选择功能 加密或解密
    选择好后,输入明文/密文,然后密钥
    把输入的数据传给加解密模块

    定义一个结构体作为该模块的传递消息格式

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

    密文和明文可以含有空格,于是Msg.Data用bufio.NewReader()进行输入
    密文明文里也可以含有数字,数字加解密以10为一轮
    如果用Scanf多次输出的时候,千万记得吃掉缓冲里的回车

    //这两行相当于c语言getchar
    inputReader := bufio.NewReader(os.Stdin)
     _, err := inputReader.ReadString('\n')
    

    2.Caesar密码算法模块

    根据输入模块传进来的参数,进行Caesar算法加/解密,然后把结果传给输出模块

    3.输出结果

    把加/解密结果输出


    代码

    图也懒得截了,直接放代码吧
    代码因为是带着熟练Go语言去的,所以尽可能多的用了一下东西
    如不同的输入、结构体、自定义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)
        //这两行相当于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 {
                //数字
                if v+keyN > 57 {
                    v = v + keyN - 10
                } else {
                    v = v + keyN
                }
                data[k] = v
            }
        }
        res := string(data)
        return res
    }
    
    

    总结

    Go语言也太难受了吧,代码格式太强制了吧...,还是Python香。
    怼着输入搞了半天总算搞清楚Scan Scanf Scanln bufio.NewReader这几个该怎么用了。

    这几天再整理整理,把之前几个别的实验课的pyqt的项目跟python网络编程的东西备份到github上去,哎,不知不觉就大四了...

    好久没水文章了,自闭了小半个月,是时候逃离肥宅状态了。
    前几天也看了看Java反序列化的东西,过两天贴上来。

    最后引用一句著名艺术家lb的名言结束

    总有人要当FW 那为什么不能是我呢 (/dog


    相关文章

      网友评论

          本文标题:Go语言编程练手——凯撒加密

          本文链接:https://www.haomeiwen.com/subject/qbohdctx.html