引言:
在c语言的学习中,我们可以了解到有关位操作符的概念。通过按位异或的特性,我们可以通过设置密钥实现数据的加密。
原理:
A ^ B = C
C ^ B = A ( = A ^ B ^ B = A ^ 0 = A )
此处A为原文,B为密钥,C则为密文。
本文围绕此原理使用python语言实现对异或加密的密文的解密
拿到手一坨密文:ERATFRARER8aHR0NFx0NGwYCEAoADAoKDA==,以及一段神秘字符串XOR
第一个想法是丢到cyberchef里边base64解码,结果:

在咨询了ai后发现,发现这很有可能是异或加密!
异或密码(simple XOR cipher)是密码学中一种基于异或运算的对称加密算法,通过对信息进行按位异或操作实现加密与解密。加密时将明文每个字符与密钥进行异或运算生成密文,解密需用同一密钥再次异或。若密钥重复使用,可通过频率分析破解;若密钥为随机且长度与明文相同,则形成一次性密码本(理论上不可破解)。(来源于网络)
将原密文ERATFRARER8aHR0NFx0NGwYCEAoADAoKDA==和密钥XOR转化为bytes(字节串)后,能够方便我们接下来的按位运算
思路是:原密文的每一个字节都按顺序与密钥的对应字节进行异或运算,然后存储到plaintext_list之中,最后按照ASCII码得到密文。
(码字好累)
源代码:
import base64
cipher_b64 = "ERATFRARER8aHR0NFx0NGwYCEAoADAoKDA=="#此处改为你需要解密的密文
key = "XOR"#此处改为解密的密钥
cipher_bytes = base64.b64decode(cipher_b64)#将base64编码的数据解码
key_bytes=key.encode()#将key转换为bytes类型
plaintext_list=[]
for i in range(len(cipher_bytes)):
cipher_byte=cipher_bytes[i]#读取cipher的第i个字节
key_byte=key_bytes[i%len(key_bytes)]#此处i%len()的原因是len(key)<len(cipher),因此循环处理
plain_byte=cipher_byte^key_byte#开始解密
plaintext_list.append(plain_byte)#在plaintext_list的最后一位加上解密后的一个字节
plaintext_bytes=bytes(plaintext_list)#将plaintext_list中的数据重新转换为byte类型
plaintext=plaintext_bytes.decode('utf-8')
print(cipher_bytes)#这里突然想看看bytes的密文长啥样
print(plaintext)#此处输出解密后的原文
输出:
b'\x11\x10\x13\x15\x10\x11\x11\x1f\x1a\x1d\x1d\r\x17\x1d\r\x1b\x06\x02\x10\n\x00\x0c\n\n\x0c'
I_AM_CIPHER_OR_CIPHERTEXT
之后可能会学习cpp进行解密,如果我还有这个想法的话
参考:异或密码_百度百科
声明:本文使用ai辅助学习!