所以我一直在研究加密和解密程序,虽然我一直遇到解密问题。我以为你只需要在解密部分更改一些值,但这没有用。另外,我一直在尝试在加密和解密过程中添加空格(空格)。目前,它用随机字母替换空格。我认为只是在下面的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;
}
}
答案 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;
}
}