最近,我一直在努力教育自己如何使用Vigenere Cipher加密和解密。
我已经成功加密了邮件,这些是我实现加密的步骤:
加密密钥:设置
消息:绝密
第1步:密钥的数字表示为18,4,19(使用下表)
锻炼:
提醒:
P是明文单位的集合
C是一组密文单元
K是一组键
E:P x K - > C是加密函数
D:C x K - > P是解密函数
明文:绝密
密文:ISIKIVJIM
虽然我已设法加密消息"最高机密"我正在努力使用Vigenere Cipher方法使用上面使用的数值技术解密消息。有人可以向我解释我如何解密,让我们说:ISIKIVJIM(上面的密文)到它的原始纯文本消息,这是"最高机密"。
感谢。
答案 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;
}