Go語(yǔ)言編程練手——?jiǎng)P撒加密
前言
自閉FW了小半個(gè)月,一下就來(lái)到8月份了,不想再肥宅下去了,于是整理了下之前實(shí)驗(yàn)課做過(guò)的一些東西铲球,傳傳到github上。
今天整理的是大二上學(xué)期密碼學(xué)實(shí)驗(yàn)課的幾個(gè)實(shí)驗(yàn)晰赞,用MFC寫的凱撒加密稼病、DES、SM4宾肺、RSA溯饵。代碼和實(shí)驗(yàn)報(bào)告均傳到了github上了
https://github.com/Miracle778/my_Crypto_lab
剛好之前看了看Go語(yǔ)言,但感覺(jué)不怎么熟練锨用,于是想著,用Go語(yǔ)言重寫下這幾個(gè)實(shí)驗(yàn)看看隘谣,于是有了這一篇水文增拥。
下面部分是我今天寫之前做的簡(jiǎn)單記錄,就粗糙著貼出來(lái)吧寻歧,各位看官就將就著看吧掌栅。
凱撒加密go語(yǔ)言實(shí)現(xiàn)
設(shè)計(jì)過(guò)程
分為三個(gè)模塊
1.輸入交互模塊
先選擇功能 加密或解密
選擇好后,輸入明文/密文码泛,然后密鑰
把輸入的數(shù)據(jù)傳給加解密模塊
定義一個(gè)結(jié)構(gòu)體作為該模塊的傳遞消息格式
type Msg struct {
Flag int // 0代表加密 1代表解密
Data string //明文或密文
Key int //密鑰
}
密文和明文可以含有空格猾封,于是Msg.Data用bufio.NewReader()進(jìn)行輸入
密文明文里也可以含有數(shù)字,數(shù)字加解密以10為一輪
如果用Scanf多次輸出的時(shí)候噪珊,千萬(wàn)記得吃掉緩沖里的回車
//這兩行相當(dāng)于c語(yǔ)言getchar
inputReader := bufio.NewReader(os.Stdin)
_, err := inputReader.ReadString('\n')
2.Caesar密碼算法模塊
根據(jù)輸入模塊傳進(jìn)來(lái)的參數(shù)晌缘,進(jìn)行Caesar算法加/解密,然后把結(jié)果傳給輸出模塊
3.輸出結(jié)果
把加/解密結(jié)果輸出
代碼
圖也懶得截了痢站,直接放代碼吧
代碼因?yàn)槭菐е炀欸o語(yǔ)言去的磷箕,所以盡可能多的用了一下東西
如不同的輸入、結(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("輸入錯(cuò)誤,請(qǐng)重新輸入")
fmt.Println("請(qǐng)輸入0或1選擇功能:\n0.加密\n1.解密")
fmt.Scanf("%d", &In.Flag)
//這兩行相當(dāng)于c語(yǔ)言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()出錯(cuò)")
}
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語(yǔ)言也太難受了吧,代碼格式太強(qiáng)制了吧...呜叫,還是Python香空繁。
懟著輸入搞了半天總算搞清楚Scan Scanf Scanln bufio.NewReader
這幾個(gè)該怎么用了。
這幾天再整理整理朱庆,把之前幾個(gè)別的實(shí)驗(yàn)課的pyqt的項(xiàng)目跟python網(wǎng)絡(luò)編程的東西備份到github上去盛泡,哎,不知不覺(jué)就大四了...
好久沒(méi)水文章了椎工,自閉了小半個(gè)月饭于,是時(shí)候逃離肥宅狀態(tài)了蜀踏。
前幾天也看了看Java反序列化的東西,過(guò)兩天貼上來(lái)掰吕。
最后引用一句著名藝術(shù)家lb的名言結(jié)束
總有人要當(dāng)FW 那為什么不能是我呢 (/dog