With *a*Â âˆˆ {0,1} and *b*Â âˆˆ {0,1}, the XOR function {0,1}â†’{0,1} can be defined by the truth table:

**a** |
**b** |
**a XOR b** |

0 |
0 |
0 |

0 |
1 |
1 |

1 |
0 |
1 |

1 |
1 |
0 |

Gimp doesn’t have a layer operation called XOR but there is the “Difference” mode defined by the Gimp User Manual by the equation:

$latex E =|I – M|$

Applying the formula to the Red Green Blue color mode for a pixel we have:

$latex rgb(|r_I-r_M|,|g_I-g_M|,|b_I-b_M|) =|rgb(r_I,g_I,b_I) – rgb(r_M,g_M,b_M)|$

The truth table for the “difference” mode is:

**I** |
**M** |
**|I – M|** |

rgb(0,0,0) |
rgb(0,0,0) |
rgb(0,0,0) |

rgb(0,0,0) |
rgb(255,255,255) |
rgb(255,255,255) |

rgb(255,255,255) |
rgb(0,0,0) |
rgb(255,255,255) |

rgb(255,255,255) |
rgb(255,255,255) |
rgb(0,0,0) |

Let’s call black-white representation this binary pallet:

- the white color, i.e. rgb(255,255,255), represent the number 1
- the black color, i.e. rgb(0,0,0), represent the number 0.

Then the truth table for the difference is the same as the XOR one.

## Experimenting with images

Let A_0101.png be this image:

And B_0011.png be this image:

Notice that each image use the black-white representation of the binary message in the file name.

After we apply the “Difference” layer mode with the two images we have what we can call AXORB_0110.png:

## One-time pad

Let message.png be this 512×512 image using a 1-bit pallet (Lena with Floydâ€“Steinberg dithering):

And key.png a image of the same size and pallet with random content:

We can create a image messageXORkey.png using the Gimp’s different mode:

The messageXORkey.png looks as random as the key or any other random key.

Someone in possession of messageXORkey.png and key.png can apply a XOR to retrieve message.png. That’s because:

messageXORkey.png = message.png XOR key.png

messageXORkey.png XOR key.png = message.png XOR key.png XOR key.png

messageXORkey.png XOR key.png = message.png XOR 0

messageXORkey.png XOR key.png = message.png

## Considerations

This was a demonstration of how to use GIMP to encode and decode one-time pads. There are several constraints to use one-time pads in a secure way for practical purposes that you should know before using it in a real situation.