# python - How to XOR literal with a string

I'm trying to implement the Blowfish algorithm in Python. The way I understand it, I have to use a key like "abcd" and then XOR it with a hexadecimal array (cycling the key if necessary)

``P = (0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,)``

The data types here have me very confused. I saw somewhere that 'abcd' = 0x61626364. In that case, XORing the first element of P would simply be 0x61626364 ^ 0x243f6a88.

So, how do I convert a string like 'abcd' to the format 0x?????. or perhaps there's a better way? Any light on this would be very appreciated!

To convert a string to an array of bytes:

``````b = bytes('abcd', 'ascii')
``````

To convert array of bytes to int:

``````i = int.from_bytes(b, byteorder='big', signed=False)
``````

Two hexadecimal digits can encode exactly one byte. This makes sense, because each hexadecimal digit can be in `16` different states, so two hexadecimal digits can be in `16 * 16 = 256` different states, which is exactly the same as the number of states representable in a single byte.

Because ASCII characters can also be encoded in a single byte, any ASCII character can be encoded as two hexadecimal digits.

For example, the letter `a` has character code `97` in ASCII. Converting the decimal number `97` to base 16 (hexadecimal) gives you `0x61`.

You can therefore take any string and convert it into a hexadecimal number by taking every character and representing it as two hex digits in your number. Looking at your example above, `a = 0x61`, `b = 0x62`, `c = 0x63`, and `d = 0x64`. Putting these all together gives you the representation `abcd = 0x61626364`.