3.1.2 vernam 代数密码
生活随笔
收集整理的這篇文章主要介紹了
3.1.2 vernam 代数密码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
vernam 代數密碼
簡介
Vernam加密法也稱一次一密(One-Time-Pad),用隨機的非重復的字符集合作為輸出密文.這里最重要的是,一旦使用了變換的輸入密文,就不再在任何其他消息中使用這個輸入密文(因此是一次性的).輸入密文的長度等于原消息明文的長度.
一次性板稱為密鑰(Key),并且明文有多長,密鑰就有多長,因此對于大消息行不通
公式
步驟編輯
以下是主要步驟.
1.按遞增順序把每個明文字母作為一個數字,A=0,B=1等等.
2.對輸入明文中每一個字母做相同的處理.
3.將明文中的每個字母與密鑰中的相應字母相加.
4.如果得到的和大于26,則從中減去26.
5.將和轉化為字母,從而得到密文.
例子
假設對明文消息HOW ARE YOU進行Verman加密,一次性板為NCBTZQARX得到的密文消息UQXTUYFR.以下是圖解
明文 H O W A R E Y O U
7 14 22 0 17 4 24 14 20
密鑰 N C B T Z Q A R X
13 2 1 19 25 16 0 17 23
初始和 20 16 23 19 42 20 24 31 43
大于25則減去26
20 16 23 19 16 20 24 5 17
代碼
package mainimport ("fmt" )func sanitize(in string) string {out := []rune{}for _, v := range in {if 65 <= v && v <= 90 { //A-Zout = append(out, v)} else if 97 <= v && v <= 122 { //a-zout = append(out, v-32) //小寫轉為大寫}}return string(out) }func encipher(msg,key string) string{if len(msg) != len(key){fmt.Println("vernam 加密需要明文密鑰長度一樣")return ""}smsg ,skey := sanitize(msg) ,sanitize(key) //轉為大寫out := make([]rune, 0, len(msg))for i,v := range smsg {a := (v - 'A') + (rune(skey[i]) - 'A')if a > 25 {a = a - 26}a = a + 'A'out = append(out,a)}fmt.Println(string(out))return ""}func main() {encipher("HOWAREYOU","NCBTZQARX")encipher("abcdefg","gfedcba") } 復制代碼轉載于:https://juejin.im/post/5b36e5716fb9a00e8761b4cc
總結
以上是生活随笔為你收集整理的3.1.2 vernam 代数密码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1094 Sorting I
- 下一篇: 第四章 孤独