1

2文字のビンを表す2つのバイナリ文字列のxorを適用するにはどうすればよいですか?

ここにコードがあります

def Xor(a,b):

    ABytes = a.encode('ascii','strict')
    BBytes = b.encode('ascii','strict')

    ABinaries = bin(int(binascii.hexlify(ABytes),16))
    BBinaries = bin(int(binascii.hexlify(BBytes),16))

    #this is what i want to do:
    xor = ABinaries ^ BBinaries 

    return xor

ただし、^演​​算子は文字列を操作しないためです。コードが機能しない場合、問題はxorのバイナリ値を返す必要があることです。

そしてそれが機能した場合、どうすればxorの文字列値を取得できますか?

4

4 に答える 4

4

bytesPython 3でインデックスを作成または反復すると、次のようintな値が得られxorます。

>>> a, b = b'abc', b'def'
>>> c = bytes(x^y for x,y in zip(a, b))
>>> c
b'\x05\x07\x05'
>>> bytes(x^y for x,y in zip(a, c))
b'def'
>>> bytes(x^y for x,y in zip(b, c))
b'abc'

何らかの理由でこれをビット文字列として使用したい場合(表現?私は確かにそれを使用して計算しません)、組み込み形式を使用し、各ビット文字列を8ビットにゼロパッドします。

>>> ''.join(format(x, '08b') for x in c)
'000001010000011100000101'
于 2012-11-14T00:40:35.250 に答える
1

これはあなたのために働きますか?

>>> bytes(a ^ b for a, b in zip(b'qwertyuiop', b'1234567890'))
b'@EVFAOBQV@'

アプリケーションで:

>>> def xor(x, y):
    assert isinstance(x, bytes) and isinstance(y, bytes), 'Pass in bytes!'
    assert len(x) == len(y), 'Bytes must be of same length!'
    return bytes(a ^ b for a, b in zip(x, y))

>>> xor(b'zxcvbnm,./', b'asdfghjkl;')
b'\x1b\x0b\x07\x10\x05\x06\x07GB\x14'

これをどのように使用できるかについてのさらなるアプリケーション:

>>> import random
>>> def crypt(data, password):
    random.seed(password)
    return xor(data, bytes(random.randrange(256) for i in range(len(data))))

>>> crypt(b'This is a test string to be encrypted.', 'Gr8+ 9a$$')
b'\x98ZE\xf2\x11\xe3=\x8b{\xf1Q"A\xd2\x8e\xb6.\xb2\xea\x81\x1b/\x8c\x15dFvHZ\xd9\x0cv8\xcd\xbe\x95\x1b\xc0'
>>> crypt(_, 'Gr8+ 9a$$')
b'This is a test string to be encrypted.'
于 2012-11-14T01:05:05.727 に答える
0

関数で機能するコードは次のとおりです。

from itertools import zip_longest

reversed_bits = [str(int(x != y)) for x, y in zip_longest(ABinaries[:1:-1]),
                                                          BBinaries[:1:-1]),
                                                          "0")]
xor = "0b" + "".join(reversed(reversed_bits))

ただし、これはかなり遅くなります。はるかに高速なアプローチは、バイトと整数を可能な限り処理し、バイナリ文字列を完全に回避することです。

于 2012-11-13T23:02:55.020 に答える
0
ABytes = a.encode('ascii','strict')
BBytes = b.encode('ascii','strict')
ABinaries =""
BBinaries = ""
AtempBinaries = bin(int(binascii.hexlify(ABytes),16))
BtempBinaries = bin(int(binascii.hexlify(BBytes),16))
if len(AtempBinaries)<10:

    ABinaries= '0b'+(((9-len(AtempBinaries))*'0') +AtempBinaries.split('0b')[1])
if len(BtempBinaries)<10:
    BBinaries = '0b'+ (((9-len(BtempBinaries))*'0') +BtempBinaries.split('0b')[1])
i = 0
xor = ""
for element in ABinaries:
    if (i == 0):
        xor = xor + '0'
    elif (element == 'b'):
        xor = xor + 'b'
    else:
        xor = xor + str(int(element)^int(BBinaries[i]))
    i = i + 1
return (xor)

これは問題を解決するようです。2つのバイナリ文字列をXORする直接的な方法はありません。

于 2012-11-14T11:48:12.230 に答える