Module refinery.lib.fast.zipcrypto
Expand source code Browse git
from __future__ import annotations
def decrypt(
password: bytes | bytearray | memoryview,
data: bytes | bytearray | memoryview,
X: int,
Y: int,
Z: int
) -> tuple[bytearray, int, int, int]:
if not (T := _CRC32_TABLE):
for c in range(256):
for _ in range(8):
c, x = divmod(c, 2)
c ^= x * 0xEDB88320
T.append(c)
output = bytearray()
append = output.append
for c in password:
X = (X >> 8) ^ T[(X ^ c) & 0xFF]
Y += X & 0xFF
Y &= 0xFFFFFFFF
Y *= 134775813
Y += 1
Y &= 0xFFFFFFFF
Z = (Z >> 8) ^ T[(Z ^ (Y >> 24)) & 0xFF]
for c in data:
k = Z | 2
c ^= ((k * (k ^ 1)) >> 8) & 0xFF
X = (X >> 8) ^ T[(X ^ c) & 0xFF]
Y += X & 0xFF
Y &= 0xFFFFFFFF
Y *= 134775813
Y += 1
Y &= 0xFFFFFFFF
Z = (Z >> 8) ^ T[(Z ^ (Y >> 24)) & 0xFF]
append(c)
return output, X, Y, Z
_CRC32_TABLE: list[int] = []
Functions
def decrypt(password, data, X, Y, Z)-
Expand source code Browse git
def decrypt( password: bytes | bytearray | memoryview, data: bytes | bytearray | memoryview, X: int, Y: int, Z: int ) -> tuple[bytearray, int, int, int]: if not (T := _CRC32_TABLE): for c in range(256): for _ in range(8): c, x = divmod(c, 2) c ^= x * 0xEDB88320 T.append(c) output = bytearray() append = output.append for c in password: X = (X >> 8) ^ T[(X ^ c) & 0xFF] Y += X & 0xFF Y &= 0xFFFFFFFF Y *= 134775813 Y += 1 Y &= 0xFFFFFFFF Z = (Z >> 8) ^ T[(Z ^ (Y >> 24)) & 0xFF] for c in data: k = Z | 2 c ^= ((k * (k ^ 1)) >> 8) & 0xFF X = (X >> 8) ^ T[(X ^ c) & 0xFF] Y += X & 0xFF Y &= 0xFFFFFFFF Y *= 134775813 Y += 1 Y &= 0xFFFFFFFF Z = (Z >> 8) ^ T[(Z ^ (Y >> 24)) & 0xFF] append(c) return output, X, Y, Z