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}