55 lines
1.5 KiB
Elixir
55 lines
1.5 KiB
Elixir
# Test Shanda cipher - encrypt then decrypt should give original
|
|
|
|
Code.require_file("lib/odinsea/util/bit_tools.ex", ".")
|
|
Code.require_file("lib/odinsea/net/cipher/shanda_cipher.ex", ".")
|
|
|
|
alias Odinsea.Net.Cipher.ShandaCipher
|
|
alias Odinsea.Util.BitTools
|
|
|
|
import Bitwise
|
|
|
|
# Test with simple data
|
|
data = <<0x01, 0x00, 0x07, 0x70, 0x00, 0x04, 0x00>>
|
|
IO.puts("Original data: #{Base.encode16(data)}")
|
|
|
|
# Encrypt
|
|
encrypted = ShandaCipher.encrypt(data)
|
|
IO.puts("Encrypted: #{Base.encode16(encrypted)}")
|
|
|
|
# Decrypt
|
|
decrypted = ShandaCipher.decrypt(encrypted)
|
|
IO.puts("Decrypted: #{Base.encode16(decrypted)}")
|
|
|
|
IO.puts("Match: #{data == decrypted}")
|
|
IO.puts("")
|
|
|
|
# If they don't match, let's debug step by step
|
|
if data != decrypted do
|
|
IO.puts("MISMATCH! Let's debug...")
|
|
IO.puts("")
|
|
|
|
# Manual encrypt - first pass only
|
|
bytes = :binary.bin_to_list(data)
|
|
data_len = length(bytes)
|
|
data_length = data_len &&& 0xFF
|
|
|
|
IO.puts("Data length: #{data_len}")
|
|
IO.puts("Initial bytes: #{inspect(bytes)}")
|
|
IO.puts("")
|
|
|
|
# First pass (j=0, forward)
|
|
IO.puts("=== Pass 0 (forward) ===")
|
|
{result0, remember0} = Enum.reduce(Enum.with_index(bytes), {[], 0}, fn {cur, i}, {acc, remember} ->
|
|
cur = BitTools.roll_left(cur, 3)
|
|
cur = (cur + data_length) &&& 0xFF
|
|
cur = bxor(cur, remember)
|
|
new_remember = cur
|
|
cur = BitTools.roll_right(cur, data_length &&& 0xFF)
|
|
cur = bxor(cur, 0xFF)
|
|
cur = (cur + 0x48) &&& 0xFF
|
|
{[cur | acc], new_remember}
|
|
end)
|
|
result0 = Enum.reverse(result0)
|
|
IO.puts("After pass 0: #{inspect(result0)}, remember: #{remember0}")
|
|
end
|