Go 语言简单实现Vigenere加密算法
作者:宇宙之一粟??????? 发布时间:2024-05-08 10:14:04
Vigenere 加密算法
该密码由意大利密码学家 Giovan Battista Bellaso 于 1553 年发明,但几个世纪以来一直归功于 16 世纪的法国密码学家 Blaise de Vigenère,他在 1586 年设计了类似的密码。
Vigenere Cipher 是一种加密字母文本的方法。它使用一种简单的多字母表替换形式。多字母密码是基于替换的任何密码,使用多个替换字母表。原始文本的加密是使用 Vigenère square 或 Vigenère table 完成的。
该表由在不同行中写出 26 次的字母组成,与前一个字母相比,每个字母循环向左移动,对应于 26 种可能的凯撒密码。
在最简单的 Vigenère 类型系统中,密钥是一个单词或短语,它可以根据需要重复多次以加密消息。如果密钥是欺骗性的,并且消息是我们被发现了,请自救,那么生成的密码将是
在加密过程的不同点,密码使用与其中一行不同的字母表。每个点使用的字母取决于重复的关键字。
又例如:
Input : Plaintext : GEEKSFORGEEKS
Keyword : AYUSH
Output : Ciphertext : GCYCZFMLYLEIM
For generating key, the given keyword is repeated
in a circular manner until it matches the length of
the plain text.
The keyword "AYUSH" generates the key "AYUSHAYUSHAYU"
The plain text is then encrypted using the process
explained below.
加密:
明文的第一个字母 G 与密钥的第一个字母 A 配对。所以使用 Vigenère 正方形的 G 行和 A 列,即 G。同理,对于明文的第二个字母,使用密钥的第二个字母,E 行的字母,Y 列的字母是 C。明文以类似的方式加密。
解密的方法是到表中与密钥对应的行,找到该行中密文字母的位置,然后将该列的标签作为明文。例如,在 A 行(来自 AYUSH)中,密文 G 出现在 G 列中,这是第一个明文字母。接下来,我们转到 Y 行(来自 AYUSH),找到在 E 列中找到的密文 C,因此 E 是第二个明文字母。
一个更简单的实现可能是通过将 [A-Z] 转换为数字 [0-25] 以代数方式可视化 Vigenère。
Go 代码
package main
import (
"fmt"
"strings"
)
func encodeString(cipher, key rune) rune {
const asciiA rune = 65
const numLetters = 26
plainTextIndex := cipher + key
asciiLetter := (plainTextIndex+numLetters)%numLetters + asciiA
return asciiLetter
}
func encode(message, kw string) string {
var plainText strings.Builder
kwChars := []rune(kw)
for i, cipherChar := range message {
key := i % len(kwChars)
plainText.WriteRune(encodeString(cipherChar, kwChars[key]))
}
return plainText.String()
}
func decipherString(cipher, key rune) rune {
const asciiA rune = 65
const numLetters = 26
plainTextIndex := cipher - key
asciiLetter := (plainTextIndex+numLetters)%numLetters + asciiA
return asciiLetter
}
func decipher(message, kw string) string {
var plainText strings.Builder
kwChars := []rune(kw)
for i, cipherChar := range message {
key := i % len(kwChars)
plainText.WriteRune(decipherString(cipherChar, kwChars[key]))
}
return plainText.String()
}
func main() {
fmt.Println("Enter Your string: ")
var first string
fmt.Scanln(&first)
fmt.Println("Enter your KEY: ")
var second string
fmt.Scanln(&second)
cipherText := first
keyword := second
fmt.Print("Do you want to 1. Encrypt or 2. Decrypt")
var option int
fmt.Scanln(&option)
if option == 1 {
fmt.Println(encode(cipherText, keyword))
} else if option == 2 {
fmt.Println(decipher(cipherText, keyword))
} else {
fmt.Println("please choose the right option")
}
}
来源:https://juejin.cn/post/7140296036429348878


猜你喜欢
- 修改配置文件:vim /usr/local/php/etc/php.ini[Phar]phar.readonly = Off压缩:a. 创建
- 一个小问题今天在做一个实验时,需要对一个包含中英文词汇的TXT文件进行读入和整理。Python代码的编码规则为UTF-8。在读入时,文件的每
- 本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息。分享给大家供大家参考,具体如下:import timefro
- 前言关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题
- 由于最近项目,有这样一个需求,是把数据库中的两列数据互换,经过好久才搞定,这里写个简单实例,做过记录。1.创建表及记录用于测试CREATE
- 一、判断以下哪些不能作为标识符A、aB、¥aC、_12D、$a@12E、falseF、False答案为:(F、D、B、E)二、输入数,判断这
- 1.3 安装 ASP.net跟基督山一起检查你们的计算机哦CPU Pentium II 450以上,推荐733内存 256M 推荐 512M
- 文件的io操作的缓冲行为分为全缓冲:同系统及磁盘块大小有关,n个字节后执行一次写入操作行缓冲:遇到换行符执行一次写操作无缓冲:立刻执行写操作
- torch.Tensor类型的数据loss和acc打印时如果写成以下写法print('batch_loss: '+str(l
- 在LintCode上练习遇到这个问题,查阅资料找到多种方法,总结如下。输入输出123321第一种:整数方法取余取整实现class Solut
- 最近无意中接触到了一篇文章,里面写了一个SQL的用法,是with...as,中午抽空记录一下用MySQL试了一下,发现并不支持该语法(版本:
- datetime日期时间类,主要熟悉API,时区的概念与语言无关。from datetime import datetime as dtdt
- 引言:之前博文介绍过了mysql/oracle与ES之间的同步机制。而logstash最初始的日志同步功能还没有介绍。本文就logstash
- 从url中找到域名,首先想到的是用正则,然后寻找相应的类库。用正则解析有很多不完备的地方,url中有域名,域名后缀一直在不断增加等。通过go
- 实现代码一、#!/usr/bin/pythonx,y=9,9 &nbs
- function createobj() { if (window.ActiveXObject)&n
- 基于socket的文件传输并进行MD5值校验,供大家参考,具体内容如下文件传输分为两个类,一个是服务端,一个是客户端。客户端发起发送文件或接
- 产生原因:先说一下Git和SVN的区别吧,有助于更好的理解这个问题。SVN从服务器上update文件时,如果文件有冲突,SVN会自动帮你me
- 本文实例讲述了Python从函数参数类型引出元组。分享给大家供大家参考,具体如下:自定义函数:特殊参数def show(name="
- SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE function [dbo]