Citadel's VisualEncrypt and VisualDecrypt
The way you handle the first element as a special case is cumbersome: you're basically unrolling the first iteration of the loop.  You could just initialize value = 0 so that the first XOR just copies the input to the output.

template &lt;class InputIterator, class OutputIterator&gt;
OutputIterator VisualEncrypt (InputIterator begin, InputIterator end, OutputIterator destination)
{
    typedef typename std::iterator_traits&lt;InputIterator&gt;::value_type T;
    T value = 0;
    while (begin != end) {
        value ^= *begin++;
        *destination++ = value ;
    }

    return destination ;
}

template &lt;class InputIterator, class OutputIterator&gt;
OutputIterator VisualDecrypt (InputIterator begin, InputIterator end, OutputIterator destination)
{
    typedef typename std::iterator_traits&lt;InputIterator&gt;::value_type T;
    T value = 0;

    while (begin != end) {
        T temp = *begin++;
        *destination++ = value ^ temp ;
        value = temp ;
    }

    return destination ;
}


Alternatively, use a for-loop, which results in slightly more compact code and gets the pesky side-effect ++ operators out of the way.

template &lt;class InputIterator, class OutputIterator&gt;
OutputIterator VisualEncrypt(InputIterator begin, InputIterator end, OutputIterator destination)
{
    typedef typename std::iterator_traits&lt;InputIterator&gt;::value_type T;
    for (T value = 0; begin != end; ++begin, ++destination) {
        *destination = (value ^= *begin);    // &lt;-- Probably controversial one-liner
    }

    return destination;
}

template &lt;class InputIterator, class OutputIterator&gt;
OutputIterator VisualDecrypt(InputIterator begin, InputIterator end, OutputIterator destination)
{
    typedef typename std::iterator_traits&lt;InputIterator&gt;::value_type T;
    for (T value = 0; begin != end; ++begin, ++destination) {
        T temp = *begin;
        *destination = value ^ temp;
        value = temp;
    }

    return destination;
}