使用 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 次调用重现。好的,按照我们所经历的,这里仍然是可能的。
然而,可行性分析测试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();
}