Взял исходники 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);
}
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Ну, отвечая формально на вопрос,
ты определяешь массив длины Data, а Data — переменная, а не константа. Используй dynamic memory allocation
А вообще… Ошибок в твоей проге немеряно. И читать такой стиль почти невозможно. Что, например, делает бесконечный цикл в конце?
Good Luck,
UT
Действительно бесконечного цикла там быть не должно. Вы не можете по-конкретнее подсказать, как сделать текст произвольной длины кратным 8?
«Сделать» длину текста кратной восьми можно либо добавив в него что-нибудь, либо обрезав. Я не знаю тонкостей алгоритма DES, но мне почему-то кажется, что ни тот, ни другой метод для шифрования не подходит. :-) Я бы поиграл с ключом, в последнем блоке использовал бы столько бит ключа, сколько надо. У тебя какие-то библиотечные функции, посмотри в доках.
Ну а вообще (только ты не обижайся), тебе сначала надо бы подучиться программированию на С++ в общем, а потом уже браться за такие задачи. Начни с программы, которая бы решала квадратное уравнение (и вводила коэффициенты параметрами командной строки). Потом попробуй отсортировать массив произвольной длины. Будет значительно проще.
Good Luck,
UT
если ты просто хочешь шифровать файлы то бери в одну руку openssl а в другую man
Если хочешь сам учится писать то бери в руку тот же openssl /usr/include/openssl/ а там и дес тебе и мд5 тока доку почитай перед этим.
Вся штука в том, что мне нужно использовать исходный тексе именно из книги Шнайера и программу я должен сделать к 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;
}
Попробовал:
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
Мать моя моржиха! Тебе надо массив, длина которого становится известной в процессе работы программы? Вот тебе массив:
int *x, Data;
Data = strlen(cp);
x = new int[Data];
…
delete [] x;
И в С++ своя библиотека стрингов. И вааще… Зачем тебе это надо?
Good Luck,
UT
Спасибо.
Ни фига не спасибо. В С++ есть своя стринговая библиотека, такие перлы как srtlen и strcpy там на фиг не нужны, как впрочем, и динамический массив данных, пример которого я тебе привел. Ты все равно скидываешь его в строку, что б тебе его строкой изначально не сделать?
Фишка в том, что твой оригинальный пример написан на С, а не на С++, а это два разных языка. По твоему варианту программы абсолютно понятно, что сиплюсплюса ты не знаешь напрочь. Отсюда вопрос — нафиг тебе это надо? Тебе нужно сначала изучить язык, а потом уже заниматься написанием прог такого уровня.
Good Luck,
UT