0

所以我一直在研究一个加密和解密程序,尽管我在解密时遇到了麻烦。我以为您只需要更改解密部分中的一些值,但这行不通。此外,我一直在尝试在加密和解密过程中添加空格(空格)。目前,它用随机字母替换空格。我认为只需在下面的 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;
}
}
4

1 回答 1

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;
        }
    }
于 2015-03-22T04:27:16.840 回答