導入
vigenere 暗号は、テキストの暗号化と復号化に使用されるアルゴリズムです。ヴィジェネレ暗号は、一連の織り交ぜられたシーザー暗号を使用してアルファベット テキストを暗号化するアルゴリズムです。キーワードの文字に基づいています。多アルファベット置換暗号の例です。このアルゴリズムは理解しやすく、実装も簡単です。このアルゴリズムは 1553 年に初めて記述されました。 ジョバン・バッティスタ・ベラッソ 。テキストの暗号化と復号化には Vigenere テーブルまたは Vigenere スクエアを使用します。ヴィジュネール表は、タブラ・レクタとも呼ばれます。
ヴィジェネレ暗号は 2 つの方法で実行されます。
方法 1
この方法では、vigenere テーブルが与えられた場合、vigenere テーブル (26 * 26 行列) を使用して暗号化と復号化が行われます。
例: 平文は「JAVATPOINT」、キーは「BEST」です。
新しいキーを生成するには、プレーン テキストの長さが新しいキーと等しくない限り、指定されたキーが循環的に繰り返されます。
暗号化
プロローグ言語
平文の最初の文字は、キーの最初の文字と結合されます。プレーンテキスト「J」の列とキー「B」の行は、vigenere テーブルのアルファベット「K」と交差するため、暗号文の最初の文字は「K」になります。
同様に、平文の 2 番目の文字がキーの 2 番目の文字と結合されます。プレーンテキスト「A」の列とキー「E」の行は、vigenere テーブルのアルファベット「E」と交差するため、暗号文の 2 番目の文字は「E」になります。
このプロセスは、平文が終了するまで継続的に続きます。
暗号文 = ケントゥTGボックス
復号化
復号化は、vigenere テーブル内のキーの行によって行われます。まず、鍵文字の行を選択し、その行内の暗号文文字の位置を見つけて、対応する暗号文の列ラベルを平文として選択します。
たとえば、キーの行は「B」、暗号文は「K」で、この暗号文文字は列「J」に表示されます。これは、最初の平文文字が「J」であることを意味します。
次に、キーの行は「E」、暗号文は「E」で、この暗号文文字は列「A」に表示されます。これは、2 番目の平文文字が「A」であることを意味します。
このプロセスは、暗号文が完成するまで継続的に続きます。
平文 = ジャバトポイント
オンスで10ml
方法 2
vigenere テーブルが指定されていない場合、暗号化と復号化は、このメソッドの Vigener の代数式によって行われます (文字 (A ~ Z) を数字 (0 ~ 25) に変換します)。
暗号化の公式は、
そして私= (P私+K私) 対 26復号化の式は、
D私= (E私-K私) 対 26万が一の場合(D私) の値がマイナス (-ve) になるので、この場合はマイナスの値に 26 を加算します。
どこ、
E は暗号化を示します。
jsp javatpoint
D は復号化を示します。
P は平文を表します。
Kはキーを表します。
注: 以下の表に示すように、「i」は i 番目の文字のオフセットを示します。
例: 平文は「JAVATPOINT」、キーは「BEST」です。
暗号化: そして私= (P私+K私) 対 26
平文 | J | あ | で | あ | T | P | ○ | 私 | N | T |
平文値(P) | 09 | 00 | 21 | 00 | 19 | 15 | 14 | 08 | 13 | 19 |
鍵 | B | そして | S | T | B | そして | S | T | B | そして |
キー値(K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
暗号文の値(E) | 10 | 04 | 13 | 19 | 二十 | 19 | 06 | 01 | 14 | 23 |
暗号文 | K | そして | N | T | で | T | G | B | ○ | バツ |
復号化: D私= (E私-K私) 対 26
いずれかの場合 (Di) の値が負 (-ve) になる場合、この場合は負の値に 26 を加算します。暗号文の 3 番目の文字のように。
アプレット アプレット
N = 13 および S = 18
D私= (E私-K私) 対 26
D私= (13 - 18) 対 26
D私= 26 に対して -5
D私= (-5 + 26) 対 26
D私= 21
暗号文 | K | そして | N | T | で | T | G | B | ○ | バツ |
暗号文の値(E) | 10 | 04 | 13 | 19 | 二十 | 19 | 06 | 01 | 14 | 23 |
鍵 | B | そして | S | T | B | そして | S | T | B | そして |
キー値(K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
平文値(P) | 09 | 00 | 21 | 00 | 19 | 15 | 14 | 08 | 13 | 19 |
平文 | J | あ | で | あ | T | P | ○ | 私 | N | T |
プログラム:
C言語
#include #include 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 = 'A' && key[i] key += key[i]; else if (key[i]>= 'a' && key[i] key += key[i] + 'A' - 'a'; } } string encrypt(string text) { string out; for (int i = 0, j = 0; i = 'a' && c <= 2 26 'z') c +="A" - 'a'; else if (c continue; out key[j] * 'a') % j="(j" 1) key.length(); } return out; string decrypt(string text) { for (int i="0," && <="z" ) 26) }; pre> <p> <strong>Output:</strong> </p> <pre> I AM INDIAN Encrypted: SDERFGTUJ Decrypted: IAMINDIAN </pre> <hr></=>
=>