|
(gracias a ElSemi por
toda la info)
La encriptación kabuki se usa en las roms de programa del z80
de los juegos cps1 que utilizan hardware QSound.
Esta encriptación codifica tanto
los datos (data read) como los opcodes (opcode fetch).
Se necesitan 4 claves para decodificar:
bitswap1key,bitswap2key,xorkey,bitselectkey.
el mecanismo es el siguiente:
- se lee el dato de la memoria
- se aplica un bitswap segun la clave bitswap1key
- se rota el valor obtenido un bit hacia la lzquierda
- se aplica un bitswap usando la clave bitswap2key
- se hace un xor con la clave xorkey
- se rota un bit a la izq
- se hace un bitswap usando la clave bitswap2key
- se rota un bit a la izq
- bitswap usando la clave bitswap1key
Cada bitswap afecta a parejas de bits.
Estos bits se intercambian o no, dependiendo de la clave bitswap correspondiente
y un valor, que se calcula como sigue:
- si estas en modo opcode fetch, suma bitselectkey a la direccion
del dato a desencriptar
- si se esta en modo data read, se hace un xor de la direccion con
01fc0h y luego se suma uno mas la bitselectkey.
los bits 0-7 se usan para el bitswap1 y los bits 8-15 para el bitswap2.
Ahora viene una cosa un poco liosa de explicar. Cuando un bit es 1
en este valor calculado, el bit activado equivalente en el dato a
desencriptar se sustituye por el bit indicado en la clave bitswap1
o 2 correspondiente.
p ej: si la clave bitswap1 es 53164207 y el bit 5 de la clave calculada
esta activo, entonces el bit 5 del dato se intercambia con el bit
1.
si la clave bitswap es 76543210 entonces no hay bitswap, ya que cada
bit se sustituye por él mismo.
|