Форум программистов, компьютерный форум, киберфорум
ПерС
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Шифрование сдвигом полубайтов и инверсией

Запись от ПерС размещена 03.12.2013 в 08:11
Показов 4622 Комментарии 6

Реализовать функции шифровки и дешифровки методом циклического сдвига битов на 1 бит вправо в левом полубайте и на 1 бит влево в правом полубайте asci-кодов символов с инверсией всех битов.
Функция shift1 выполняет кодирование байта "туда", а shift2 - "обратно". Поскольку для всех возможных значений байта от 0 до 255 включительно проверяется соответствие дважды перекодированного байта начальному, то есть надежда, что функции работают правильно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
unsigned char shift1 (unsigned char b) {
 unsigned char bit=b&0x08?1:0;
 unsigned char right=((b<<1)&0x0E)|bit;
 bit=b&0x10?0x80:0;
 unsigned char left=bit|((b>>1)&0x70);
 return ~(left|right);
}
unsigned char shift2 (unsigned char b) {
 b=~b;
 unsigned char bit=b&0x80?0x10:0;
 unsigned char left=((b<<1)&0xE0)|bit;
 bit=b&0x01?0x08:0;
 unsigned char right=bit|((b>>1)&0x07);
 return left|right;
}
int main() {
 unsigned char c,c1,c2; int i,bad=0;
 for (i=0; i<256; i++) {
  c=(unsigned char)i;
  c1=shift1(c);
  c2=shift2(c1);
  if (c2!=c) {
   printf ("\n%c (0x%02X) => %c (0x%02X) => %c (0x%02X)",c,c,c1,c1,c2,c2);
   bad++;
  }
 }
 if (!bad) printf ("\nВСЕ ВЕРНО");
 else printf ("\nНЕВЕРНЫХ БАЙТ: %d",bad);
 fflush(stdin);
 getchar();
 return 0;
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 6
Комментарии
  1. Старый комментарий
    Это вообще не шифр, так как предусматривает единственное преобразование. Шифр должен иметь ключ, здесь его нет, это просто альтернативная кодировка, не более. От если циклический сдвиг младшего полубайта на n бит, циклический сдвиг правого полубайта на m бит и потом ещё результат ксорится, тогда другое дело. А так это код, но не шифр. И для циклического сдвига не принципиально, выполняется ли он вправо, или влево, так как циклический сдвиг, например полубайта на 1 влево эквивалентен циклическому сдвигу того же полубайта на 3 вправо.
    Запись от размещена 03.12.2013 в 13:25
  2. Старый комментарий
    Аватар для programina
    Намально! Но такое форматирование кода нечитаемо, или это тоже шифрование?
    Запись от programina размещена 03.12.2013 в 22:53 programina вне форума
  3. Старый комментарий
    Аватар для ПерС
    это просто учебная задача
    при желании можно к каждой из функций добавить параметр "число шагов" и делать сдвиг столько раз, сколько записано в этом параметре
    Запись от ПерС размещена 05.12.2013 в 13:59 ПерС вне форума
  4. Старый комментарий
    Аватар для ПерС
    для меня лично куда более нечитаемы отступы в одну или две табуляции, из-за которых нужна горизонтальная прокрутка
    Запись от ПерС размещена 05.12.2013 в 14:01 ПерС вне форума
  5. Старый комментарий
    Полубайт можно двигать от одного до трёх раз, это три варианта. И инвертировать чётное, или не чётное количество раз. Если независимо от сдвигов, то получаем 3*2=6. Разделив сдвиги младшего и старшего полубайтов и инверсию, получаем (4*4-1)*2+1=31. Мало и долго. Надо двигать сразу на заданное ключом количество бит и результат подвергать исключающему или, это даст хотя бы 256*4*4-1=4095 вариантов. Если к этому добавить отдельный ключ для каждого байта сообщения, то шифр становится теоретически не вскрываемым с количеством вариантов каждого ключа 256*4*4=4096 при 256-ти вариантах самого байта.
    Запись от размещена 05.12.2013 в 14:58
  6. Старый комментарий
    [QUOTE=ПерС;bt7971]для меня лично куда более нечитаемы отступы в одну или две табуляции, из-за которых нужна горизонтальная прокрутка[/QUOTE]Если проект тянется хоты бы месяц, то там вполне ожидаемы не влезающие в экран имена переменных, так что горизонтальная прокрутка не может быть исключена в любом случае.
    Запись от размещена 05.12.2013 в 15:00
 
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru