我在Project Euler研究问题集已经有一段时间了,并且很享受所面临的挑战。我目前正在处理涉及加密和解密过程的问题 59 。
从任何合理的标准来看,这个问题都是一个非常简单的解密问题。
- 我被告知加密密钥由 3 个小写字母组成。
- 我已经得到了加密/解密过程的描述。
- 我收到了一个加密的文本文件,其中只包含加密的常用英文单词
我完全理解导入数据、循环遍历所有可能的密钥以及尝试使用每个可能的密钥解密文件数据的过程。我的问题是,在尝试使用其中一个密钥进行解密之后,我如何判断该密钥是否是正确的解密密钥?就计算机而言,每个解密密钥只是将数据从一个值转换为另一个值。该值的含义纯粹是主观的/解释的。如何判断解密密钥是否已将数据解密为有意义的内容(即常用英文单词)
这是我到目前为止的代码(C#):
static void Main(string[] args)
{
/* Get the data from the file and convert to byte array*/
StreamReader inData = new StreamReader(@"C:\Users\thantos\Desktop\cipher1.txt");
string[] strData = inData.ReadLine().Split(new char[] {','});
byte[] fileData = new byte[strData.Length];
foreach (string x in strData) { byte.Parse(x); }
/* for each three character lowercase password */
for (uint i = 0; i < 26; i++) {
for (uint j = 0; j < 26; j++){
for (uint k = 0; k < 26; k++) {
/* create a key */
byte[] key = new byte[3];
key[0] = (byte)(i + 97);
key[1] = (byte)(j + 97);
key[2] = (byte)(k + 97);
/* create temp copy of data */
byte[] dataCopy = new byte[fileData.Length];
fileData.CopyTo(dataCopy, 0);
/* decrypt using key */
for (uint l = 0; l < dataCopy.Length; l++) {
dataCopy[l] = (byte)(dataCopy[l] ^ key[l%key.Length]);
}
/* cannot figure out how to check
* if data is meaningfully decrypted
*/
bool dataIsMeaningful = isMeaningful(dataCopy);
if(dataIsMeaningful) {
/* do stuff with data if correct
* decryption key was found
*/
}
}
}
}
}
我已经尝试过这种方法isMeaningful()
:
public static isMeaningful(byte[] inData) {
bool isGood = true;
for (uint i = 0; good && i < inData.Length; i++) {
isGood &= (char.IsLower((char)inData[i]));;
}
return isGood;
}
但它对所有 17576 个可能的键都返回 true。
如何确定解密密钥是否已将文件数据解密为有意义的数据?我不是在寻找解决方案代码或 Project Euler 问题的答案,我在寻找有关如何检查您的解密尝试是否成功的解释。