尝试加密和解密 vigenere 密码

Posted

技术标签:

【中文标题】尝试加密和解密 vigenere 密码【英文标题】:Trying to encrypt and decrypt a vigenere cipher 【发布时间】:2016-11-10 16:12:30 【问题描述】:

我有一个已经使用移位加密的文本文件,但我需要再次加密加密文本,但这次使用 vigenere 密码。然后,我需要解密该加密文本(首先是 vigenere,然后是移位),但所有大写和小写字母以及空格、引号、逗号和句号都需要保持不变。我已经完成了shift加解密,剩下的就是vigenere了。下面显示的是我的加密 Vigenere 课程,我还没有编写解密,因为我被困在加密步骤中。 谢谢。

public static String vigenereEncryption(String str,String keyword)

char [] c_arr = null;
int g =0;
int keyLength = keyword.length();
String encrypted = "";
String update ="";
String []list = null;
for(int k = 0; k<keyword.length();k++)
char key = keyword.charAt(k);
 c_arr = keyword.toCharArray();
update = update + key;

for(int i=0;i<str.length();i++)




    //stores ascii value of character in the string at index 'i'
    int c=str.charAt(i);
    //encryption logic for uppercase letters

    if(Character.isUpperCase(c))
    
        for(int k = 0; k<keyword.length();k++)
            g = c_arr[k] ;

        
        c=(c+g)%26;
        //if c value exceeds the ascii value of 'Z' reduce it by subtracting 26(no.of alphabets) to keep in boundaries of ascii values of 'A' and 'Z'
        if(c>'Z')
            c=c-26;
    
    //encryption logic for lowercase letters
    else if(Character.isLowerCase(c))
    
        c=(c+g)%26;
        //if c value exceeds the ascii value of 'z' reduce it by subtracting 26(no.of alphabets) to keep in boundaries of ascii values of 'a' and 'z'
        if(c>'z')
            c=c-26;
    



    //concatinate the encrypted characters/strings
    encrypted=encrypted+(char) c;

return encrypted;//end of public class`

【问题讨论】:

【参考方案1】:

看起来您正在循环文本循环内的关键字。那是没有必要的。

您可以找到 Vigenere Cipher at rosettacode 的实现。 根据您的需要为 Java 修改以下代码(例如检查大小写并相应地处理它们):

    static String encrypt(String text, final String key) 
        String res = "";
        text = text.toUpperCase();
        for (int i = 0, j = 0; i < text.length(); i++) 
            char c = text.charAt(i);
            if (c < 'A' || c > 'Z') continue;
            res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
            j = ++j % key.length();
        
        return res;
    

    static String decrypt(String text, final String key) 
        String res = "";
        text = text.toUpperCase();
        for (int i = 0, j = 0; i < text.length(); i++) 
            char c = text.charAt(i);
            if (c < 'A' || c > 'Z') continue;
            res += (char)((c - key.charAt(j) + 26) % 26 + 'A');
            j = ++j % key.length();
        
        return res;
    

【讨论】:

以上是关于尝试加密和解密 vigenere 密码的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2012 题解

尝试加密/解密时出现 vigenere 密码错误

Vigenère密码

Vigenere 解密和取模

Vigen&#232;re 密码加密及解密

Python 中的 Vigenere 密码