Нарушает ли это каким-либо образом полную секретность?
Да, очевидно. Ограничение пространства сообщения никоим образом не помешает (злоумышленник не может получить никакой дополнительной информации о сообщении, даже если он уже знает о нем довольно много); ограничение ключа делает.
OTP использует групповую операцию для объединения сообщения и ключа; одна вещь, которую он должен предполагать, это то, что члены группы, составляющие ключ, выбираются равномерно случайным образом из всех возможных элементов группы - в вашем примере это не так.
В частности, если мы видим в зашифрованном тексте значение 0111
, мы можем сделать вывод, что соответствующее значение открытого текста не 0000
; в конце концов, для этого ключевое значение было бы 0111
, и мы знаем, что это не так. Это значения, которые злоумышленник может вывести, не являются сообщением, и это является нарушением полной секретности.
Теперь, если у вас есть сообщение и ключ, состоящие из значений от 0 до 6, очевидно, что нужно изменить групповую операцию на «сложение по модулю 7»; то есть, чтобы зашифровать, вы добавляете сообщение к ключу, а затем, если это значение равно 7 или больше, вычитаете 7 - это дает вам зашифрованный текст. И, чтобы расшифровать, вы делаете «вычитание по модулю 7»; вы вычитаете ключ из зашифрованного текста и, если это значение отрицательное, добавляете 7. Это вполне допустимая групповая операция, и поскольку все значения ключа возможны (и предположительно равновероятны), она может удовлетворять требованиям совершенной секретности.