String Bit Manipulation- There and Back Again
Ruby, 230 191 181 178 175 173 171 159 bytes

i,n=$*
s=i.gsub(/./){|c|"%08b"%c.ord}
n.scan(/(.)(.)/){s.size.times{|i|s[j=i+(s[i]==?0?$1:$2).to_i]&amp;&amp;s[j]=s[j]==?0??1:?0}}
$&gt;&lt;&lt;s.gsub(/.{8}/){|c|c.to_i(2).chr}


It's just a very naive implementation of the spec. Input via command-line arguments, output to STDOUT.

# Read ARGV into i and n
i,n = $*
# Turn each character into a string of eight 0s and 1s using a format string.
s = i.gsub(/./){|c|"%08b"%c.ord}
# For each pair of characters in n
n.scan(/(.)(.)/){
    # For each index into s
    s.size.times{|i|
        # Determine the index that is to be toggled. $1 and $2 refer to the captures 
        # of /(.)(.)/.
        j=i+(s[i]==?0?$1:$2).to_i
        # Using short-circuiting, toggle s[j] if it isn't nil.
        s[j]&amp;&amp;s[j]=s[j]==?0??1:?0
    }
}
# Convert each group of 8 characters back to a single character and print
$&gt;&lt;&lt;s.gsub(/.{8}/){|c|c.to_i(2).chr}