nixp.ru v3.0

26 мая 2017,
пятница,
04:55:11 MSK

DevOps с компанией «Флант»
anonymous написал 4 марта 2005 года в 00:01 (912 просмотра) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

Взял исходники DES в книге Шнайера. Хочу заставить шифровать любой введённый текст, для этого изменил функию main(), но так как я чайник, то видимо накосячил и при компилировании выдаются две ошибки:

constant expression required

Lvalue required

по поводу строк:

char x[Data];

x =cp;

Подскажите, что я сделал неправильно и как это исправить. И ещё один вопрос: как заставить эту прогу шифровать файл, указанный как параметр при вызове этой проги в командной строке? Подозреваю, что через параметры функции main(), но как реализовать не знаю.

Вот текст функции main():

void main(void){

des_ctx dc;

int i;

unsigned long Data;

char *cp,key[8];

cout<<"\nVvedite key: »;

for (i=0;i<8;i++) cin>>key;

cout<<"\nVvedite text: » ;

cin >> cp;

unsigned int lVal ;

lVal = strlen(cp) % 8 ;

if (lVal != 0) Data= strlen(cp) + 8 — lVal ;

else Data=strlen(cp);

char x[Data];

x =cp;

des_key(&dc,key);

for (i=0;i

cout<<"\nEncrypt text:»;

cout<<x;

for (i=0;i

cout<<"\nDecrypt text:»;

cout<<x;

while (1);

}

Uncle Theodore

Ну, отвечая формально на вопрос,

ты определяешь массив длины Data, а Data — переменная, а не константа. Используй dynamic memory allocation

А вообще… Ошибок в твоей проге немеряно. И читать такой стиль почти невозможно. Что, например, делает бесконечный цикл в конце?

Good Luck,

UT

anonymous

Действительно бесконечного цикла там быть не должно. Вы не можете по-конкретнее подсказать, как сделать текст произвольной длины кратным 8?

Uncle Theodore

«Сделать» длину текста кратной восьми можно либо добавив в него что-нибудь, либо обрезав. Я не знаю тонкостей алгоритма DES, но мне почему-то кажется, что ни тот, ни другой метод для шифрования не подходит. :-) Я бы поиграл с ключом, в последнем блоке использовал бы столько бит ключа, сколько надо. У тебя какие-то библиотечные функции, посмотри в доках.

Ну а вообще (только ты не обижайся), тебе сначала надо бы подучиться программированию на С++ в общем, а потом уже браться за такие задачи. Начни с программы, которая бы решала квадратное уравнение (и вводила коэффициенты параметрами командной строки). Потом попробуй отсортировать массив произвольной длины. Будет значительно проще.

Good Luck,

UT

Steck

если ты просто хочешь шифровать файлы то бери в одну руку openssl а в другую man

Если хочешь сам учится писать то бери в руку тот же openssl /usr/include/openssl/ а там и дес тебе и мд5 тока доку почитай перед этим.

anonymous

Вся штука в том, что мне нужно использовать исходный тексе именно из книги Шнайера и программу я должен сделать к 9 марта. Помогите исправить первую ошибку. Простите за глупый вопрос, но как использовать dynamic memory allocation?

Для того, чтобы понять механизм работы программы я приведу main() оригинала и результат работы:

void main(void){

des_ctx dc;

int i;

unsigned long Data[10];

char *cp,key[8] = {0×01,0×23,0×45,0×67,0×89,0xab,0xcd,0xef};

char x[8] = {0×01,0×23,0×45,0×67,0×89,0xab,0xcd,0xe7};

cp = x;

des_key(&dc,key);

des_enc(&dc,cp,1);

printf(«Enc(0..7,0..7) = »);

for(i=0;i<8;i++) printf(«%02x », ((unsigned int) cp)&0×00ff);

printf(«\n»);

des_dec(&dc,cp,1);

printf(«Dec(above,0..7) = »);

for(i=0; i < 8; i++) printf(«%02x »,((unsigned int)cp)&0×00ff);

printf(«\n»);

cp = (char *) Data;

for(i=0; i<10; i++) Data=i;

des_enc(&dc, cp ,5); /* Enc 5 blocks. */

for(i=0; i<10; i+=2) printf(«Block %01d = %08lx %08lx.\n»,

i/2, Data, Data[i+1]);

des_dec(&dc,cp,1);

des_dec(&dc,cp+8,4);

for(i=0; i<10; i+=2) printf(«Block %01d = %08lx %08lx.\n»,

i/2,Data,Data[i+1]);

}

Результат:

Enc(0..7,0..7) = c9 57 44 25 6a 5e d3 1d //зашифрованный текст

Dec(above,0..7) = 01 23 45 67 89 ab cd e7 //расшифрованный текст

Block 0 = e13d88f2 491e0673.

Block 1 = 5c22d890 9406b78d.

Block 2 = 81fb51dd 067b2304.

Block 3 = cccdeae5 98925940.

Block 4 = 6eb1a19f 759a3c82.

Block 0 = 00000000 00000001.

Block 1 = 00000002 00000003.

Block 2 = 00000004 00000005.

Block 3 = 00000006 00000007.

Block 4 = 00000008 00000009.

Моя main() c ошибкой:

void main(void){

des_ctx dc;

int i;

unsigned long Data;

char *cp,key[8];

cout<<"\nVvedite key: »;

for (i=0;i<8;i++) cin>>key;

cout<<"\nVvedite text: » ;

cin >> cp;

//размер текста делаю кратным 8 (увеличивая)

unsigned long lVal ;

lVal = strlen(cp) % 8 ;

if (lVal != 0) Data= strlen(cp) + 8 — lVal ;

else Data=strlen(cp);

char x[Data];

strcpy(x, cp);

//инициализация ключей

des_key(&dc,key);

//шифрование

for (i=0;i

cout<<"\nEncrypt text:»;

cout<<x;

//расшифрование

for (i=0;i

cout<<"\nDecrypt text:»;

cout<<x;

}

anonymous

Попробовал:

unsigned int lVal ;

lVal = strlen(cp) % 8 ;

if (lVal != 0) Data= strlen(cp) + 8 — lVal ;

else Data=strlen(cp);

char x[static_cast(Data)];

strcpy((char*)x, cp);

И всё равно в пятой строке та же ошибка: constant expression required

Uncle Theodore

Мать моя моржиха! Тебе надо массив, длина которого становится известной в процессе работы программы? Вот тебе массив:

int *x, Data;

Data = strlen(cp);

x = new int[Data];

delete [] x;

И в С++ своя библиотека стрингов. И вааще… Зачем тебе это надо?

Good Luck,

UT

anonymous

Спасибо.

Uncle Theodore

Ни фига не спасибо. В С++ есть своя стринговая библиотека, такие перлы как srtlen и strcpy там на фиг не нужны, как впрочем, и динамический массив данных, пример которого я тебе привел. Ты все равно скидываешь его в строку, что б тебе его строкой изначально не сделать?

Фишка в том, что твой оригинальный пример написан на С, а не на С++, а это два разных языка. По твоему варианту программы абсолютно понятно, что сиплюсплюса ты не знаешь напрочь. Отсюда вопрос — нафиг тебе это надо? Тебе нужно сначала изучить язык, а потом уже заниматься написанием прог такого уровня.

Good Luck,

UT