私はプロジェクトオイラーで問題セットにしばらく取り組んでおり、提示された課題を楽しんでいます。私は現在、暗号化と復号化のプロセスを含む問題59に取り組んでいます。
問題は、合理的な基準によれば、非常に単純な復号化の問題です。
- 暗号化キーは小文字の3文字で構成されていると言われています。
- 暗号化/復号化プロセスについて説明しました。
- 暗号化された一般的な英語の単語のみを含む暗号化されたテキストファイルが提供されました
データをインポートし、可能なすべてのキーを循環し、可能な各キーを使用してファイルデータを復号化するプロセスを完全に理解しています。私の問題は、キーの1つを使用して復号化を試みた後、そのキーが正しい復号化キーであったかどうかをどのように判断できるかということです。コンピュータに関する限り、すべての復号化キーはデータをある値から別の値に変換するだけです。その値の意味は、純粋に主観的/解釈されます。復号化キーがデータを意味のあるもの(つまり、一般的な英語の単語)に復号化したかどうかを確認するにはどうすればよいですか?
これが私がこれまでに持っているコードです(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を返します。
復号化キーがファイルデータを意味のあるデータに復号化したかどうかをどのように判断できますか?私はソリューションコードやプロジェクトオイラーの問題に対する答えを探していません。復号化の試みが成功したことを確認する方法の説明を探しています。