维吉尼亚加密算法:

Virginia encryption algorithm
GOLANG

Golang
stringsSplit()Join()ToUpper()+=-=++fmt.Sprintf()

代码如下:


1、计算密钥中每个字母对应数值

// key2Value 计算密钥中每个字母对应数值
// 参数:keyword 密钥
//      start 加密设定起始数值
// 返回:keyNum []int32 密钥对应数值切片
func key2Value(keyword string, start int) []int32 {
	keyword = strings.ToUpper(keyword) // 转换为大写字母
	length := len(keyword)
	// 声明对应固定长度切片
	keyNum := make([]int32, length)
	for i := 0; i < length; i++ {
		for j := 0; j < 26; j++ {
			if uint8(j+65) == keyword[i] {
				keyNum[i] = int32(j + start)
				continue
			}
		}
	}
	return keyNum
}

2、针对带空格信息,在相应位置插入空格

// insertSpace 根据信息空格位置插入空格
func insertSpace(msg string, msgSlice []string, sliceLength int) (message string) {
	for i := 0; i < sliceLength; i++ {
		temp := ""
		for j := range msgSlice[i] {
			if j+1 == len(msgSlice[i]) {
				temp += msg[:j+1] + " "
				msg = msg[j+1:]
			}
		}
		message += temp
	}
	return message
}

3、加密函数

// VirginiaEncode 维吉尼亚加密算法 - 加密函数
// 参数:msg 需要加密明文
//      keyword 密钥
//      start start 加密设定起始数值,如A=0 或 A=5
// 返回:message string 加密后的密文
func VirginiaEncode(msg, keyword string, start int) (message string) {
	// 以空格转换为字符串切片
	msgSlice := strings.Split(strings.ToUpper(msg), " ")
	lengthMsg := len(msgSlice)
	// 明文信息连接为无空格的字符串
	msgUpper := strings.Join(msgSlice, "")
	// 调用 key2Value 函数获取密钥对应转换值
	keyNum := key2Value(keyword, start)

	for i, c := range msgUpper {
		//除字母外其他字符不加密
		if c >= 'A' && c <= 'Z' {
			c += keyNum[i%len(keyNum)] // 轮换密钥应对值
			if c > 'Z' {
				c -= 26 // c 计算后不为大写字母则 -26
			}
		}
		message += fmt.Sprintf("%s", string(c))
	}
	// 若多于一个单词,调用 insertSpace 函数插入空格
	if lengthMsg > 1 {
		return insertSpace(message, msgSlice, lengthMsg)
	}
	return
}

4、解密函数

// VirginiaDecode 维吉尼亚加密算法 - 解密函数
// 参数:msg 需要加密明文
//      keyword 密钥,
//      start start 加密设定起始数值必须与加密时设定一致
// 返回:message string 解密后的密文
func VirginiaDecode(msg, keyword string, start int) (message string) {
	msgSlice := strings.Split(strings.ToUpper(msg), " ")
	lengthMsg := len(msgSlice)
	msgUpper := strings.Join(msgSlice, "")
	keyNum := key2Value(keyword, start)
	length := len(keyNum)
	for i, c := range msgUpper {
		if c >= 'A' && c <= 'Z' {
			c -= keyNum[i%length]
			if c < 'A' {
				c += 26
			}
		}
		message += fmt.Sprintf("%s", string(c))
	}
	if lengthMsg > 1 {
		return insertSpace(message, msgSlice, lengthMsg)
	}
	return
}

5、主程序

func main() {
	msg := "ThisisaGolangprogram" // 明文
	keyword := "golang"     // 密钥

	//加密,start = 5
	println(VirginiaEncode(msg, keyword, 5))
	// 解密
	msg = "EAYXADLZEQSYRIHTYCLF"
	println(VirginiaDecode(msg, keyword, 5))

	// 明文带空格、非字母,更换密钥,start = 0
	msg = "nice to meet you!"
	keyword = "virginia"
	println(VirginiaEncode(msg, keyword, 0))
	msg = "IQTK BB UEZB PUC!"
	println(VirginiaDecode(msg, keyword, 0))
}

输出:

EAYXADLZEQSYRIHTYCLF
THISISAGOLANGPROGRAM
IQTK BB UEZB PUC! 
NICE TO MEET YOU!
Golangerr
PythonGolang