שמות כ:ד

לֹֽ֣א־יִהְיֶ֥͏ֽה־לְךָ֛֩ אֱלֹקִ֥֨ים אֲחֵרִ֖֜ים עַל־פָּנָֽ͏ַ֗י׃

לֹֽ֣א־תַעֲשֶֽׂ֨ה־לְךָ֥֣ פֶ֣֙סֶל֙ ׀ וְכׇל־תְּמוּנָ֔֡ה אֲשֶׁ֤֣ר בַּשָּׁמַ֣֙יִם֙ ׀ מִמַּ֔֡עַל וַֽאֲשֶׁ֥ר֩ בָּאָ֖֨רֶץ מִתָּ֑͏ַ֜חַת וַאֲשֶׁ֥ר בַּמַּ֖֣יִם ׀ מִתַּ֥֣חַת לָאָֽ֗רֶץ.

שמות כב:יז

מְכַשֵּׁפָ֖ה לֹ֥א תְחַיֶּֽה׃

דברים יח:י

לֹֽא־יִמָּצֵ֣א בְךָ֔ מַעֲבִ֥יר בְּנֽוֹ־וּבִתּ֖וֹ בָּאֵ֑שׁ קֹסֵ֣ם קְסָמִ֔ים מְעוֹנֵ֥ן וּמְנַחֵ֖שׁ וּמְכַשֵּֽׁף׃

In[1]:

def xor_bytes(data, key):

   return bytes([b ^ key[i % len(key)] for i, b in enumerate(data)])

key = b"secret"

msg1 = b"transfer $100 to Reuven"

msg2 = b"launch missile at dawn"

ct1 = xor_bytes(msg1, key)

ct2 = xor_bytes(msg2, key)

print(ct1)

print(ct2)

Out[1]:

b'\x07\x17\x02\x1c\x16\x12\x16\x17CVTDCE\x17\x1dE&\x16\x10\x15\x17\x0b'

b'\x1f\x04\x16\x1c\x06\x1cS\x08\n\x01\x16\x1d\x1f\x00C\x13\x11T\x17\x04\x14\x1c'

In[2]: leak = xor_bytes(ct1, ct2)

       print(leak)

       print(xor_bytes(msg1, msg2))

Out[2]:

        b'\x18\x13\x14\x00\x10\x0eE\x1fIWBY\\ET\x0eTr\x01\x14\x01\x0b\x14'

b'\x18\x13\x14\x00\x10\x0eE\x1fIWBY\\ET\x0eTr\x01\x14\x01\x0b\x02'

In[3]: known = b"transfer $100 to Reuven"

       guessed_other = xor_bytes(leak, known)

       print(guessed_other)

Out[3]:

        

        b'launch missile at dawn'