Программирование на Linux
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Если вы программируете на Linux тогда поможем новичкам
Господа, а что приведенный выше код выполняет. Какие выполняет задачи, и какая цель? А, то, смотрел, смотрел на этот код, а врубиться не смог. В частности, что за константные статические беззнаковые массивы символом, и интерсный алгоритм обработки?
а чему равна keylength?
в gost_setkey() мусор передаешь?
тогда в
temp = (((u32 )key[j] << 24) | ((u32 )key[(j + 1) % keylen] << 16) |((u32 )key[(j + 2) % keylen] << 8) |((u32 )key[(j + 3) % keylen]));
K[i] = temp;
j = (j + 4) % keylen;
происходит выход за границы массива
Здравствуйте всем :-)
Хочу попросить у Вас совета.
Linux стоит у меня уже половина года (Ubuntu последняя версия) мне она очень понравилась.
Я очень хочу освоить программирование на языке Си ну например в QT и распространять их бесплатно в помощь всем любителям этой операционной системы и не только. Я очень благодарен всем тем, кто пишет полезные программы и распространяет их совершенно бесплатно. До этого я писал под Windows на дельфи простенькие программы, но я хочу освоить язык Си и писать для платформ Linux. Пожалуйста, помогите найти необходимый хороший материал именно для начинающих изучить Си и QT. Если можете укажите пожалуйста ссылки для скачивания и т.п.
Безплатно говорите? Ну не в этом суть GNU/Linux. Тот же батька Торвальдс написал не просто безплатную ОС, а распространяет ее с исходниками Что конечно же помогло подтянуть ему коллег.
Или другой пример: Когда-то давно я написал на QT одну утилиту, но она была в "недописанном" состоянии- работала только с русскими кодировками, где-то встречались "вылеты" из-за необрабатываемых ошибок. Потом, спустя какое-то время эта программа попалась на глаза одному программисту и он взял ее под свою опеку (ибо назначение программы было стоящим).
То есть распространение своих программ с исходниками принесет не только славу, почет, уважение и малиновые штаны, а еще и развитие Вашего продукта.
Теперь к сути вопроса.
Если будете писать на LGPL - версии QT, то исходники придется показать. Там в лицензии так написано. Ну для меня лично ничего в этом страшного не было: Убрал из коментов матерные слова и выложил на sourceforge.
Если Вы выбрали QT в качестве граф. библиотеки, то поищите книгу Макса Шлее "QT. Профессиональное программирование на C++" (наиболее свежее издание). Эта книга помогла мне понять, как программировать с QT.


#include "linux/init.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "errno.h"
#include "stdio.h"
#include "string.h"
#typedef unsigned int u32;
#typedef unsigned char u8;
struct gost_ctx {
u32 k[8];
char k87[256],k65[256],k43[256],k21[256];
};
static unsigned char const k8[16] = { 0x1, 0xF, 0xD, 0x0, 0x5, 0x7, 0xA, 0x4, 0x9, 0x2, 0x3, 0xE, 0x6, 0xB, 0x8, 0xC };
static unsigned char const k7[16] = { 0xD, 0xB, 0x4, 0x1, 0x3, 0xF, 0x5, 0x9, 0x0, 0xA, 0xE, 0x7, 0x6, 0x8, 0x2, 0xC };
static unsigned char const k6[16] = { 0x4, 0xB, 0xA, 0x0, 0x7, 0x2, 0x1, 0xD, 0x3, 0x6, 0x8, 0x5, 0x9, 0xC, 0xF, 0xE };
static unsigned char const k5[16] = { 0x6, 0xC, 0x7, 0x1, 0x5, 0xF, 0xD, 0x8, 0x4, 0xA, 0x9, 0xE, 0x0, 0x3, 0xB, 0x2 };
static unsigned char const k4[16] = { 0x7, 0xD, 0xA, 0x1, 0x0, 0x8, 0x9, 0xF, 0xE, 0x4, 0x6, 0xC, 0xB, 0x2, 0x5, 0x3 };
static unsigned char const k3[16] = { 0x5, 0x8, 0x1, 0xD, 0xA, 0x3, 0x4, 0x2, 0xE, 0xF, 0xC, 0x7, 0x6, 0x0, 0x9, 0xB };
static unsigned char const k2[16] = { 0xE, 0xB, 0x4, 0xC, 0x6, 0xD, 0xF, 0xA, 0x2, 0x3, 0x8, 0x1, 0x0, 0x7, 0x5, 0x9 };
static unsigned char const k1[16] = { 0x4, 0xA, 0x9, 0x2, 0xD, 0x8, 0x0, 0xE, 0x6, 0xB, 0x1, 0xC, 0x7, 0xF, 0x5, 0x3 };
static int gost_setkey(struct gost_ctx *ctx, const u8 *key, unsigned int keylen){
unsigned int *K = ctx->k;
short i, j;
unsigned int temp;
for (i = 0; i < 256; i++) {
ctx->k87[i] = k8[i >> 4] << 4 | k7[i & 15];
ctx->k65[i] = k6[i >> 4] << 4 | k5[i & 15];
ctx->k43[i] = k4[i >> 4] << 4 | k3[i & 15];
ctx->k21[i] = k2[i >> 4] << 4 | k1[i & 15]; }
for (j = 0, i = 0; i < 8; i++) {
temp = (((u32 )key[j] << 24) | ((u32 )key[(j + 1) % keylen] << 16) |((u32 )key[(j + 2) % keylen] << 8) |((u32 )key[(j + 3) % keylen]));
K[i] = temp;
j = (j + 4) % keylen;
}
return 0;
}
int main(void) {
struct gost_ctx *ctx;
// здесь key1 - буфер
gost_setkey(ctx,key1,keylength);
return 0;
}
-------------------------------
gcc gost.c
./a.out
-------------------------------
дает ошибка Seqmentation fault
Помогите люди !!!