It looks from your sample code (and prior questions you posted) that you’re trying to encrypt the file using a key. Your XOR is basically implementing something called ECB mode, which is not secure. For your use-case, a stream cipher would be a better fit. Erlang supports RC4 and AES-CTR, but since RC4 itself is considered weak, that leaves only AES-CTR.
Here’s how to encode a stream of data read from a binary file:
key = :crypto.strong_rand_bytes(16)
iv = :crypto.strong_rand_bytes(16)
out = File.open!("play.mp4.encrypted", [:binary, :write])
IO.binwrite(out, iv)
File.stream!("play.mp4", [], 1024) |> Enum.reduce(:crypto.stream_init(:aes_ctr, key, iv), fn chunk, state ->
{new_state, data} = :crypto.stream_encrypt(state, chunk)
IO.binwrite(out, data)
new_state
end)
File.close(out)
To decode the file:
key = "???" # same key as before
out = File.open!("play2.mp4", [:binary, :write])
source = File.open!("play.mp4.encrypted", [:binary])
iv = IO.binread(source, 16)
IO.binstream(source, 1024) |> Enum.reduce(:crypto.stream_init(:aes_ctr, key, iv), fn chunk, state ->
{new_state, data} = :crypto.stream_decrypt(state, chunk)
IO.binwrite(out, data)
new_state
end)
File.close(source)
File.close(out)