Você está na página 1de 15

28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

Estruturas de dados Algoritmos Preparação para entrevista Prática de tópicos C++ Java P

Cifra de Vigenère
Nível de dificuldade: Médio ● Última atualização: 19 de março de 2022

Vigenere Cipher é um método de criptografia de texto alfabético. Ele usa uma forma

simples de substituição polialfabética . Uma cifra polialfabética é qualquer cifra

baseada em substituição, usando vários alfabetos de substituição. A encriptação do

texto original é feita através do quadrado de Vigenère ou da tabela de Vigenère .

A tabela consiste nos alfabetos escritos 26 vezes em linhas diferentes, cada alfabeto

deslocado ciclicamente para a esquerda em relação ao alfabeto anterior,

correspondendo às 26 possíveis cifras de César .

Em diferentes pontos do processo de criptografia, a cifra usa um alfabeto diferente

de uma das linhas.

O alfabeto usado em cada ponto depende de uma palavra-chave repetida.

Exemplo : 

Entrada: Texto simples: GEEKSFORGEEKS

Palavra-chave: AYUSH

Saída: Texto cifrado: GCYCZFMLYLEIM

Para gerar a chave, a palavra-chave fornecida é repetida

circularmente até atingir o comprimento de


o texto simples.

A palavra-chave "AYUSH" gera a chave "AYUSHAYUSHAYU"

Comece sua jornada de Conecte-


Registro
codificação agora!
O texto simples é então criptografado usando o processo

explicado abaixo.
se

https://www.geeksforgeeks.org/vigenere-cipher/ 1/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

Criptografia 

A primeira letra do texto simples, G é emparelhado com A , a primeira letra da chave.

Por tanto, use a linha G e a coluna A do quadrado de Vigenère, ou seja, G. Da mesma

forma, para a segunda letra do texto simples, a segunda letra da chave é usada, a letra

na linha E, e a coluna Y é C. O resto do texto simples é criptografado de forma

semelhante. 

Mesa para criptografar – Geeks

Descriptografia A 

descriptografia é realizada indo até a linha na tabela correspondente à chave,

encontrando a posição da letra do texto cifrado nessa linha e, em seguida, usando o

rótulo da coluna como o texto simples. Por exemplo, na linha A (de AYUSH), o texto

cifrado G aparece na coluna G, que é a primeira letra do texto simples. Em seguida,

vamos para a linha Y (de AYUSH), localize o texto cifrado C que se encontra na coluna E,

por tanto E é a segunda letra do texto simples.

Uma implementação mais fácil poderia ser visualizar Vigenère algebricamente

conver tendo [A Z] em números [0–25]. 

 
Comece sua jornada de Conecte-
Registro
codificação agora!
Criptografia

se

O texto simples(P) e a chave(K) são adicionados módulo 26.

https://www.geeksforgeeks.org/vigenere-cipher/ 2/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

E i = (P i + K i ) mod 26

Descriptografia

D i = (E i - K i + 26) mod 26

Nota: D i
denota o deslocamento do i-ésimo caractere do texto simples. Como offset de

A é 0 e de B é 1 e assim por diante.

A baixo está a implementação da ideia. 

C++

// C++ code to implement Vigenere Cipher


