维吉尼亚加密算法:
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