Сначала - попробуйте переписать ваше приложение, чтобы использовать правильные типы данных, то есть вы будете работать с типом byte[]
с битами в битах.Тогда его легко читать, писать, кодировать, кодировать, декодировать.Без этого очень мало людей, которые попытаются понять ваши собственные конструкции.Поэтому я буду также предполагать, что вы это сделаете.
Далее - действительно нет смысла реализовывать собственные операции кодирования (например, stringToBinary), ищите простые способы кодирования ваших данных в шестнадцатеричное или base64.Для Hex вы можете использовать org.apache.commons.codec.binary.Hex
, для Base64 у вас уже есть класс java.util.Base64
.Это будет гораздо более читабельным для вас и всех, кто захочет помочь
В Шифровании, как я могу сделать размер ключа гибким в соответствии с размером открытого текста и генерировать случайным образом, например,размер открытого текста составляет 4 буквы, поэтому размер ключа массива должен быть 32-разрядным, поскольку каждая буква имеет 8-разрядный код.
Предполагая, что вы наконец переписали свое приложение для работы с байтовыми массивами, вы можете написать
SecureRandom sr = new SecureRandom();
byte[] keyBytes = new bytes[4];
sr.nextBytes (keyBytes);
, что сгенерирует 4 байта с высокой энтропией.Однако - существует проблема со всем подходом:
Для расшифровки данных вам необходимо сохранить ключ длины сообщения, и вы можете использовать ключ только один раз с однимсообщение (это особенность одноразовой панели).
Представьте, что у вас гораздо длиннее сообщение, скажем - в килобайтах.SecureRandom может очень медленно генерировать ключ произвольной (большей) длины или может выдавать не совсем случайные данные.Короче говоря - именно поэтому PRNG используются (часто я вижу потоковый шифр ChaCha или Salsa20, используемый как PRNG) для генерации произвольной длины случайно выглядящих данных из исходного ключа.
В Decryption, как я могу читать из файлов и этих двух файлов в двоичном виде, а затем делать XOR между ними, а затем распечатывать его в виде ASCLL.
Как только вы переписываете свое приложение для использования byte[]
типов, тогда (как уже прокомментировал Мартен) у вас есть FileInputStream и FileOutputStream в ваше распоряжение (и это легко сделать XOR байтами a ^ b
)