Java 中的 Vigenere 密码算法 - 将消息解密为明文

Posted

技术标签:

【中文标题】Java 中的 Vigenere 密码算法 - 将消息解密为明文【英文标题】:Vigenere Cipher Algorithm In Java - Decrypted Message to Plaintext 【发布时间】:2020-10-03 21:53:56 【问题描述】:

我目前正在尝试用 Java 编写 Vigenere Cipher 算法。我必须将解密的消息更改为明文,但遇到了麻烦。以下是我目前所拥有的。

当我运行它时,消息没有被正确解读。

import java.util.Scanner;

public class VigenereCipher 
        public static void main(String arg[]) 
            String message = "";
            String keyword = "KISWAHILI";
            
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter a message: ");
            message = sc.nextLine();
            
            char msg[] = message.toCharArray();
            int msgLength = msg.length;
        
            
            char key[] = new char [msgLength];
            char decryptedText[] = new char[msgLength];
            
            for(int i = 0, j = 0; i < msgLength; i++, j++) 
                if(j == keyword.length()) 
                    j = 0;
                
                key[i] = keyword.charAt(j);
            
            
            // Decryption Code
            for(int i =0; i < msgLength; i++) 
                decryptedText[i] = (char)(((key[i] + 26) % 26) + 'A');
            
            System.out.println("Decrypted Message: " + message);
            System.out.println("Keyword: " + keyword);
            System.out.println("Plaintext: " + String.valueOf(decryptedText));
        

【问题讨论】:

在你的“解密代码”中,msg[i]不应该以某种方式参与吗? @KevinAnderson 我确实在解密代码部分添加了它,msg[i] + key[i] + 26...但它仍然没有用,所以我把它拿出来了。抱歉应该评论出来 我想你可能想要更像((msg[i] - 'A') + (key[i] - 'A')) % 26 + 'A' 的东西。或者((msg[i] - 'A') - (key[i] - 'A')) % 26 + 'A',这取决于文本最初的加密方式。 【参考方案1】:

填充key数组时似乎需要跳过空格:

for (int i = 0, j = 0; i < msgLength; i++) 
    if (msg[i] == ' ') 
        key[i] = ' ';
     else 
        key[i] = keyword.charAt(j++ % keyword.length());
    

System.out.println("Key Message:       " + new String(key));

同样,在解密循环中也需要考虑到这一点。 并解密has to be fixed:Di = (Mi - Ki + 26 ) mod 26

for (int i =0; i < msgLength; i++) 
    char c = msg[i];
            
    decryptedText[i] = c == ' ' ? c : (char)(((msg[i] - key[i] + 26) % 26) + 'A');

应用这些更改后,输出如下:

Key Message:       KISW AH ILIKI SW AHILIKIS WAH ILI KISW AHILIKISW AHIL IKIS
Encrypted Message: XQKP IZ IMWEB LK AUVZCXKW PHL VPE RIKD ASOZZSBZI TOIE ESTD
Keyword: KISWAHILI
Plaintext: NIST IS ABOUT TO ANNOUNCE THE NEW HASH ALGORITHM THAT WILL

【讨论】:

我只是用整个密文进行了尝试,它只能在一定程度上起作用。如果我有数字和特殊字符,解密代码会有点不同吗? 是的,您需要维护一种具有可接受字符的字母表,然后修改模运算。

以上是关于Java 中的 Vigenere 密码算法 - 将消息解密为明文的主要内容,如果未能解决你的问题,请参考以下文章

浅析加密算法二Vigenere密码

Python 中的 Vigenere 密码

使用修改后的 Vigenere 密码算法,解密不会导致原始输入 [关闭]

python 简单的加密/解密算法(Vigenere密码)

Go 语言入门很简单:实现 Vigenere 加密算法

Python中的Vigenere密码不适用于大写/小写字母转换