Skip to content

Latest commit

 

History

History
188 lines (126 loc) · 5.94 KB

1088.md

File metadata and controls

188 lines (126 loc) · 5.94 KB

维吉内尔密码

原文:https://www.javatpoint.com/vigenere-cipher

介绍

vigenere 密码是一种用于加密和解密文本的算法。vigenere 密码是一种加密字母文本的算法,使用一系列交织的凯撒密码。它基于关键字的字母。这是一个多字母替换密码的例子。该算法易于理解和实现。这个算法最早是在 1553 年由吉奥万·巴蒂斯塔·贝拉索描述的。它使用维格纳表或维格纳方块来加密和解密文本。vigenere 表也被称为白板。

两种方法执行 vigenere 密码。

方法 1

当给定 vigenere 表时,在该方法中使用 vigenere 表(26 * 26 矩阵)进行加密和解密。

Vigenere Cipher

例:明文为“JAVATPOINT”,密钥为“BEST”。

要生成新密钥,只要纯文本的长度不等于新密钥,给定密钥就会以循环方式重复。

Vigenere Cipher

加密

明文的第一个字母与密钥的第一个字母组合在一起。纯文本“J”的列和密钥“B”的行与 vigenere 表中的字母“K”相交,因此密文的第一个字母是“K”。

同样,明文的第二个字母与密钥的第二个字母组合在一起。明文“A”的列和密钥“E”的行与 vigenere 表中的字母“E”相交,因此密文的第二个字母是“E”。

这个过程一直持续到明文完成。

塞浦路斯文 =肯顿堡盒

解密

解密由 vigenere 表中的密钥行完成。首先选择关键字母所在的行,找到密文字母在该行的位置,然后选择对应密文的列标签作为明文。

Vigenere Cipher

例如,在密钥的行中是“B”,密文是“K”,这个密文字母出现在“J”列中,这意味着第一个明文字母是“J”。

接下来,在密钥的行中是“E”,密文是“E”,这个密文字母出现在“A”列中,这意味着第二个明文字母是“A”。

这个过程一直持续到密文结束。

明文 = JAVATPOINT

方法 2

当未给定 vigenere 表时,该方法中的加密和解密由 Vigenar 代数公式完成(将字母(A-Z)转换为数字(0-25))。

加密公式为,

Ei = (Pi + Ki) mod 26

解密公式为,

Di = (Ei - Ki) mod 26

如果任何情况下(D i )值变成负值(-ve),在这种情况下,我们将在负值中加上 26。

在哪里,

e 表示加密。

d 表示解密。

p 表示明文。

k 表示钥匙。

注:“I”表示字母第 I 个数字的偏移量,如下表所示。

Vigenere Cipher

例:明文为“JAVATPOINT”,密钥为“BEST”。

**加密:**EI=(PI+KI)mod 26

| 纯文本 | J | A | V | A | T | P | O | 我 | 普通 | T | | 明文值(P) | 09 | 00 | Twenty-one | 00 | Nineteen | Fifteen | Fourteen | 08 | Thirteen | Nineteen | | 钥匙 | B | E | S | T | B | E | S | T | B | E | | 键值 | 01 | 04 | Eighteen | Nineteen | 01 | 04 | Eighteen | Nineteen | 01 | 04 | | 密文值 | Ten | 04 | Thirteen | Nineteen | Twenty | Nineteen | 06 | 01 | Fourteen | Twenty-three | | 密文 | K | E | 普通 | T | U | T | G | B | O | X |

**解密:**DI=(EI-KImod 26

如果任何情况下(Di)值变成负值(-ve),在这种情况下,我们将在负值中加上 26。比如,密文的第三个字母;

N = 13,S = 18

dI=(eI-kImod 26

d .“t0”、“I”、“T1”和“mod 26”

d .“t0”、“I”、“T1”、“5 模式 26”

(d)t0±I±t1 = =-5+26)mod 26

D i = 21

| 密文 | K | E | 普通 | T | U | T | G | B | O | X | | 密文值 | Ten | 04 | Thirteen | Nineteen | Twenty | Nineteen | 06 | 01 | Fourteen | Twenty-three | | 钥匙 | B | E | S | T | B | E | S | T | B | E | | 键值 | 01 | 04 | Eighteen | Nineteen | 01 | 04 | Eighteen | Nineteen | 01 | 04 | | 明文值(P) | 09 | 00 | Twenty-one | 00 | Nineteen | Fifteen | Fourteen | 08 | Thirteen | Nineteen | | 纯文本 | J | A | V | A | T | P | O | 我 | 普通 | T |

程序:

C 语言


#include #include <string>using namespace std;

int main()
{
    Vigenere cipher("VIGENERECIPHER"); 
    string original = "I AM INDIAN";
    string encrypted = cipher.encrypt(original);
    string decrypted = cipher.decrypt(encrypted);

    cout << original << endl;
    cout << "Encrypted: " << encrypted << endl;
    cout << "Decrypted: " << decrypted << endl;
}

class Vigenere
{
    public:
        string key;

        Vigenere(string key)
        {
            for (int i = 0; i < key.size(); ++i)
            {
                if (key[i] >= 'A' && key[i] <= 'Z')
                    this -> key += key[i];
                else if (key[i] >= 'a' && key[i] <= 'z')
                    this -> key += key[i] + 'A' - 'a';
            }
        }

        string encrypt(string text)
        {
            string out;
            for (int i = 0, j = 0; i < text.length(); ++i)
            {
                char c = text[i];
                if (c >= 'a' && c <= 'z')
                    c += 'A' - 'a';
                else if (c < 'A' || c > 'Z')
                    continue;
                out += (c + key[j] - 2 * 'A') % 26 + 'A';
                j = (j + 1) % key.length();
            }
            return out;
        }

        string decrypt(string text)
        {
            string out;
            for (int i = 0, j = 0; i < text.length(); ++i)
            {
                char c = text[i];
                if (c >= 'a' && c <= 'z')
                    c += 'A' - 'a';
                else if (c < 'A' || c > 'Z')
                    continue;
                out += (c - key[j] + 26) % 26 + 'A';
                j = (j + 1) % key.length();
            }
            return out;
        }
};</string> 

输出:

I AM INDIAN
Encrypted: SDERFGTUJ
Decrypted: IAMINDIAN