#include<bits/stdc++.h>
using namespace std;
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
string generateKey(string str, string key)
{
    int x = str.size();
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.size() == str.size())
            break;
        key.push_back(key[i]);
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
string cipherText(string str, string key)
{
    string cipher_text;
 
    for (int i = 0; i < str.size(); i++)
Comece sua jornada de
    { Conecte-
Registro
codificação agora!
        // converting in range 0-25 se
        char x = (str[i] + key[i]) %26;
 
https://www.geeksforgeeks.org/vigenere-cipher/ 3/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

        // convert into alphabets(ASCII)


        x += 'A';
 
        cipher_text.push_back(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
string originalText(string cipher_text, string key)
{
    string orig_text;
 
    for (int i = 0 ; i < cipher_text.size(); i++)
    {
        // converting in range 0-25
        char x = (cipher_text[i] - key[i] + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text.push_back(x);
    }
    return orig_text;
}
 
// Driver program to test the above function
int main()
{
    string str = "GEEKSFORGEEKS";
    string keyword = "AYUSH";
 
    string key = generateKey(str, keyword);
    string cipher_text = cipherText(str, key);
 
    cout << "Ciphertext : "
         << cipher_text << "\n";
 
    cout << "Original/Decrypted Text : "
         << originalText(cipher_text, key);
    return 0;
}

Comece sua jornada de


Java
Conecte-
Registro
codificação agora!
// Java code to implement Vigenere Cipher
se
 

https://www.geeksforgeeks.org/vigenere-cipher/ 4/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

class GFG
{
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
static String generateKey(String str, String key)
{
    int x = str.length();
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.length() == str.length())
            break;
        key+=(key.charAt(i));
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
static String cipherText(String str, String key)
{
    String cipher_text="";
 
    for (int i = 0; i < str.length(); i++)
    {
        // converting in range 0-25
        int x = (str.charAt(i) + key.charAt(i)) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
 
        cipher_text+=(char)(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
static String originalText(String cipher_text, String key)
{
    String orig_text="";
 
Comece sua jornada de Conecte-
Registro
codificação agora!
    for (int i = 0 ; i < cipher_text.length() &&
                            i < key.length(); i++)
se
    {
        // converting in range 0-25
https://www.geeksforgeeks.org/vigenere-cipher/ 5/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

        int x = (cipher_text.charAt(i) -
                    key.charAt(i) + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text+=(char)(x);
    }
    return orig_text;
}
 
// This function will convert the lower case character to Upper case
static String LowerToUpper(String s)
{
    StringBuffer str =new StringBuffer(s);
    for(int i = 0; i < s.length(); i++)
    {
        if(Character.isLowerCase(s.charAt(i)))
        {
            str.setCharAt(i, Character.toUpperCase(s.charAt(i)));
        }
    }
    s = str.toString();
    return s;
}
 
// Driver code
public static void main(String[] args)
{
    String Str = "GEEKSFORGEEKS";
    String Keyword = "AYUSH";
       
      String str = LowerToUpper(Str);
      String keyword = LowerToUpper(Keyword);
 
    String key = generateKey(str, keyword);
    String cipher_text = cipherText(str, key);
 
    System.out.println("Ciphertext : "
        + cipher_text + "\n");
 
    System.out.println("Original/Decrypted Text : "
        + originalText(cipher_text, key));
    }
}
 
Comece sua jornada de
// This code has been contributed by 29AjayKumar
Conecte-
Registro
codificação agora! se

https://www.geeksforgeeks.org/vigenere-cipher/ 6/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

P ython3

# Python code to implement


# Vigenere Cipher
 
# This function generates the
# key in a cyclic manner until
# it's length isn't equal to
# the length of original text
def generateKey(string, key):
    key = list(key)
    if len(string) == len(key):
        return(key)
    else:
        for i in range(len(string) -
                       len(key)):
            key.append(key[i % len(key)])
    return("" . join(key))
     
# This function returns the
# encrypted text generated
# with the help of the key
def cipherText(string, key):
    cipher_text = []
    for i in range(len(string)):
        x = (ord(string[i]) +
             ord(key[i])) % 26
        x += ord('A')
        cipher_text.append(chr(x))
    return("" . join(cipher_text))
     
# This function decrypts the
# encrypted text and returns
# the original text
def originalText(cipher_text, key):
    orig_text = []
    for i in range(len(cipher_text)):
        x = (ord(cipher_text[i]) -
             ord(key[i]) + 26) % 26
        x += ord('A')
        orig_text.append(chr(x))
    return("" . join(orig_text))
     
# Driver code
Comece sua jornada de
if __name__ == "__main__": Conecte-
Registro
codificação agora!
    string = "GEEKSFORGEEKS"
    keyword = "AYUSH"
se
    key = generateKey(string, keyword)
https://www.geeksforgeeks.org/vigenere-cipher/ 7/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

    cipher_text = cipherText(string,key)
    print("Ciphertext :", cipher_text)
    print("Original/Decrypted Text :",
           originalText(cipher_text, key))
 
# This code is contributed
# by Pratik Somwanshi

C#

// C# code to implement Vigenere Cipher


using System;
     
class GFG
{
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
static String generateKey(String str, String key)
{
    int x = str.Length;
 
    for (int i = 0; ; i++)
    {
        if (x == i)
            i = 0;
        if (key.Length == str.Length)
            break;
        key+=(key[i]);
    }
    return key;
}
 
// This function returns the encrypted text
// generated with the help of the key
static String cipherText(String str, String key)
{
    String cipher_text="";
 
    for (int i = 0; i < str.Length; i++)
    {
        // converting in range 0-25
Comece sua jornada de
        int x = (str[i] + key[i]) %26; Conecte-
Registro
 
codificação agora!
        // convert into alphabets(ASCII)
se
        x += 'A';

https://www.geeksforgeeks.org/vigenere-cipher/ 8/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

 
        cipher_text+=(char)(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text
// and returns the original text
static String originalText(String cipher_text, String key)
{
    String orig_text="";
 
    for (int i = 0 ; i < cipher_text.Length &&
                            i < key.Length; i++)
    {
        // converting in range 0-25
        int x = (cipher_text[i] -
                    key[i] + 26) %26;
 
        // convert into alphabets(ASCII)
        x += 'A';
        orig_text+=(char)(x);
    }
    return orig_text;
}
 
// Driver code
public static void Main(String[] args)
{
    String str = "GEEKSFORGEEKS";
    String keyword = "AYUSH";
 
    String key = generateKey(str, keyword);
    String cipher_text = cipherText(str, key);
 
    Console.WriteLine("Ciphertext : "
        + cipher_text + "\n");
 
    Console.WriteLine("Original/Decrypted Text : "
        + originalText(cipher_text, key));
    }
}
 
/* This code contributed by PrinciRaj1992 */

Comece sua jornada de Conecte-


Registro
codificação agora!
Javascript se

https://www.geeksforgeeks.org/vigenere-cipher/ 9/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

<script>
 
// JavaScript code to implement Vigenere Cipher
 
// This function generates the key in
// a cyclic manner until it's length isi'nt
// equal to the length of original text
function generateKey(str,key)
{
     
     key=key.split("");
    if(str.length == key.length)
        return key.join("");
    else
    {
        let temp=key.length;   
        for (let i = 0;i<(str.length-temp) ; i++)
        {
             
            key.push(key[i % ((key).length)])
        }
    }
    return key.join("");
}
 
// This function returns the encrypted text
// generated with the help of the key
function cipherText(str,key)
{
    let cipher_text="";
  
    for (let i = 0; i < str.length; i++)
    {
        // converting in range 0-25
        let x = (str[i].charCodeAt(0) + key[i].charCodeAt(0)) %26;
  
        // convert into alphabets(ASCII)
        x += 'A'.charCodeAt(0);
  
        cipher_text+=String.fromCharCode(x);
    }
    return cipher_text;
}
 
// This function decrypts the encrypted text

Comece sua jornada de


// and returns the original text
Conecte-
Registro
{ codificação agora!
function originalText(cipher_text,key)
se
    let orig_text="";
  
https://www.geeksforgeeks.org/vigenere-cipher/ 10/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

    for (let i = 0 ; i < cipher_text.length ; i++)


    {
        // converting in range 0-25
        let x = (cipher_text[i].charCodeAt(0) -
                    key[i].charCodeAt(0) + 26) %26;
  
        // convert into alphabets(ASCII)
        x += 'A'.charCodeAt(0);
        orig_text+=String.fromCharCode(x);
    }
    return orig_text;
}
 
// This function will convert the lower
// case character to Upper case
function LowerToUpper(s)
{
    let str =(s).split("");
    for(let i = 0; i < s.length; i++)
    {
        if(s[i] == s[i].toLowerCase())
        {
            str[i] = s[i].toUpperCase();
        }
    }
    s = str.toString();
    return s;
}
 
// Driver code
let str = "GEEKSFORGEEKS";
let keyword = "AYUSH";
 
 
let key = generateKey(str, keyword);
 
let cipher_text = cipherText(str, key);
 
document.write("Ciphertext : "
                   + cipher_text + "<br><br>");
 
document.write("Original/Decrypted Text : "
                   + originalText(cipher_text, key)+"<br>");
 
 
 
 
Comece sua jornada de Conecte-
Registro
// Thiscodificação agora!
code is contributed by rag2127
se
 
</script>
https://www.geeksforgeeks.org/vigenere-cipher/ 11/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

Saída

Texto cifrado: GCYCZFMLYLEIM

Texto original/descriptografado: GEEKSFORGEEKS

Referência:   https://en.wikipedia.org/wiki/ Vigen%C3%A8re_cipher

E ste ar tigo é uma contribuição de Ayush Khanduri . Se você gosta de GeeksforGeeks e

gostaria de contribuir, você também pode escrever um ar tigo usando

write.geeksforgeeks.org ou enviar seu ar tigo para review-team@geeksforgeeks.org.

Veja seu ar tigo aparecendo na página principal do GeeksforGeeks e ajude outros

Geeks. 

Por favor, escreva comentários se encontrar algo incorreto ou se quiser compar tilhar

mais informações sobre o tópico discutido acima.

Como 18

Anterior Próximo

Comece sua jornada de Conecte-


Registro
codificação agora! se

https://www.geeksforgeeks.org/vigenere-cipher/ 12/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

ARTIGOS RECOMENDADOS Página : 1 2 3

Diferença entre cifra cifra baconiana


01 05
monoalfabética e cifra 27, 17 de junho

polialfabética
08, 20 de junho

Cifra Nula
06
XOR Cifra 13, 17 de julho

02 18, 16 de novembro

cifra do alfabeto latino


Implementação da cifra afim 07 11, 18 de maio
03 21, 17 de fevereiro

Implementando a cifra Atbash Cifra Quadrada de Políbio


04 11, 17 de junho
08 18, 18 de fevereiro

Ar tigo contribuído por:

GeeksforGeeks

Vote na dificuldade

Dificuldade atual:
Médio

Fácil Normal Médio Duro Especialista

Melhorado por: Pratik Somwanshi, 29Ajay Kumar, príncipej1992, Akanksha_Rai, Vilão,


anônimo007, trapo2127, kumaripunam984122, UMADEVIRUCS18323
Comece sua jornada de Conecte-
Registro
Etiquetascodificação agora!
do artigo: criptografia, Cordas, Roteirista Técnico se
Pratique Tags: Cordas, criptografia
https://www.geeksforgeeks.org/vigenere-cipher/ 13/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks

Melhorar artigo Reportar problema

Escrevendo código no comentário? Por favor, use ide.geeksforgeeks.org , gere link e compartilhe o link aqui.

Carregar comentários

5º Andar, A-118,

Setor-136, Noida, Uttar Pradesh - 201305

feedback@geeksforgeeks.org

Companhia Aprender
Sobre nós Algoritmos
Carreiras Estruturas de dados
Em média Folha de dicas SDE
Contate-Nos Aprendizado de máquina
Política de Privacidade Assuntos CS
Política de direitos autorais Tutoriais em vídeo

Notícias línguas
Manchetes Pitão
Tecnologia Java

Comece sua jornada de


Trabalho e Carreira Conecte-PCP
Registro
codificação
O negócioagora! se Golang
Finança C#
E til d id
https://www.geeksforgeeks.org/vigenere-cipher/
SQL 14/15
28/03/22, 12:59 Cifra Vigenère - GeeksforGeeks
Estilo de vida SQL

Desenvolvimento web Contribuir


Tutoriais da Web Escrever um artigo
Tutorial de Django Melhorar um artigo
HTML Escolha os tópicos para escrever
CSS Escreva a experiência da entrevista

JavaScript Estágios
Bootstrap Estágio em vídeo

@geeksforgeeks , Alguns direitos reservados

Comece sua jornada de Conecte-


Registro
codificação agora! se

https://www.geeksforgeeks.org/vigenere-cipher/ 15/15

Você também pode gostar