001package co.codewizards.cloudstore.core.otp;
002
003import java.security.SecureRandom;
004
005/**
006 * Simple implementation of one-time pad encryption technique.
007 *
008 * @author Wojtek Wilk - wilk.wojtek at gmail.com
009 */
010public class OneTimePadEncryptor {
011
012        private final SecureRandom random = new SecureRandom();
013
014        public Result encrypt(byte[] message){
015                byte[] randomKey = new byte[message.length];
016                random.nextBytes(randomKey);
017
018                byte[] encrypted = new byte[message.length];
019                for(int i=0; i<message.length; i++){
020                        encrypted[i] = (byte) (message[i] ^ randomKey[i]);
021                }
022                return new Result(randomKey, encrypted);
023        }
024
025        public byte[] decrypt(byte[] encryptedMessage, byte[] randomKey){
026                if(encryptedMessage.length != randomKey.length){
027                        throw new IllegalArgumentException("message and key have to be of the same length");
028                }
029                byte[] decodedMessage = new byte[encryptedMessage.length];
030
031                for(int i=0;i<encryptedMessage.length; i++){
032                        decodedMessage[i] = (byte) (encryptedMessage[i] ^ randomKey[i]);
033                }
034                return decodedMessage;
035        }
036
037        public static class Result{
038                private final byte[] randomKey;
039                private final byte[] encryptedMessage;
040
041                public Result(byte[] randomKey, byte[] encryptedMessage){
042                        this.randomKey = randomKey;
043                        this.encryptedMessage = encryptedMessage;
044                }
045
046                public byte[] getRandomKey() {
047                        return randomKey;
048                }
049
050                public byte[] getEncryptedMessage() {
051                        return encryptedMessage;
052                }
053        }
054}