博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vigenere 加密
阅读量:7088 次
发布时间:2019-06-28

本文共 1887 字,大约阅读时间需要 6 分钟。

多表代替密码

简介

加密仅能对26个字母进行加密

将A~Z以0~25编号

最上面一行为明文,左侧一列为密钥。

加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y列的那个字母。这样就决定了加密一条消息需要与消息一样长的密钥字符串,通常,密钥字符串是密钥词的重复。

公式

如果假设能被加密的字符有N个,如果把这N个字符建成一个环,那么加密过程就是模N的过程,即,C(i)=(K(i)+P(i))modN,其中K、C、P分别代表的是密钥空间、密文空间、消息(明文)空间。

举例

比如密钥词是deceptive,消息是“we are discovered save

yourself”,那么加密过程如下:

deceptivedeceptivedeceptive(密钥字符串)

wearediscoveredsaveyourself(消息)
ZICVTWQNGRZGVTWAVZHCQYGLMGJ(密文)

从Vigenere代换表中,以密钥字符串中的“d”为行,消息中的“w”为列的那个字母就是“Z”了

C(i) = (K(i)+P(i))modN

c(1) = (3+22) mod 26
c(1) = 25 = Z

package mainimport "fmt"func Sanitize(in string) string {	out := []rune{}	for _, v := range in {		if 65 <= v && v <= 90 {  //A-Z			out = append(out, v)		} else if 97 <= v && v <= 122 {  //a-z			out = append(out, v-32)  //小写转为大写		}	}	return string(out)}func Quartets(in string) string {	out := make([]rune, 0, len(in))	for i, v := range in {		if i%4 == 0 && i != 0 {			out = append(out, rune(32))		}		out = append(out, v)	}	return string(out)}func EncodePair(a, b rune) rune {	return (((a - 'A') + (b - 'A')) % 26) + 'A'  //(K(i)+P(i))modN}func DecodePair(a, b rune) rune {	return (((((a - 'A') - (b - 'A')) + 26) % 26) + 'A')}func Encipher(msg, key string) string {	smsg, skey := Sanitize(msg), Sanitize(key)	out := make([]rune, 0, len(msg))	for i, v := range smsg {		out = append(out, EncodePair(v, rune(skey[i%len(skey)]))) //rune(skey[i%len(skey)] 获取该值对应的密钥	}	return string(out)}func Decipher(msg, key string) string {	smsg, skey := Sanitize(msg), Sanitize(key)	out := make([]rune, 0, len(msg))	for i, v := range smsg {		out = append(out, DecodePair(v, rune(skey[i%len(skey)])))	}	return string(out)}func main(){	key := "Typewriter"	message := "Now is the time for all good men to come to the aid of their country"	encoded := Encipher(message, key)	decoded := Decipher(encoded, key)	fmt.Println(encoded,decoded)	}复制代码

转载于:https://juejin.im/post/5b36e90af265da59ba780daa

你可能感兴趣的文章
python3迭代器和生成器
查看>>
linux 不能上网,可以ping通宿主机,网关
查看>>
lamp安装
查看>>
python学习资料,不断更新。。。。
查看>>
关于部分编译器out_of_range报错的解决
查看>>
CTF之MD5相等值不相等
查看>>
使用Google Authenticator给ssh进行登录验证
查看>>
Python35安装
查看>>
迅雷,快车,旋风链接编码解码C#源代码
查看>>
就这样了吗?
查看>>
IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
查看>>
基于Samba和NFS简单实现Mariadb服务示例
查看>>
magic潮牌内衣品牌×××,家居服×××欢迎您
查看>>
Zend Framework Deployment
查看>>
RHEL 6.6 虚拟化新特性
查看>>
[培训]薛大龙@北京首体宾馆(2008.10.31-11.2)
查看>>
网络营销第六课(8):SEO搜索引擎优化(长尾关键词)
查看>>
C语言数组操作和指针操作谁更高效
查看>>
Ubuntu系统安装设置
查看>>
keepalived+redis 高可用redis主从解决方案
查看>>