对文件加密进行逆向工程(很可能是 XOR)
Posted
技术标签:
【中文标题】对文件加密进行逆向工程(很可能是 XOR)【英文标题】:Reverse engineering a file encryption (most likely XOR) 【发布时间】:2014-05-17 16:45:45 【问题描述】:我正在尝试对加密的文件格式进行逆向工程。它很可能使用 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) OR xor1
密钥的相当低的熵意味着其他密钥字节的类似规则。
有什么想法吗?
【问题讨论】:
这个问题似乎离题了,因为它不是关于编程的,而且它不符合 *** 的格式。 @Eugene:如果不是关于编程?你觉得它是关于什么的? crypto.stackexchange.com 上讨论了这类事情,但那里也不欢迎“猜密码”或“帮我解密”问题。 我建议RE 回答这个问题(我是一个加密模式)。 【参考方案1】:你几乎明白了!
密钥在 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: 正如 Eugene 所指出的,您下次应该在 Reverse Engineering 或 Cryptography 上发帖。
【讨论】:
哇...非常感谢你拯救了我的一天!以上是关于对文件加密进行逆向工程(很可能是 XOR)的主要内容,如果未能解决你的问题,请参考以下文章