C の元のメソッドでは、最初に、シーケンスが対称的な方法で復号化/暗号化されると仮定します。CryptoBuffer
最初に呼び出すa5 03 18 01 ...
a5 03 18 01 ... => d8 72 7b 74 ...
その後d8 72 7b 74 ...
d8 72 7b 74 ... => 3b a1 9a a7 ...
最初に呼び出すa5 6f 93 8b ...
a5 6f 93 8b ... => d8 8e 02 ea ...
その後d8 8e 02 ea ...
d8 8e 02 ea ... => 3b ed 71 09 ...
私たちはそれが実現不可能であることを知っています。
もちろん、非対称の復号方法を使用することもできます。しかし、最初に、a5 03 18 01 ... => a5 6f 93 8b ...
可能性のある魔法の数で証明されているか、方向の逆が必要です。ブルート フォース アプローチによる分析のコードは、投稿の最後に配置されます。
テスト用にマジックナンバーを変数にしました。再現性分析により、連続的に変化するマジックナンバーで256回の呼び出しごとに元のシーケンスを再現できることがわかりました。わかりました、私たちが経験したことで、ここではまだ可能です.
ただし、両方の方向ですべてのケースをテストする実行可能性分析は、 fromとなしで成功します。256*256=65536
original => expected
expected => original
これで、暗号化されたシーケンスを期待どおりの結果に復号化する方法がないことがわかりました。
したがって、言語またはコードの両方の期待される動作は同一であるとしか言えませんが、仮定が壊れているため、期待される結果は不可能です。
分析用コード
public void CryptoBuffer(byte[] buffer, ushort magicShort) {
var magicBytes=BitConverter.GetBytes(magicShort);
var count=buffer.Length;
for(var i=0; i<count; i++) {
buffer[i]^=magicBytes[1];
buffer[i]+=magicBytes[0];
}
}
int Analyze(
Action<byte[], ushort> subject,
byte[] expected, byte[] original,
ushort? magicShort=default(ushort?)
) {
Func<byte[], String> LaHeX= // narrowing bytes to hex statement
arg => arg.Select(x => String.Format("{0:x2}\x20", x)).Aggregate(String.Concat);
var temporal=(byte[])original.Clone();
var found=0;
for(var i=ushort.MaxValue; i>=0; --i) {
if(found>255) {
Console.WriteLine(": might found more than the number of square root; ");
Console.WriteLine(": analyze stopped ");
Console.WriteLine();
break;
}
subject(temporal, magicShort??i);
if(expected.SequenceEqual(temporal)) {
++found;
Console.WriteLine("i={0:x2}; temporal={1}", i, LaHeX(temporal));
}
if(expected!=original)
temporal=(byte[])original.Clone();
}
return found;
}
void PerformTest() {
var original=new byte[] { 0xa5, 0x03, 0x18, 0x01 };
var expected=new byte[] { 0xa5, 0x6f, 0x93, 0x8b };
Console.WriteLine("--- reproducibility analysis --- ");
Console.WriteLine("found: {0}", Analyze(CryptoBuffer, original, original, 0xaac9));
Console.WriteLine();
Console.WriteLine("--- feasibility analysis --- ");
Console.WriteLine("found: {0}", Analyze(CryptoBuffer, expected, original));
Console.WriteLine();
// swap original and expected
var temporal=original;
original=expected;
expected=temporal;
Console.WriteLine("--- reproducibility analysis --- ");
Console.WriteLine("found: {0}", Analyze(CryptoBuffer, original, original, 0xaac9));
Console.WriteLine();
Console.WriteLine("--- feasibility analysis --- ");
Console.WriteLine("found: {0}", Analyze(CryptoBuffer, expected, original));
Console.WriteLine();
}