您的当前位置:首页 >应用开发 >Go 语言入门很简单:Go 实现凯撒密码 正文
时间:2025-11-05 14:08:19 来源:网络整理编辑:应用开发
在文本上使用凯撒密码来移动字符。调用strings.Map方法。1.凯撒密码加密凯撒密码英语:Caesar cipher),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。凯撒密
在文本上使用凯撒密码来移动字符。入门调用 strings.Map 方法。简单
凯撒密码(英语:Caesar cipher),实现或称凯撒加密、凯撒凯撒变换、密码变换加密,入门是简单一种最简单且最广为人知的加密技术。
凯撒密码是实现一种替换加密技术,明文中的凯撒所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,密码当偏移量是入门 3 的时候,所有的简单字母 A 将被替换成 D;B 变成E,以此类推。实现这个加密方法是服务器托管凯撒以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。密码
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

凯撒密码一般以密码形式交付。比如这串代码“exxegoexsrgi”是密码。
通过移动字母,我们可以对消息进行编码。这阻止了随意的窥探。在 Go 中,我们可以使用 strings.Map 方法来实现这一点。
2.1 导入包 复制import ( "fmt" "strings" //Include string operation related methods
)1.2.3.4. 2.2 编写 caesar 方法然后让我们来编写 caesarEn() 凯撒密码加密方法。这会接收一个字符串并返回一个修改过的字符串。站群服务器
它会移动字符,然后将字符移动到有效范围。
复制//凯撒密码加密
func caesarEn(strRaw string, step byte) string { //1. 将文本转为小写
str_raw := strings.ToLower(strRaw) //2. 定义步长
step_move :=step
//3. 将字符串转换为明文字符切片
str_slice_src := []byte(str_raw) fmt.Println("Clear text character slice:", str_slice_src) //4. 创建一个密文字符切片
str_slice_dst :=str_slice_src
//5.循环处理文本切片
for i := 0; i < len(str_slice_src); i++ { //6.如果当前周期的明文特征在位移范围内,请直接添加位移步骤以保存密文字符切片
if str_slice_src[i] < 123-step_move { str_slice_dst[i] = str_slice_src[i] +step_move
} else { //7. 如果明文字符超出范围,则加上位移后的步长减去 26 str_slice_dst[i] = str_slice_src[i] + step_move - 26 } } //8. 输出结果
fmt.Println("The encryption result is:", step_move, str_slice_dst, string(str_slice_dst)) return string(str_slice_dst)}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.思想:
设置密文和位移步骤准备密文字符切片和明文字符切片每个密文的字符根据位移步长旋转,并存储在明文切片中返回明文
Go 凯撒解密代码:
复制//2. 凯撒密码解密
func caesarDe(strCipher string, step byte) string { //1. 将文本转为小写
str_cipher := strings.ToLower(strCipher) //2. 替代步长
step_move :=step
//3. 将字符串转换为明文字符切片
str_slice_src := []byte(str_cipher) fmt.Println("Ciphertext character slice:", str_slice_src) //4. 创建一个密文字符切片
str_slice_dst :=str_slice_src
//5. 循环处理字符文本切片
for i := 0; i < len(str_slice_src); i++ { //6. 如果当前周期的明文特征在位移范围内,请直接添加位移步骤以保存密文字符切片
if str_slice_src[i] >= 97+step_move { str_slice_dst[i] = str_slice_src[i] -step_move
} else { //7. 如果明文字符超出范围,则加上 26减去位移后的步长
str_slice_dst[i] = str_slice_src[i] + 26 -step_move
} } //8. Output results
fmt.Println("The decryption result is:", step_move, str_slice_dst, string(str_slice_dst)) return string(str_slice_dst)}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.复制
package main
import ( "errors" "fmt" "reflect" "regexp")var TBL = []rune("abcdefghijklmnopqrstuvwxyz")var CLUES = []string{"this", "the", "that"}var ( ErrLength = errors.New("invalid length") ErrChar = errors.New("invalid char") ErrNoClue = errors.New("no clue word") ErrShift = errors.New("invalid shift value"))func Encrypt(in string, sh int) (enc string, err error) { err = assert(in) if sh < 0 { err =ErrShift
} if err != nil {return
} enc = shift(in, sh)return
}func Decrypt(in string) (dec string, sh int, err error) { err = assert(in) if err != nil {return
} var hit bool = false subin := subStr(in) for i := 0; i < len(CLUES); i++ { subclue := subStr(CLUES[i]) for j := 0; j < len(subin)-len(subclue)+1; j++ { if reflect.DeepEqual(subin[j:j+1], subclue[0:len(subclue)-1]) { sh = subtract([]rune(in)[j], []rune(CLUES[i])[0]) hit = truebreak
} } } if !hit { err =ErrNoClue
return
} dec = shift(in, -sh)return
}func assert(in string) (err error) { if regexp.MustCompile(`[^a-z\. \r\n]`).MatchString(in) { err =ErrChar
} else if len(in) > 80 { err =ErrLength
}return
}func shift(in string, sh int) (out string) { for _, v := range in { if v == . || v == || v == \r || v == \n { out += string(v)continue
} i := indexOf(TBL, v) len := len(TBL) var ii int = (i + sh) %len
if ii < 0 { ii +=len
} if ii > len { ii -=len
} out += string(TBL[ii]) }return
}func subtract(left rune, right rune) (out int) { l := indexOf(TBL, left) r := indexOf(TBL, right) out = l -r
if out < 0 { out += len(TBL) }return
}func subStr(in string) []int { subin := make([]int, 0, 79) for i := range in { if i > len(in)-2 {break
} subin = append(subin, subtract([]rune(in)[i], []rune(in)[i+1])) } //return
return subin
}func indexOf(target []rune, searchChar rune) int { for i, v := range target { if v == searchChar {return i
} } return -1}func main() { in := "xlmw mw xli tmgxyvi xlex m xsso mr xli xvmt." fmt.Printf("in : %s\n", in) out, sh, err := Decrypt(in) fmt.Printf("out: %s\n", out) fmt.Printf("sh : %d\n", sh) fmt.Printf("err: %v\n", err)}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.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154. 5.测试复制package main
import ( "fmt" "strings")func caesar(r rune, shift int) rune { // Shift character byspecified number of places.
// ... If beyond range, shift backward orforward.
s := int(r) +shift
if s > z { return rune(s - 26) } else if s < a { return rune(s + 26) } return rune(s)}func main() { value := "test" fmt.Println(value) // Test the caesar method in a func argument to strings.Map.
value2 := strings.Map(func(r rune) rune { return caesar(r, 18) }, value) value3 := strings.Map(func(r rune) rune { return caesar(r, -18) }, value2) fmt.Println(value2, value3) value4 := strings.Map(func(r rune) rune { return caesar(r, 1) }, value) value5 := strings.Map(func(r rune) rune { return caesar(r, -1) }, value4) fmt.Println(value4, value5) value = "exxegoexsrgi" result := strings.Map(func(r rune) rune { return caesar(r, -4) }, value) fmt.Println(value, result)}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.运行该程序:
复制test
lwkl test
uftu test
exxegoexsrgi attackatonce1.2.3.4.本文简单介绍了一个有意思的密码学中的凯撒密码,该算法是一种替换加密技术,并在 Go 代码中实现了该算法的加密和解密过程。
网站模板荣耀9的音质如何?(一探荣耀9的音质表现,了解其音乐体验)2025-11-05 14:05
Win10系统如何关闭自动更新(停用Win10系统的自动更新功能以保持更大控制权)2025-11-05 14:05
探索电脑最上面一排键的错误代码(解读键盘故障,提升电脑使用体验)2025-11-05 12:50
硬盘Ghost分区教程(使用Ghost软件实现硬盘分区备份与还原,保障数据安全与稳定性)2025-11-05 12:37
手机信号满格却无法连接网络的解决方法(遇到手机信号满格但无法上网的情况?试试这些方法!)2025-11-05 12:08
抖音烟花特效电脑教程(让你的视频焕发夺目光彩,掌握抖音烟花特效制作的关键技巧)2025-11-05 12:04
电脑如何安装千兆端口(从购买到安装,快速提升网络速度)2025-11-05 11:57
Win7原版ISO教程(通过Win7原版ISO教程,轻松下载、安装和激活Windows7)2025-11-05 11:56
电脑驱动重装教程(轻松学会电脑驱动重装,解决设备冲突和性能问题)2025-11-05 11:29
黑色iPadPro12.9(探索黑色iPadPro12.9的无限潜力)2025-11-05 13:45
电脑重装Win10系统操作指南(简明易懂的重装Win10系统教程)2025-11-05 13:45
X99装机教程(选择X99主板,为你的装机之路带来巅峰体验)2025-11-05 13:40
电脑报read错误的解决方法(遇到电脑报read错误如何应对,尝试这些方法解决问题)2025-11-05 13:35
复仇者联盟(一触即发的全球拯救战,席卷影迷的热血情怀)2025-11-05 13:17
从零开始学习机械师DOS装系统教程(掌握DOS装系统,轻松解决电脑问题)2025-11-05 13:17
探索LGUF6800电视的功能与特点(一款高性能的智能电视体验)2025-11-05 13:06
电脑自动安装系统完整教程(轻松实现系统自动化安装,提高效率)2025-11-05 12:44
探索创未来云数据的无限潜能(以创未来云数据为基础,驱动创新发展)2025-11-05 11:59
电脑安装系统教程(轻松学会如何使用电脑安装操作系统)2025-11-05 11:54