Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

Метод шифрования Локи91 - C++

30.04.2012, 18:37. Просмотров 508. Ответов 0
Метки нет (Все метки)

Дан код, нужно его подредактировать. У меня выдает какие то не понятные ошибки. Вроде все правильно но не работает(((

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include <stdio.h>
 
#define LOKIBLK 8
#define ROUNDS 16
typedef unsigned long Long;
extern Long lokikey[2];
extern char *loki_lib_ver;
 
#ifdef __STDC__
/* declare prototypes for library functions */
extern void enloki(char *b);
extern void deloki(char *b);
extern void setlokikey(char key[LOKIBLK]);
#else
/* else just declare library functions extern */
 
extern void enloki(), deloki(), setlokikey();
#endif __STDC__
char P[32] = {31, 23, 15, 7, 30, 22, 14, 6,
          9, 21, 13, 5, 28, 20, 12, 4,
          27, 19, 11, 3, 26, 18, 10, 2,
          25, 17, 9, 1, 24, 16, 8, 0};
typedef struct {
  short gen;
  short exp;
} sfn_desc;
 
sfn_desc sfn[] = {
          { /* 101110111 */ 375, 31}, {/* 101111011 */ 379, 31},
          { /* 110000111 */ 391, 31}, {/* 110001011 */ 395, 31},
          { /* 110001101 */ 397, 31}, {/* 110011111 */ 415, 31},
          { /* 110100011 */ 419, 31}, {/* 110101001 */ 425, 31},
          { /* 110110001 */ 433, 31}, {/* 110111101 */ 445, 31},
          { /* 111000011 */ 451, 31}, {/* 111001111 */ 463, 31},
          { /* 111010111 */ 471, 31}, {/*  111011101*/ 477, 31},
          { /* 111100111 */ 487, 31}, {/* 111110011 */ 499, 31},
          { 00, 00} 
     };
 
typedef struct {
  Long loki_subkeys[ROUNDS];
} loki_ctx;
 
static long f();
static short s();
 
#define ROL12(b) b = ((b << 12) | (b >> 20));
#define ROL13(b) b = ((b << 13) | (b >> 19));
 
#ifdef LITTLE_ENDIAN
#define bswap(cb) {
  register char  c;
  c = cb[0]; cb[0] = cb[3]; cb[3] = c;
  c = cb[1]; cb[1] = cb[2]; cb[2] = c;
  c = cb[4]; cb[4] = cb[7]; cb[7] = c;
  c = cb[5]; cb[5] = cb[6]; cb[6] = c;
}
#endif
 
void setlokikey(loki_ctx *c, char *key) {
  register int i;
  register Long KL, KR;
#ifdef LITTLE_ENDIAN
  bswap(key);
#endif
  KL = ((Long *)key)[0];
  KR = ((Long *)key)[1];
  for (i=0; i<ROUNDS; i+=4) {
    c->loki_subkeys[i] = KL;
    ROL12 (KL);
    c->loki_subkeys[i+1] = KL;
    ROL13 (KL);
    c->loki_subkeys[i+2] = KR;
    ROL12 (KR);
    c->loki_subkeys[i+3] = KR;
    ROL13 (KR);
  }
#ifdef LITTLE_ENDIAN
  bswap(key);
#endif
}
 
void enloki (loki_ctx *c, char *b) {
  register int i;
  register long L, R;
#ifdef LITTLE_ENDIAN
  bswap(b);
#endif
  L = ((Long *)b)[0];
  R = ((Long *)b)[1];
  
  for (int i=0; i<ROUNDS; i+=2) {
    L ^= f(R, c->loki_subkeys[i]);
    R ^= f(L, c->loki_subkeys[i+1]);
  }
  ((Long *)b)[0] = R;
  ((Long *)b)[1] = L;
#ifdef LITTLE_ENDIAN
  bswap(b);
#endif
}
 
void deloki(loki_ctx *c, char *b) {
  register int i;
  register long L, R;
#ifdef LITTLE_ENDIAN
  bswap(b);
#endif
  L = ((Long *)b)[0];
  R = ((Long *)b)[1];
  for (i=ROUNDS; i>0; i-=2) {
    L ^= f(R, c->loki_subkeys[i-1]);
    R ^= f(L, c->loki_subkeys[i-2]);
  }
  ((Long *)b)[0] = R;
  ((Long *)b)[1] = L;
}
 
#define MASK12 0x0fff
 
static long f(long r, long k){
    register long r; /* Data value R(i-1) */
    long k;      /* Key K(i) */
      long a, b, c; /* 32 bit S-box output, & P output */
      a = r ^ k; /* A = R(i-1) XOR K(i) */
      /* want to use slow speed/small size version */
      b = ((Long)s((a & MASK12)) ) | /* B = S(E(R(i-1))^K(i)) */
          ((Long)s(((a >> 8) & MASK12)) << 8) |
          ((Long)s(((a >> 16) & MASK12)) << 16) |
          ((Long)s((((a >> 24) | (a << 8)) & MASK12)) << 24);
      perm32(&c, &b, P);  /* C = P(S( E(R(i-1)) XOR K(i))) */
      return(c); /* f returns the result C */
}
 
static short s(long i){
  register long i; /* return S-box value for input i */
  register short r, c, v, t;
  short exp8(); /* exponentiation routine for GF(2^8) */
  r = ((i>>8) & 0xc) | (i & 0x3);
  c = (i>>2) & 0xff;
  t = (c + ((r * 17) ^ 0xff)) & 0xff;
  v = exp8(t, sfn[r].exp, sfn[r].gen);
return(v);
}
 
#define MSB 0x80000000L /* MSB of 32-bit word */
 
 void perm32(long* out, long* in, char* perm){
  long *out;    /* Output 32-bit block to be permuted */
  long *in; /* Input 32-bit block to be permuted */
  char perm[32];/* Permutation array */
 
  Long mask = MSB;
  register int i, o, b;
  register char *p = perm;
  *out = 0;
  for (o=0; o<32; o++) {
    i =(int)*p++;
    b = (*in >> i) & 01;
    if (b)
    *out |= mask;
    mask >>= 1;
  }
}
 
#define SIZE 256
 
short mult8(short a,short b,short gen){
    short a, b;
    short gen;
    short product = 0; /* result of multiplication */
    while(b != 0) {
        if (b & 01)
            product ^= a;
        a <<= 1; /* shift multiplicand one place */
        if (a >= SIZE)
            a ^= gen; /* and modulo reduce if needed */
        b >>= 1; /* shift multiplier one place */
    }
    return(product);
}
 
short exp8(short base, short exponent, short gen){
  short base;
  short exponent;
  short gen;
  short accum = base;/* superincreasing sequence of base */
  short result = 1;
  if (base == 0)
    return(0);
  while (exponent != 0) { /* repeat while exponent non-zero */
    if (( exponent & 0x0001) == 0x0001)
      result = mult8(result, accum, gen);
    exponent >>= 1;
    accum = mult8(accum, accum, gen);
  }
  return(result);
}
 
void loki_key(loki_ctx *c, unsigned char *key){
  setlokikey(c, key);
}
 
void loki_enc(loki_ctx *c, unsigned char *data, int blocks){
  unsigned char *cp;
  int i;
  cp = data;
  for(i=0;i<blocks;i++){
    enloki(c,cp);
    cp+=8;
  }
}
 
void loki_dec(loki_ctx *c, unsigned char *data, int blocks){
  unsigned char *cp;
  int i;
  cp = data;
  for(i=0;i<blocks;i++){
    deloki(c, cp);
    cp+=8;
  }
}
 
void main(void){
  loki_ctx lc;
  unsigned long data[10];
  unsigned char *cp; 
  unsigned char key[] = {0,1,2,3,4,5,6,7};
  int i;
  for(i=0;i<10;i++) 
    data[i]=i;
  
  loki_key(&lc,key);
  cp = (char*)data;
  loki_enc(&lc,cp,5);
  
  for(i=0;i<10;i+=2) 
    printf("Block %01d = %08lx %08lx\n",i/2,data[i],data[i+1]);
  
  loki_dec(&lc,cp,1);
  loki_dec(&lc,cp+8,4);
  
  for(i=0;i<10;i+=2) 
    printf("Block %01d = %08lx %08lx\n",i/2,data[i],data[i+1]);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2012, 18:37     Метод шифрования Локи91
Посмотрите здесь:

Метод шифрования - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { setlocale(0, &quot;RUS&quot;); ifstream...

Метод шифрования на основе перестановок байтов в пределах сообщения - C++
Нужен рабочий пример! Метод шифрования предусматривает реализацию двух этапов: инициализации и перестановка байтов. Этап...

шифрования - C++
Помогите мне с этим кодом, не работает должным образом... Он должен шифровать текст в текстовом файле encode.txt, а затем он должен...

Примеры XOR шифрования - C++
Здравствуйте. Хотелось бы увидеть примеры XOR шифрования на C++, т.к. в интернете я не сильно много нашел (возможно плохо искал). Искал...

Программа для шифрования - C++
Я сис-админ, не уверен что правильно будет писать на Си, но это единственный язык, который еле еле знаю, акромя вбс и проч, разумеется ...

Программа шифрования текста - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace std; int...

Не работает реализация шифрования - C++
Помогите , программа не работает , как таковых ошибок нет , но и не шифрует . //Melnik M . V . #include &lt;stdio.h&gt; #include...

Считывания для шифрования - C++
Возник вопрос как можно с файла считывать куски определенного размера для дальнейшего их шифрования(дешифрования)??

Программа шифрования\дешифрования - C++
Уважаемые программисты! Хочу попросить у Вас помощи в написании 2-х программ... Я ещё не очень силён в программировании, плюс ко всему...

принцип блочного шифрования - C++
проблема такая,я понимаю как работает блочный шифр,но не могу реализовать его для реального шифрования файлов. например вот самый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru