The trick is not to box the closure, but the iterator as a whole.
fn ceaser_cipher_iter<'a>(data: &'a Vec, key: u8) -> Box + 'a> {
Box::new(data.iter().map(move |&p| p^key))
}
Note that because the iterator uses a borrow, I had to add lifetime annotations so that the code would pass borrow checking.