Vigenère cipher 维吉尼亚加密算法

  • 维吉尼亚加密算法是凯撒加密算法的变种。
  • 凯撒算法:
    • 之前讲的凯撒算法例子是把字符串中的每个字母都向后移动了 3 位。
    • 假设 A=0,B=1 … Z=25。那么,我们就用 D=3 来表示向后移动 3 位。

第二部分习题 - 图1

  • 维吉尼亚加密算法使用的是密钥(keyword)
  • 假设密钥是:GOLANG

第二部分习题 - 图2

习题

  1. 编写一个程序来解密下面第一行的文字:
    • 它的密钥就是 GOLANG
    • 所有字母都是大写的英文字母

第二部分习题 - 图3

  1. package main
  2. import "fmt"
  3. func main() {
  4. cipherText := "CSOITEUIWUIZNSROCNKFD"
  5. keyword := "GOLANG"
  6. message := ""
  7. keyIndex := 0
  8. for i := 0; i < len(cipherText); i++ {
  9. c := cipherText[i] - 'A'
  10. k := keyword[keyIndex] - 'A'
  11. c = (c-k+26)%26 + 'A'
  12. message += string(c)
  13. keyIndex++
  14. keyIndex %= len(keyword)
  15. }
  16. fmt.Println(message)
  17. }
  1. 编写一个程序:
    • 使用维吉尼亚加密算法来加密信息。
    • 密钥为 GOLANG
  • 可能用到的函数:
    • strings.Replace
    • strings.ToUpper
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func main() {
  7. message := "your message goes here"
  8. keyword := "GOLANG"
  9. keyIndex := 0
  10. cipherText := ""
  11. message = strings.ToUpper(strings.Replace(message, " ", "", -1))
  12. for i := 0; i < len(message); i++ {
  13. c := message[i]
  14. if c >= 'A' && c <= 'Z' {
  15. c -= 'A'
  16. k := keyword[keyIndex] - 'A'
  17. c = (c+k)%26 + 'A'
  18. keyIndex++
  19. keyIndex %= len(keyword)
  20. }
  21. cipherText += string(c)
  22. }
  23. fmt.Println(cipherText)
  24. }