golang实现凯撒密码的加密解密

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)
		}
	}
}

发布了255 篇原创文章 · 获赞 71 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/104540839