如何解密带有空格的短语

时间:2015-03-22 04:05:16

标签: java encryption whitespace caesar-cipher

所以我一直在研究加密和解密程序,虽然我一直遇到解密问题。我以为你只需要在解密部分更改一些值,但这没有用。另外,我一直在尝试在加密和解密过程中添加空格(空格)。目前,它用随机字母替换空格。我认为只是在下面的char数组中添加一个空格就可以修复它,但事实并非如此。

如果有人能给我解决我的两个问题的提示,那就太棒了。

class EncyptionandDecryption
{
char[] aEnc;
char[] aDec;
int shift;
char[] alphabet;

public EncyptionandDecryption(int c)
{
    aEnc = new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    aDec = new char[]{' ','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'};
    shift = c;
}

public String Encryption(String phrase)
{
    String enc = "";

    for (int i = 0; i < phrase.length(); i++)
    {
         char p = (char) (phrase.charAt(i) - 97);
         char e = (char) (((p + shift) % 26) + 97);
         enc += e;
    }
    return enc;
}

public String Decryption(String message)
{
    String dec = "";

    for (int i = 0; i < message.length(); i++)
    {
         char z = (char) (message.charAt(i) - 97);
         char p = (char) (((z - shift) % 26) + 97);
         dec += p;
    }
    return dec;
}
}

1 个答案:

答案 0 :(得分:0)

我建议使用标准化加密,我确定你有理由不使用,或使用查找表(它似乎你计划做)。如果您遇到查找表逻辑问题,我可以提供一些代码,如果您愿意的话。这些是更简单的答案。

但是,您始终可以为空格创建特殊情况。如果我没记错的话,它们的十六进制值是0x20。

根据请求,这是查找表的C#示例。它是不完美的,实际使用需要大量修改(它不支持大写,或数字等),但我希望它传达信息。转换到Java也不是很难。

    class Crypto
    {
        char[] mTable;
        char[] mReverseTable;
        public Crypto()
        {
            mTable = new char[255];
            mReverseTable = new char[255];
            List<char> lazy = new List<char>();
            Random r = new Random(123);//I'm not hardcoding a lookup table, but using a random with a predictable seed is a good alternative
            for (int i = (int)'a'; i <= (int)'z'; i++)
            {
                lazy.Add((char)i);
            }
            for (int i = (int)'a'; i <= (int)'z'; i++)
            {
                int index = r.Next(0, lazy.Count);
                mTable[i] = lazy[index];
                lazy.RemoveAt(index);
            }
            mTable[(int)']'] = ' ';//completely arbitrary to use ], but here we hardcode the value. there's a better way to do this using the random method above.
            mTable[(int)' '] = ']';
            for (int i = 0; i < mTable.Length; i++)
            {
                if (mTable[i] != '\0')
                {
                    mReverseTable[mTable[i]] = (char)i;
                }
            }
        }
        public String Encrypt(string phrase)
        {
            String enc = "";

            for (int i = 0; i < phrase.Length; i++)
            {
                enc += mTable[phrase[i]];
            }
            return enc;
        }
        public String Decrypt(string phrase)
        {

            String enc = "";

            for (int i = 0; i < phrase.Length; i++)
            {
                enc += mReverseTable[phrase[i]];
            }
            return enc;
        }
    }