package main
import "fmt"
// 参考 :https://blog.csdn.net/qq_33296108/article/details/85852919
// https://studygolang.com/articles/18246
/*
1.大写字符A到Z的ASCII代码分别是065到090,字符加一,代码加一
2.小写字符a到z的ASCII代码分别是097到122,依旧是字符加一,代码加一
*/
func caesarEn(str string, step rune)(string){
// 计算要位移的多少位
// 一共可以移动26位,那么第26次和第0次就是一样的
step = step % 26 // 这个必须,虽然要循环的次数只和明文长度有关,与位移长度没有关系,但是害怕+step之后ASCC密码不在范围内
if step <= 0{
return str;
}
// 将字符串转换为明文字符切片
str_slice := []rune(str)
// 密文切片
dst_slice := str_slice
// 循环明文字符切片
for i := 0; i < len(str_slice); i++{
dst_slice[i] = str_slice[i] + step
if dst_slice[i] > 90 && dst_slice[i] < 97{
dst_slice[i] = dst_slice[i] - 90 + 64
}else if dst_slice[i] > 122{
dst_slice[i] = dst_slice[i] - 122 + 96
}
}
return string(dst_slice);
}
/*
1.大写字符A到Z的ASCII代码分别是065到090,字符加一,代码加一
2.小写字符a到z的ASCII代码分别是 097到122,依旧是字符加一,代码加一
*/
//解密
func caesarDe(str string, step rune)(string){
step = step % 26;
if step <= 0{
return str;
}
// 准备密文切片
str_slice := []rune(str)
// 准备返回的明文切片
res_slice := str_slice
// 循环明文
for i := 0; i < len(str_slice) ; i++ {
res_slice[i] = str_slice[i] - step
if res_slice[i] < 65 {
res_slice[i] = res_slice[i] - 64 + 90
}else if res_slice[i] > 90 && res_slice[i] < 97{
res_slice[i] = res_slice[i] - 96 + 122
}
}
return string(res_slice)
}
func main(){
mingw := "ASDDQEfvfedp"
miwen := caesarEn(mingw, 5)
// 暴力破解
var i rune;
for i = 0; i < 26; i++ {
resm := caesarDe(miwen, i)
if mingw == resm{
fmt.Print("明文:" + resm)
fmt.Println(" 次:" , i)
}
}
}
golang:实现凯撒密码的加密解密
最新推荐文章于 2024-06-22 23:28:39 发布