如何使用Vigenere Cipher解密消息

时间:2015-11-09 19:43:24

标签: encryption cryptography vigenere

最近,我一直在努力教育自己如何使用Vigenere Cipher加密和解密。

我已经成功加密了邮件,这些是我实现加密的步骤:

加密密钥:设置

消息:绝密

第1步:密钥的数字表示为18,4,19(使用下表)

enter image description here

锻炼

提醒

P是明文单位的集合

C是一组密文单元

K是一组键

E:P x K - > C是加密函数

D:C x K - > P是解密函数

enter image description here

明文:绝密

密文:ISIKIVJIM

虽然我已设法加密消息"最高机密"我正在努力使用Vigenere Cipher方法使用上面使用的数值技术解密消息。有人可以向我解释我如何解密,让我们说:ISIKIVJIM(上面的密文)到它的原始纯文本消息,这是"最高机密"。

感谢。

2 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,解密公式是:p = c - k mod 26,还要注意我们必须执行模运算,所以我们对任何输入的答案应该属于0 - 25的范围,即如果我们得到一个负数,我们可以加26(即我们采用模数的数字),直到我们在这个范围内,你可以在这里阅读更多相关信息:

https://en.wikipedia.org/wiki/Modular_arithmetic

所以解密就像:

L = 11-18 = -7 mod 26 = -7 + 26 = 19 = T

S = 18-4 = 14 mod 26 = 14 = O

I = 8-19 = -11 mod 26 = -11 + 26 = 15 = P

如此......

我还写了c++代码:http://ideone.com/M3BAmq

答案 1 :(得分:0)

我最近编写了一个使用字节在Vigenere中加密和解密的java程序。您需要将纯文本/加密文本转换为字节数组并将其传入。

public static byte [] encryptVigenere (byte [] pt, String key)
{
    byte [] c_text = new byte [pt.length];
    byte [] key_text = key.getBytes();
    byte tmp;
    int shift;

    for (int i = 0, j = 0; i < pt.length; i++)
    {
        if (j >= key_text.length)
            j = 0;

        shift = key_text[j] - 65; //index of alphabet
        tmp = (byte) (pt[i] + shift);

        if (tmp > 'Z')
            tmp = (byte) (pt[i] - (26-shift));

        c_text[i] = tmp;
        j++;
    }
    return c_text;
}

public static byte [] decryptVigenere (byte [] ct, String key)
{
    byte [] p_text = new byte [ct.length];
    byte [] key_text = key.getBytes();
    byte tmp;
    int shift;

    for (int i = 0, j = 0; i < ct.length; i++)
    {
        if (j >= key_text.length)
            j = 0;

        shift = key_text[j] - 65; //index of alphabet
        tmp = (byte) (ct[i] - shift);

        if (tmp < 'A')
            tmp = (byte) (ct[i] + (26-shift));

        p_text[i] = tmp;
        j++;
    }
    return p_text;
}