文章目录
- 异或
- 一、图片字节标识
- 二、开始异或计算
异或
异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为"⊕",计算机符号为"eor"。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为XOR、EOR、EX-OR
程序中有三种演算子:XOR、eor、⊕。
使用方法如下
z = x ⊕ y
z = x eor y
提示:以下是本篇文章正文内容,下面案例可供参考
一、图片字节标识
目前已知
jpg= FF D8
png =89 50
gif =47 49
Bmp=42 4D
二、开始异或计算
1.打开一个Dat文件(示例)
1.1 如果判断打开的Dat图片是什么类型呢?
取出Dat的前两个字节,上述图片取出的前两个字节为: 6E B7 已知 jpg= FF D8 ,png =89 50,gif =47 49,Bmp=42 4D
判断是否为Jpg: 用6E与FF异或 = 91(十六进制) 在用B7与D8异或=6F(十六进制),可以明显的发现两次计算出得结果不一致,所以不是Jpg图片的类型,依次类推,只要两次计算结果是一致的,那么就是对应的图片类型
图中正确的类型Png
6E与89=E7 ,B7与50=E7 (E7就是解密的Key) 对每一个字节与Key进行异或 就可以解密出图片了
func Format(filePath string) byte {
buf, _ := ioutil.ReadFile(filePath)
imgbytes := [3][]byte{
{0xff, 0xd8},
{0x89, 0x50},
{0x47, 0x49},
}
for _, xor := range imgbytes {
if xor[0]^buf[0] == xor[1]^buf[1] {
return byte(xor[0] ^ buf[0])
}
}
return byte(0)
}