# 维吉尼亚密码算法在Java中的解密消息到明文

go评论75阅读模式

Vigenere Cipher Algorithm In Java - Decrypted Message to Plaintext

# 问题

``````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) (((msg[i] - key[i] + 26) % 26) + 'A');
}
System.out.println("Decrypted Message: " + String.valueOf(decryptedText));
System.out.println("Keyword: " + keyword);
System.out.println("Plaintext: " + String.valueOf(decryptedText));
}
}
``````

I am currently trying to write the Vigenere Cipher algorithm in Java. I have to change the decrypted message to the plaintext but having trouble. Below is what I have so far.

When I run it, the message is not deciphered properly.

``````import java.util.Scanner;

public class VigenereCipher {
public static void main(String arg[]) {
String message = &quot;&quot;;
String keyword = &quot;KISWAHILI&quot;;

Scanner sc = new Scanner(System.in);
System.out.println(&quot;Enter a message: &quot;);
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 &lt; msgLength; i++, j++) {
if(j == keyword.length()) {
j = 0;
}
key[i] = keyword.charAt(j);
}

// Decryption Code
for(int i =0; i &lt; msgLength; i++) {
decryptedText[i] = (char)(((key[i] + 26) % 26) + &#39;A&#39;);
}
System.out.println(&quot;Decrypted Message: &quot; + message);
System.out.println(&quot;Keyword: &quot; + keyword);
System.out.println(&quot;Plaintext: &quot; + String.valueOf(decryptedText));
}
}
``````

# 答案1

``````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("关键消息：       " + new String(key));
``````

``````for (int i = 0; i < msgLength; i++) {
char c = msg[i];

decryptedText[i] = c == ' ' ? c : (char)(((msg[i] - key[i] + 26) % 26) + 'A');
}
``````

``````关键消息：       KISW AH ILIKI SW AHILIKIS WAH ILI KISW AHILIKISW AHIL IKIS

``````

It seems that whitespaces need to be skipped while populating `key` array:

``````for (int i = 0, j = 0; i &lt; msgLength; i++) {
if (msg[i] == &#39; &#39;) {
key[i] = &#39; &#39;;
} else {
key[i] = keyword.charAt(j++ % keyword.length());
}
}
System.out.println(&quot;Key Message:       &quot; + new String(key));
``````

Similarly, it needs to be taken into account in the decrypting loop.
And decryption has to be fixed:<br/>
D<sub>i</sub> = (M<sub>i</sub> - K<sub>i</sub> + 26 ) mod 26

``````for (int i =0; i &lt; msgLength; i++) {
char c = msg[i];

decryptedText[i] = c == &#39; &#39; ? c : (char)(((msg[i] - key[i] + 26) % 26) + &#39;A&#39;);
}
``````

Upon applying these changes, the output is as follows:

``````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
``````

• 本文由 发表于 2020年10月4日 05:53:56
• 转载请务必保留本文链接：https://go.coder-hub.com/64189371.html
• algorithm
• java
• vigenere

go 55

go 60

go 65

go 100