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

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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • CTF中那些脑洞大开的编码和加密 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问...
    查无此人asdasd阅读 5,999评论 0 19
  • 0x01 目录 常见编码: ASCII编码 Base64/32/16编码 shellcode编码 Quoted-p...
    H0f_9阅读 12,752评论 2 17
  • 像对每位异性都怀有期待一样 来看望我 问候手掌上的缺口,问候干糙的脸颊 ———请竭力付出一点 用来吻吻我的落满灰尘...
    汤米呢阅读 247评论 0 3