首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >XOR后将十六进制字符串转换为ASCII

XOR后将十六进制字符串转换为ASCII
EN

Stack Overflow用户
提问于 2018-03-16 12:32:55
回答 2查看 1.2K关注 0票数 0

我是Python的新手&我正试图学习如何相互之间进行XOR十六进制编码的密文,然后派生ASCII值。

我已经尝试过以前关于这个主题的文章中概述的一些函数--比如bytearray.fromhex、binascii.unhexlify、decode(“十六进制”),它们都产生了不同的错误(显然是因为我缺乏理解)。其中一些错误是由于我的python版本(python 3)造成的。

让我举一个简单的例子,比方说我有一个十六进制编码字符串ciphertext_1 ("4A17")和一个十六进制内化字符串ciphertext_2,我想要异或这两个字符串并导出它们的ASCII值。最接近解决方案的是下面的代码:

代码语言:javascript
代码运行次数:0
运行
复制
result=hex(int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
print(result)

这个输出结果是: 0xd07 (这是一个十六进制字符串,我的理解是?)

然后,我尝试将其转换为其ASCII值。目前,我正在努力:

代码语言:javascript
代码运行次数:0
运行
复制
binascii.unhexliy(result)

然而,这给了我一个错误:"binascii.Error:奇数长度字符串“,我尝试了上述不同的函数,并试图解决这个特定的错误(条形函数给出了另一个错误),但是我没有成功。我意识到我对这个问题缺乏知识和理解,所以我希望有人能给我提供建议。

完整的例子:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python
import binascii

ciphertext_1="4A17"
ciphertext_2="4710"

result=hex(int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
print(result)
print(binascii.unhexliy(result))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-16 12:47:34

代码语言:javascript
代码运行次数:0
运行
复制
from binascii import unhexlify

ciphertext_1 = "4A17"
ciphertext_2 = "4710"
xored = (int(ciphertext_1, 16) ^ int(ciphertext_2, 16))
# We format this integer: hex, no leading 0x, uppercase
string = format(xored, 'X')
# We pad it with an initial 0 if the length of the string is odd
if len(string) % 2:
    string = '0' + string
# unexlify returns a bytes object, we decode it to obtain a string
print(unhexlify(string).decode())
#
# Not much appears, just a CR followed by a BELL

或者,如果您更喜欢字符串的repr

代码语言:javascript
代码运行次数:0
运行
复制
print(repr(unhexlify(string).decode()))
# '\r\x07'
票数 1
EN

Stack Overflow用户

发布于 2018-03-16 13:00:41

当执行像XOR这样的逐字节操作时,使用bytes对象通常更容易(因为单个字节被视为整数)。那么,我们从this question得到:

代码语言:javascript
代码运行次数:0
运行
复制
ciphertext_1 = bytes.fromhex("4A17")
ciphertext_2 = bytes.fromhex("4710")

XORing --字节可以像在this question中那样用一个理解来完成。然后,您可以将其转换为字符串:

代码语言:javascript
代码运行次数:0
运行
复制
result = [c1 ^ c2 for (c1, c2) in zip(ciphertext_1, ciphertext_2)]
result = ''.join(chr(c) for c in result)

我可能会采取稍微不同的角度,创建一个bytes对象,而不是一个列表,它可以解码为字符串:

代码语言:javascript
代码运行次数:0
运行
复制
result = bytes(b1 ^ b2 for (b1, b2) in zip(ciphertext_1, ciphertext_2)).decode()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49320891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档