Go语言练手——凯撒加密

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

前言

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

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

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


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


凯撒加密go语言实现

设计过程

分为三个模块

1.输入交互模块

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

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

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

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

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

2.Caesar密码算法模块

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

3.输出结果

把加/解密结果输出


代码

图也懒得截了,直接放代码吧
代码因为是带着熟练Go语言去的,所以尽可能多的用了一下东西
如不同的输入、结构体、自定义errors、异常处理等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//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


ヾノ≧∀≦)o 来呀!快活呀!~
-------- 本文结束 --------