The trick is not to box the closure, but the iterator as a whole.
fn ceaser_cipher_iter<'a>(data: &'a Vec<u8>, key: u8) -> Box<Iterator<Item=u8> + '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.