Четверг, 09.01.2025, 11:31
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

Практический пример использования битовых операций

Приведенный ниже пример представлен для приобретения навыков работы с битовыми операциями. Сам алгоритм шифрования, описанный в примере, слабоват для практического использования хотя бы из-за малой длины ключа (ключ может принимать только 255 значений).

// Шифрование / дешифрование данных

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

// Размер типа char в битах
// sizeof(char) << 3 - размер типа данных char * 23
const SizeOfCharInBits = sizeof(char) << 3;

// Создание синонима для существующего типа данных
typedef unsigned char uchar;

// Функция, осуществляющая циклический 
// побитовый сдвиг вправо ключа на один разряд
void RotateRight(uchar & key)
{
 // Выделяем младший разряд
 uchar mask = key & 1;
 // Осуществляем сдвиг
 key >>= 1;
 // Ставим выделенный бит в старший разряд
 key |= mask << (SizeOfCharInBits - 1);
}

// Функция, осуществляющая циклический 
// побитовый сдвиг влево ключа на один разряд
void RotateLeft(uchar & key)
{
 // Выделяем старший разряд
 uchar mask = key & (1 << (SizeOfCharInBits - 1));
 // Осуществляем сдвиг
 key <<= 1;
 // Ставим выделенный бит в младший разряд
 key |= mask >> (SizeOfCharInBits - 1);
}

// Функция, осуществляющая шифрование строки 
int Crypt(char * str)
{
 // Для одноразового вызова функции srand()
 static bool firsttime = 0;

 if(!firsttime)
 {
 srand(time(NULL));
 firsttime = 1;
 }

 // Максимальное значение для типа unsigned char
 int maxchar = (1 << SizeOfCharInBits) - 1;

 // Случайный ключ
 uchar key = (char)(rand() % maxchar + 1);

 // Длина строки
 int len = strlen(str);
 for(int i = 0; i < len; i++)
 {
 // Шифрование очередного символа
 str[i] ^= key;
 // Изменение ключа
 RotateRight(key);
 }

 // Возврат ключа
 return (int)key;
}

// Функция, осуществляющая дешифрование строки 
// startkey - ключ, который вернула функция Crypt
void EnCrypt(char * str, int startkey)
{
 // Преобразование ключа к типу unsigned char
 uchar key = (uchar)startkey;

 // Длина строки
 int len = strlen(str);
 for(int i = len - 1; i >= 0; i--)
 {
 // Изменение ключа
 RotateLeft(key);
 // Дешифрование очередного символа
 str[i] ^= key;
 }
}

void main()
{
 char str[] = "Hello, World!!!";

 cout << "Start string: " << str << endl;

 int key = Crypt(str);

 cout << "Crypted string: " << str << endl;

 EnCrypt(str, key);

 cout << "Encrypted string: " << str << endl;
}
Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 1688 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]