反向工程文件加密(很可能是异或)

时间:2014-05-17 16:45:46

标签: encryption cryptography byte reverse-engineering xor

我试图对加密的文件格式进行反向工程。它很可能使用XOR加密。我可以用已知的明文创建加密文件,我分析了这些文件:

enc     71 8d 7e 84 29 20 b8 cb 6c ed bb 8a 62 a1 
dec     74 68 69 73 20 69 73 20 61 20 74 65 73 74 
xor     05 e5 17 f7 09 49 cb eb 0d cd cf ef 11 d5 
txt     t  h  i  s     i  s     a     t  e  s  t  

enc     61 ad be 84 29 20 b8 cb 6c ed bb 8a 62 a1 
dec     64 68 69 73 20 69 73 20 61 20 74 65 73 74 
xor     05 c5 d7 f7 09 49 cb eb 0d cd cf ef 11 d5 
txt     d  h  i  s     i  s     a     t  e  s  t 

enc     62 a5 ae a4 e9 a0 b8 cb 6c ed bb 8a 62 a1 
dec     67 68 69 73 20 69 73 20 61 20 74 65 73 74 
xor     05 cd c7 d7 c9 c9 cb eb 0d cd cf ef 11 d5
txt     g  h  i  s     i  s     a     t  e  s  t  

很明显原始文本是加密的一部分。密钥的第一个字节始终为05.密钥的第二个字节可以这样计算:

(enc1 + dec1)或xor1

密钥的相当低的熵意味着对其他密钥字节的类似规则。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你几乎得到了它!

m位置的密钥字节由下式给出:

km = [(en + dn) ^ kn] | secret

其中:

en is the previous encrypted byte
dn is the previous plain text byte
kn is the previous key byte (k0 = 5)
secret is an arbitrary number starting at 5 and incremented by 2 every two turns
^ is the xor operator
| is the or operator

一个简单的C#密钥生成器:

namespace Sample.CustomEncrypt {
    using System.Collections.Generic;
    using System.Text;

    class Program {
        static void Main() {
            var key1 = GenerateKey("this is a test");
            var key2 = GenerateKey("dhis is a test");
            var key3 = GenerateKey("ghis is a test");
        }

        public static byte[] GenerateKey(string input) {
            var plain = Encoding.UTF8.GetBytes(input);
            var secret = 5;
            var key = new List<byte> {
                0x05
            };

            for (var i = 0; i < plain.Length - 1; i++) {
                var dn = plain[i];
                var kn = key[i];
                var en = (byte)(dn ^ kn);
                var km = (byte)(((dn + en) ^ kn) | secret);

                key.Add(km);

                if (i % 2 == 0) {
                    secret += 2;
                }
            }

            return key.ToArray();
        }
    }
}

PS:正如尤金所指出,您应该在Reverse EngineeringCryptography下次发帖。