Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Blowfish code in Matlab

Status
Not open for further replies.

klun

Junior Member level 2
Joined
May 1, 2015
Messages
20
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
386
Can anyone help me in creating matlab source code for Blowfish algorithm, for encrypting and decrypting password? need it urgently.
 

Thanks for the replies. I studied that many of the Blowfish algorithm is written in C or C++, which giving me trouble as the requirement needs it to be written in Matlab. So any examples of Blowfish code for me to refer to?
 

Perhaps if you post what you've written in C or C++ thus far, using CODE or SYNTAX tags, and point out specific issues you are experiencing with your code, we might be able to provide you with additional advice.
 

I guess, the problem is that the OP don't want to translate the C code to Matlab himself.
 

If I do change C++ to Matlab, does that involve a lot of changes in the body of the algorithm itself? Or only involving the syntax?

- - - Updated - - -

For example, this C code below. Is there any method to implement it in Matlab environment?


Code C - [expand]
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
#ifdef little_endian   /* Eg: Intel */
   #include <dos.h>
   #include <graphics.h>
   #include <io.h>
#endif
 
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#ifdef little_endian   /* Eg: Intel */
   #include <alloc.h>
#endif
 
#include <ctype.h>
 
#ifdef little_endian   /* Eg: Intel */
   #include <dir.h>
   #include <bios.h>
#endif
 
#ifdef big_endian
   #include <Types.h>
#endif
 
#include "Blowfish.h"
 
#define N               16
#define noErr            0
#define DATAERROR         -1
#define KEYBYTES         8
#define subkeyfilename   "Blowfish.dat"
 
unsigned long P[N + 2];
unsigned long S[4][256];
FILE*         SubkeyFile;
 
short opensubkeyfile(void) /* read only */
{
   short error;
 
   error = noErr;
 
   if((SubkeyFile = fopen(subkeyfilename,"rb")) == NULL) {
      error = DATAERROR;
   }
 
   return error;
}
 
unsigned long F(unsigned long x)
{
   unsigned short a;
   unsigned short b;
   unsigned short c;
   unsigned short d;
   unsigned long  y;
 
   d = x & 0x00FF;
   x >>= 8;
   c = x & 0x00FF;
   x >>= 8;
   b = x & 0x00FF;
   x >>= 8;
   a = x & 0x00FF;
   //y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d];
   y = S[0][a] + S[1][b];
   y = y ^ S[2][c];
   y = y + S[3][d];
 
   return y;
}
 
void Blowfish_encipher(unsigned long *xl, unsigned long *xr)
{
   unsigned long  Xl;
   unsigned long  Xr;
   unsigned long  temp;
   short          i;
 
   Xl = *xl;
   Xr = *xr;
 
   for (i = 0; i < N; ++i) {
      Xl = Xl ^ P[i];
      Xr = F(Xl) ^ Xr;
 
      temp = Xl;
      Xl = Xr;
      Xr = temp;
   }
 
   temp = Xl;
   Xl = Xr;
   Xr = temp;
 
   Xr = Xr ^ P[N];
   Xl = Xl ^ P[N + 1];
  
   *xl = Xl;
   *xr = Xr;
}
 
void Blowfish_decipher(unsigned long *xl, unsigned long *xr)
{
   unsigned long  Xl;
   unsigned long  Xr;
   unsigned long  temp;
   short          i;
 
   Xl = *xl;
   Xr = *xr;
 
   for (i = N + 1; i > 1; --i) {
      Xl = Xl ^ P[i];
      Xr = F(Xl) ^ Xr;
 
      /* Exchange Xl and Xr */
      temp = Xl;
      Xl = Xr;
      Xr = temp;
   }
 
   /* Exchange Xl and Xr */
   temp = Xl;
   Xl = Xr;
   Xr = temp;
 
   Xr = Xr ^ P[1];
   Xl = Xl ^ P[0];
 
   *xl = Xl;
   *xr = Xr;
}
 
short InitializeBlowfish(char key[], short keybytes)
{
   short          i;
   short          j;
   short          k;
   short          error;
   short          numread;
   unsigned long  data;
   unsigned long  datal;
   unsigned long  datar;
 
   /* First, open the file containing the array initialization data */
   error = opensubkeyfile();
   if (error == noErr) {
      for (i = 0; i < N + 2; ++i) {
     numread = fread(&data, 4, 1, SubkeyFile);
   #ifdef little_endian      /* Eg: Intel   We want to process things in byte   */
               /*   order, not as rearranged in a longword          */
     data = ((data & 0xFF000000) >> 24) |
        ((data & 0x00FF0000) >>  8) |
        ((data & 0x0000FF00) <<  8) |
        ((data & 0x000000FF) << 24);
   #endif
 
     if (numread != 1) {
        return DATAERROR;
     } else {
        P[i] = data;
     }
      }
 
      for (i = 0; i < 4; ++i) {
     for (j = 0; j < 256; ++j) {
         numread = fread(&data, 4, 1, SubkeyFile);
 
   #ifdef little_endian      /* Eg: Intel   We want to process things in byte   */
               /*   order, not as rearranged in a longword          */
        data = ((data & 0xFF000000) >> 24) |
           ((data & 0x00FF0000) >>  8) |
           ((data & 0x0000FF00) <<  8) |
           ((data & 0x000000FF) << 24);
   #endif
 
         if (numread != 1) {
           return DATAERROR;
        } else {
           S[i][j] = data;
        }
     }
      }
 
      fclose(SubkeyFile);
 
      j = 0;
      for (i = 0; i < N + 2; ++i) {
     data = 0x00000000;
     for (k = 0; k < 4; ++k) {
        data = (data << 8) | key[j];
        j = j + 1;
        if (j >= keybytes) {
           j = 0;
        }
     }
     P[i] = P[i] ^ data;
      }
 
    datal = 0x00000000;
      datar = 0x00000000;
 
      for (i = 0; i < N + 2; i += 2) {
     Blowfish_encipher(&datal, &datar);
 
     P[i] = datal;
     P[i + 1] = datar;
      }
 
      for (i = 0; i < 4; ++i) {
     for (j = 0; j < 256; j += 2) {
 
        Blowfish_encipher(&datal, &datar);
   
        S[i][j] = datal;
        S[i][j + 1] = datar;
     }
      }
   } else {
      printf("Unable to open subkey initialization file : %d\n", error);
   }
 
   return error;
}

 
Last edited by a moderator:

Basically, the code can be translated line by line. Besides usual control structures, there are integer XOR and AND operations, bitshifts and modular additions. If you review the TEA example linked in post #3, you get an idea how teh operations can be implemented in Matlab.
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top