Si on lance la fonctionplusieurs fois avec la même clé mais un input différent :
def conv(array1:bytes, array2:bytes) -> bytes:
len1, len2 = len(array1), len(array2)
res = [0]*(len1 + len2 - 1)
for i in range(len1 + len2 - 1):
csum = 0
for j in range(max(0, i - len2 + 1), min(len1, i + 1)):
csum += array1[j] * array2[i - j]
res[i] = csum % 256
return res
key = b'\xab\xec\xe9<\xaaC\x7fr\xeb\x8dgQ\xc0\x94\x01\x1d\xc03\x14\x97\xe2\x91\x97\xcf\x8b\x13?\x1d24w|'
print(bytes(conv(b'a', key)).hex())
print(bytes(conv(b'aa', key)).hex())
print(bytes(conv(b'aaa', key)).hex())
print(bytes(conv(b'aaaa', key)).hex())
# cb6c49bc6a631f320b6d07b1c01461fdc0539437a2f1376fab33dffdf2b417fc
# cb37b50526cd82513d7874b871d4755ebd13e7cbd99328a61ade12dcefa6cb13fc
# cb3780716f89ecb45caa7f25788535721e10a71e6dcaca97514dbd0fcea3bdc713fc
# cb37803cdbd2a81ebfc9b130e58ce6323271a4dec05e013942842cba0182bab9c713fc
On s'aperçoit qu'un caractère chiffré n'influe pas sur les précédents. Autrement dit, on peut fixer le début au fur et à mesure du déchiffrement.
Il faut donc tester tous les caractères possibles à la première position jusqu'à trouver le même résultat que la première position de l'output, puis refaire la même opération avec le second etc...
import string
def conv(array1:bytes, array2:bytes) -> bytes:
len1, len2 = len(array1), len(array2)
res = [0]*(len1 + len2 - 1)
for i in range(len1 + len2 - 1):
csum = 0
for j in range(max(0, i - len2 + 1), min(len1, i + 1)):
csum += array1[j] * array2[i - j]
res[i] = csum % 256
return res
key = b'\xab\xec\xe9<\xaaC\x7fr\xeb\x8dgQ\xc0\x94\x01\x1d\xc03\x14\x97\xe2\x91\x97\xcf\x8b\x13?\x1d24w|'
result = bytes.fromhex("17c080c00398a06e4661e403b2b571b578221bba83e235a0feece7213ad4d65c1d89c2a3afae5ef91bf7f2181f0c797505b7bd55c62d1edf2614b17f88f85eac674fbd6d7be4e2a617605c68e1baf8603cb9b1d32b2bc1ab60d8c62b20be0bc0fb73a546b5641988a3bf8eeb778731e048970308d941a8bd5f6cb56159069364c93b5429afdb85f9dfb5f5b0ca44d314af68bc9d56b39321fe5cc072c9508978693ee60a9bffff5b52f6aa0ca37f9b421eb402a4886b742570926b7479d2b89528caceb7121a338c233164c33a120b9813bc56b855c914124ecb30df3d4a14c92788faa7c9e32b544e24d9d9fe2a5539a280c28466dc6b276ba4b089fa26f8bace95f43f6c5d491e14e5fa09a853fff2dfd73a8cf8d7b54d3d8d693db7b182789f47e343e9cf56f8663e181a1e98276aface8b1052e3ee9c6630d69ad479bfe1106ec1ab585a030ca130a6d849f9c4bed9d0b16f46890f1efa66c8f21f078088f426ef0e1f9af315ae3b2356123df174bb4095ad2361237bedc3e62c294f8ccc135f9766f0ec2a462087cd2648")
charset = string.printable
decrypted = ''
for _ in range(len(result)):
for c in charset:
attempt = decrypted + c
cip = conv(attempt.encode(), key)
if cip[len(decrypted)] == result[len(decrypted)]:
decrypted = attempt
print(decrypted)