|
"In object-oriented programming, the Liskov substitution principle is a particular definition of subtype, which is based on the notion of substitutability; that is, if S is a subtype of T, then objects of type T in a program may be replaced with objects of type S without altering any of the desirable properties of that program".
"Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T."
for example;
template <typename T>
class propertyQ
{
public:
static void QMethod1(T &objT)
{
objT.operate1();
}
static void QMethod2(T &objT)
{
objT.operate2();
}
};
class superTypeA
{
protected:
int m_iContext;
public:
superTypeA()
: m_iContext(0)
{
}
void operate1()
{
m_iContext = 1;
}
void operate2()
{
m_iContext = 2;
}
};
class subTypeA : public superTypeA
{
public:
void operate2()
{
m_iContext = 21;
}
};
class subTypeB : private superTypeA
{
public:
void operate2()
{
m_iContext = 21;
}
};
int main()
{
subTypeA objA;
subTypeB objB;
propertyQ <subTypeA>::QMethod1(objA);
propertyQ <subTypeB>::QMethod1(objB);
return 0;
}
class propertyQ is written based on the supertype class superTypeA. Here subtype, class SubTypeA, is subtitutable for supertype class, superTypeA, for the property, class propertyQ, without altering the program and is said to follow Liskov substitution principle; while subtype, class SubTypeB, uses private inheritance and cannot be substitutable for supertype, class superTypeA and is said to violate Liskov substitution principle.
George_George wrote: Now I understand this principle to be, if we have some methods in base class, then we also need to implement the methods in derived class. My understanding correct?
No, look at the above example, subtype, class subTypeA, overrides only method, void operate2(), while the method, void operate1() is inherited from superclass, class superTypeA.
here i think u misuderstood between, nominal subtype and structural subtype; in OOP, nominal subype is induced by inheritance while structural subtype is that eventhough u didnot inherit from base class, class superTypeA, if u r implementing all the functions in every class you are able to apply the property, class propertyQ.
George_George wrote: But the description is not common senses.
does my explaination makes sense.
|
|
|
|
|
Thanks Rajkumar!
Your reply is great!!
Most of my confusions are solved. Just one point about structural subtype, you mentioned below,
Rajkumar R wrote: structural subtype is that eventhough u didnot inherit from base class, class superTypeA, if u r implementing all the functions in every class you are able to apply the property, class propertyQ.
What means "if u r implementing all the functions in every class" and "you are able to apply the property, class propertyQ"? What do you mean all the functions and every class?
regards,
George
|
|
|
|
|
George_George wrote: What means "if u r implementing all the functions in every class" and "you are able to apply the property, class propertyQ"? What do you mean all the functions and every class?
struct subTypeA
{
subTypeA()
: m_iContext(0)
{
}
void operate1()
{
m_iContext = 1;
}
void operate2()
{
m_iContext = 2;
}
private:
int m_iContext;
};
struct subTypeB
{
subTypeB()
: m_iContext(0)
{
}
void operate1()
{
m_iContext = 1;
}
void operate2()
{
m_iContext = 2;
}
private:
int m_iContext;
};
it is obvious.
now the propery q(subTypeA) and q(subTypeB) both works
propertyQ <subTypeA>::QMethod1(objA);
propertyQ <subTypeB>::QMethod1(objB);
|
|
|
|
|
Thanks Rajkumar,
My stupid before.
regards,
George
|
|
|
|
|
George_George wrote: My stupid before.
I actually used the sample propertyQ() as a template class to address both the nominal and structural subtype.
otherwise i can only address nominal type if i used the following example;
void propertyQ(superTypeA *obj)
{
obj->operate1();
}
then
subTypeA objA;
subTypeB objB;
propertyQ(&objA);
propertyQ(&objB);
*__w64 ' to 'superTypeA *' exists, but is inaccessible
In this case i cannot address structural subtype.
|
|
|
|
|
Thanks Rajkumar,
My question is answered.
regards,
George
|
|
|
|
|
dear all
i would like to generate such code: i have to Gaussian size mask according to different sigma value,anyone has such code? please help me, thanks a lot.or anyone know how to determine Gaussian mask size according to different sigma value.
Li Zhiyuan
|
|
|
|
|
Looks like someone already answered this question to someone who has been here long enough to know not to title messagees with 'help.'
|
|
|
|
|
thanks, friend, yes, they answered, but not exactly, so i still didn't solve it. thanks a lot.
Li Zhiyuan
|
|
|
|
|
And friend, i remember u got comments, theory, pseudo code, code in C#, i think you are expected C++ code only. if so, why can't you port to C++ as needed.
|
|
|
|
|
thanks for your reminder, i didn't find, can you send me again. thanks a lot.
Li Zhiyuan
|
|
|
|
|
Go to your own profile, and click the "Messages posted" link.
Maxwell Chen
|
|
|
|
|
li zhiyuan wrote: thanks for your reminder, i didn't find, can you send me again.
code in C#: [^]
pseudo code: [^]
comments: [^]
theory: [^]
see maxwell's comment also.
gentle query: why these are not useful?
|
|
|
|
|
Is there any way of establishing whilst running an installation program, whether the session running it has administrator authority.
Bram van Kampen
|
|
|
|
|
IsUserAnAdmin()[^]
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
|
Shontay wrote: this program is surposed to do the same but by using another parameter
not clear, can you pleace be more specific.
|
|
|
|
|
I meant by returning the lines by using a different function
|
|
|
|
|
printf() ?
what does your "printLine()" do?
|
|
|
|
|
Shontay wrote: ...but by using another parameter.
This makes no sense. What function's parameter are you referring to? As it stands, the printLine() function is being sent one argument. Are you implying that printLine() takes an additional argument?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Do you have printLine codes?
|
|
|
|
|
Hey Guys,
Do any of you know of any win32 api or DeviceIOControl commands that allow me to:
Retrieve the current channel my wifi adapter is communicating on?
thank you,
Michael
|
|
|
|
|
Hello,
I am using the AES to encrypt and decrypt data from a txt file... but when decyrpted back i am getting the text + garbage
For example i am encrypting the pixel values of an image...
-13224404 -14211046 -14605042 -13682410 -12298975 -11245015 -10322644 -9532112 -8609993 -7490750 -6240432 -5516455 -4990625 -4332695 -3675534 -3412107 -3082376 -2753413 -2687618 -2884997 -3082374 -3082628 -3345799 -3740555 -3675016 -3675013 -3675267 -3609474 -3412093 -3214714 -3017333 -2885749 -2557300 -2425716 -2622326 -2885500 -3082625 -3345797
When decrypted back i am getting:-
-13224404 -14211046 -14605042 -Å-¯SôEÔµ¼g4µË
Please help me out how to solve this problem... I am fwding the codes:-
<br />
#include<iostream.h><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <assert.h><br />
#include <windows.h><br />
#include <string.h><br />
#include <memory.h><br />
#include <process.h><br />
#include <tchar.h><br />
#include <dos.h><br />
#include <conio.h><br />
#include <fstream><br />
#include <string><br />
using namespace std;<br />
<br />
#include <time.h><br />
<br />
double start_time , stop_time;<br />
<br />
double Add,sub,sft,mix;<br />
double Add1,Add2,Add3,sub1,sub2,sft1,sft2,mix1;<br />
double invadd1,invadd2,invadd3,invsub1,invsub2,invsft1,invsft2,invmix1;<br />
static int count1, count2= 0;<br />
<br />
<br />
double freq;<br />
long start;<br />
<br />
<br />
void sec_init(void)<br />
{<br />
LARGE_INTEGER lFreq, lCnt;<br />
QueryPerformanceFrequency(&lFreq);<br />
freq = (double)lFreq.LowPart;<br />
QueryPerformanceCounter(&lCnt);<br />
start = lCnt.LowPart;<br />
}<br />
<br />
<br />
double sec(void)<br />
{<br />
LARGE_INTEGER lCnt;<br />
long tcnt;<br />
QueryPerformanceCounter(&lCnt);<br />
tcnt = lCnt.LowPart - start;<br />
return ((double)tcnt) / freq;<br />
}<br />
<br />
<br />
typedef unsigned char word8;<br />
typedef unsigned int word32;<br />
<br />
<br />
<br />
word8 Logtable[256] = {<br />
0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3,<br />
100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193,<br />
125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120,<br />
101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142,<br />
150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56,<br />
102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16,<br />
126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186,<br />
43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87,<br />
175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232,<br />
44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160,<br />
127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183,<br />
204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157,<br />
151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209,<br />
83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171,<br />
68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165,<br />
103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7,<br />
};<br />
<br />
word8 Alogtable[256] = {<br />
1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,<br />
95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,<br />
229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,<br />
83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,<br />
76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,<br />
131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,<br />
181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,<br />
254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,<br />
251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,<br />
195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,<br />
159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,<br />
155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,<br />
252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,<br />
69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,<br />
18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,<br />
57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1,<br />
};<br />
<br />
word8 S[256] = {<br />
99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,<br />
202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,<br />
183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,<br />
4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117,<br />
9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132,<br />
83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207,<br />
208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168,<br />
81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210,<br />
205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115,<br />
96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219,<br />
224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,<br />
231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,<br />
186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,<br />
112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,<br />
225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,<br />
140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22,<br />
};<br />
<br />
word8 Si[256] = {<br />
82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251,<br />
124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203,<br />
84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78,<br />
8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37,<br />
114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146,<br />
108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132,<br />
144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6,<br />
208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107,<br />
58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115,<br />
150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110,<br />
71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27,<br />
252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244,<br />
31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95,<br />
96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239,<br />
160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,<br />
23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125,<br />
};<br />
<br />
word32 RC[30] = {<br />
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,<br />
0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,<br />
0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,<br />
0xfa, 0xef, 0xc5};<br />
<br />
#define MAXBC 8<br />
#define MAXKC 8<br />
#define MAXROUNDS 14<br />
<br />
static word8 shifts[5][4] = {<br />
0, 1, 2, 3,<br />
0, 1, 2, 3,<br />
0, 1, 2, 3,<br />
0, 1, 2, 4,<br />
0, 1, 3, 4};<br />
<br />
static int numrounds[5][5] = {<br />
10, 11, 12, 13, 14,<br />
11, 11, 12, 13, 14,<br />
12, 12, 12, 13, 14,<br />
13, 13, 13, 13, 14,<br />
14, 14, 14, 14, 14};<br />
<br />
int BC, KC, ROUNDS;<br />
<br />
word8 mul(word8 a, word8 b) {<br />
<br />
if (a && b)<br />
return Alogtable[(Logtable[a] + Logtable[b])%255];<br />
else return 0;<br />
}<br />
<br />
void AddRoundKey(word8 a[4][MAXBC], word8 rk[4][MAXBC])<br />
{<br />
<br />
<br />
int i, j;<br />
for (i=0; i<4; i++)<br />
for(j=0; j<4; j++)<br />
a[i][j] ^= rk[i][j];<br />
<br />
}<br />
<br />
void SubBytes(word8 a[4][MAXBC], word8 box[256])<br />
{<br />
<br />
int i, j;<br />
for (i=0; i<4; i++)<br />
for(j=0; j< BC; j++)<br />
a[i][j] = box[a[i][j]];<br />
}<br />
<br />
void ShiftRows(word8 a[4][MAXBC], word8 d)<br />
{<br />
<br />
word8 tmp[MAXBC];<br />
int i, j;<br />
<br />
if ( d==0)
{<br />
for (i=0; i<4; i++)<br />
{<br />
for(j=0; j< BC; j++)<br />
tmp[j] = a[i][(j + shifts[BC-4][i]) % BC];<br />
for(j=0; j< BC; j++)<br />
a[i][j] = tmp[j];<br />
}<br />
}<br />
else
{<br />
for (i=0; i<4; i++)<br />
{<br />
for(j=0; j< BC; j++)<br />
tmp[j] = a[i][(j + 4 - i) % BC];<br />
<br />
for(j=0; j< BC; j++)<br />
a[i][j] = tmp[j];<br />
}<br />
}<br />
<br />
}<br />
<br />
void MixColumns(word8 a[4][MAXBC]) {<br />
<br />
word8 b[4][MAXBC];<br />
int i, j;<br />
for(j=0; j for(i=0; i<4; i++)<br />
b[i][j] = mul(2,a[i][j])<br />
^ mul(3,a[(i+1)%4][j])<br />
^ a[(i+2) % 4][j]<br />
^ a[(i+3) % 4][j];<br />
for(i=0; i<4; i++)<br />
for(j=0; j< BC; j++)<br />
a[i][j] = b[i][j];<br />
}<br />
<br />
void InvMixColumns(word8 a[4][MAXBC])<br />
{<br />
<br />
word8 b[4][MAXBC];<br />
<br />
int i, j;<br />
<br />
for(j=0; j for(i=0; i<4; i++)<br />
b[i][j] = mul(0xe,a[i][j])<br />
^ mul(0xb,a[(i+1) % 4][j])<br />
^ mul(0xd,a[(i+2) % 4][j])<br />
^ mul(0x9,a[(i+3) % 4][j]);<br />
<br />
for(i=0; i<4; i++)<br />
for(j=0; j< BC; j++)<br />
a[i][j] = b[i][j];<br />
<br />
}<br />
<br />
int KeyExpansion (word8 k[4][MAXKC], word8 W[MAXROUNDS+1][4][MAXBC])<br />
{<br />
<br />
<br />
int i, j, t, RCpointer = 1;<br />
<br />
word8 tk[4][MAXKC];<br />
for(j=0; j< KC; j++)<br />
for (i=0; i<4; i++)<br />
tk[i][j] = k[i][j];<br />
t=0;<br />
<br />
for (j=0; (j<(rounds+1) *="" bc="" );="" j++,="" t++)for ( i=0; i<4; i++) W[t / BC][i][t % BC] = tk[i][j];<br />
while (t < (ROUNDS + 1)*BC) {<br />
<br />
for(i=0; i<4; i++)<br />
tk[i][0] ^= S[tk[(i+1)%4][KC-1]];<br />
tk[0][0] ^= RC[RCpointer++];<br />
if (KC <= 6 )<br />
for (j=1; j < KC; j++)<br />
for(i=0; i<4; i++)<br />
tk[i][j] ^= tk[i][j-1];<br />
else {<br />
for (j=1; j < 4; j++)<br />
for(i=0; i<4; i++)<br />
tk[i][j] ^= tk[i][j-1];<br />
for(i=0; i<4; i++) tk[i][4] ^= S[tk[i][3]];<br />
for (j=5; j < KC; j++)<br />
for(i=0; i<4; i++)<br />
tk[i][j] ^= tk[i][j-1];<br />
}<br />
<br />
for (j=0; (j < KC) && (t<(ROUNDS+1)*BC); j++, t++)<br />
for(i=0; i<4; i++) W[t/BC][i][t%BC] = tk[i][j];<br />
}<br />
return 0;<br />
}<br />
<br />
int Encrypt (word8 a[4][MAXBC], word8 rk[MAXROUNDS+1][4][MAXBC])<br />
{<br />
<br />
int r;<br />
<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a, rk[0]);<br />
<br />
stop_time = sec();<br />
Add1 = (stop_time - start_time);<br />
<br />
<br />
for ( r=1; r < ROUNDS; r++)<br />
{<br />
sec_init();<br />
start_time = sec();<br />
<br />
SubBytes (a,S);<br />
<br />
stop_time = sec();<br />
sub1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
ShiftRows(a,0);<br />
<br />
stop_time = sec();<br />
sft1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
MixColumns(a);<br />
<br />
stop_time = sec();<br />
mix1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a,rk[r]);<br />
<br />
stop_time = sec();<br />
Add2 = (stop_time - start_time);<br />
}<br />
<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
SubBytes (a,S);<br />
<br />
stop_time = sec();<br />
sub2 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
ShiftRows(a,0);<br />
<br />
stop_time = sec();<br />
sft2 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a,rk[ROUNDS]);
<br />
stop_time = sec();<br />
Add3 = (stop_time - start_time);<br />
<br />
return 0;<br />
}<br />
<br />
int Decrypt (word8 a[4][MAXBC], word8 rk[MAXROUNDS+1][4][MAXBC])<br />
{<br />
int r;<br />
<br />
<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a, rk[ROUNDS]);
<br />
stop_time = sec();<br />
invadd1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
SubBytes(a, Si);<br />
<br />
stop_time = sec();<br />
invsub1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
ShiftRows(a,1);<br />
<br />
stop_time = sec();<br />
invsft1 = (stop_time - start_time);<br />
<br />
for ( r=ROUNDS-1; r > 0; r--)<br />
{<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a,rk[r]);<br />
<br />
stop_time = sec();<br />
invadd2 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
InvMixColumns(a);<br />
<br />
stop_time = sec();<br />
invmix1 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
SubBytes (a,Si);<br />
<br />
stop_time = sec();<br />
invsub2 = (stop_time - start_time);<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
ShiftRows(a,1);<br />
<br />
stop_time = sec();<br />
invsft2 = (stop_time - start_time);<br />
}<br />
<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
AddRoundKey(a,rk[0]);<br />
<br />
stop_time = sec();<br />
invadd3 = (stop_time - start_time);<br />
<br />
return 0;<br />
}<br />
<br />
int counter1()<br />
{<br />
count1++;<br />
return 0;<br />
}<br />
<br />
int counter2()<br />
{<br />
count2++;<br />
return 0;<br />
}<br />
<br />
int main()<br />
{<br />
<br />
int i, j;<br />
<br />
int Nr=0;<br />
<br />
double Add,sub,sft,mix;
double invadd,invsub,invsft,invmix;
double keysh_time;
double encryptTime,decryptTime;<br />
<br />
<br />
word8 a[4][MAXBC], rk[MAXROUNDS+1][4][MAXBC], sk[4][MAXKC];<br />
BC = 4;<br />
<br />
<br />
printf("\n --- Advanced Encryption Standard --- \n");<br />
printf("\n\n");<br />
<br />
while(Nr!=128 && Nr!=192 && Nr!=256)<br />
{<br />
printf("Enter the length of Key(128, 192 or 256 only): ");<br />
scanf("%d",&Nr);<br />
}<br />
<br />
KC = Nr / 32;<br />
<br />
{<br />
<br />
ROUNDS = numrounds[KC-4][BC-4];<br />
<br />
cout<<endl;<br />
<br />
char key;<br />
ifstream myfile2 ("Key.txt");<br />
if (myfile2.is_open())<br />
{<br />
for ( j=0; j for ( i=0; i < 4; i++)<br />
{<br />
myfile2.get(key);<br />
sk[i][j] = key;
}<br />
<br />
myfile2.close();<br />
}<br />
else<br />
cout << "Unable to open file";<br />
<br />
sec_init();<br />
start_time = sec();<br />
<br />
KeyExpansion (sk, rk);<br />
<br />
stop_time = sec();<br />
keysh_time = (stop_time - start_time);<br />
<br />
char d;<br />
ifstream myfile1 ("myfile1.txt");<br />
ofstream myfile3 ("Ciphertext.txt");<br />
<br />
myfile1.get(d);
<br />
while(!myfile1.eof())<br />
{<br />
for ( j=0; j for ( i=0; i < 4; i++)<br />
{<br />
a[i][j] = d;
myfile1.get(d);
}<br />
<br />
<br />
Encrypt(a, rk);<br />
counter1();<br />
<br />
<br />
if (myfile3.is_open())<br />
{<br />
for(j=0; j< BC; j ++)<br />
for ( i=0; i<4; i++)<br />
myfile3<<a[i][j];<br />
}<br />
else<br />
cout << "Unable to open file";<br />
}<br />
<br />
myfile3.close();<br />
myfile1.close();<br />
<br />
char dxc;<br />
ifstream myfile4 ("Ciphertext.txt");<br />
ofstream myfile5 ("Text.txt");<br />
<br />
myfile4.get(dxc);
<br />
while(!myfile4.eof())<br />
{<br />
for ( j=0; j for ( i=0; i < 4; i++)<br />
{<br />
a[i][j] = dxc;
myfile4.get(dxc);
}<br />
<br />
<br />
Decrypt(a, rk);<br />
counter2();<br />
<br />
<br />
if (myfile5.is_open())<br />
{<br />
for(j=0; j for ( i=0; i<4; i++)<br />
myfile5<<a[i][j];<br />
}<br />
else<br />
cout << "Unable to open file";<br />
}<br />
<br />
myfile5.close();<br />
myfile4.close();<br />
<br />
<br />
cout<<endl;<br />
cout<<" *********** AES Encryption using "<<Nr<<" bits"<<" ********** "<<endl;<br />
cout<<endl;<br />
<br />
cout<<"Key : ";<br />
for(j=0; j< KC; j ++)<br />
for ( i=0; i<4; i++)<br />
cout<<sk[i][j];<br />
cout<<endl;<br />
<br />
cout<<endl;<br />
<br />
cout<<" ----- AES Encryption Time for 1 Operation ----- "<<endl<<endl;<br />
<br />
<br />
Add = (Add1 + Add2*(ROUNDS-1) + Add3)*count1;<br />
sub = (sub1*(ROUNDS-1) + sub2)*count1;<br />
sft = (sft1*(ROUNDS-1) + sft2)*count1;<br />
mix = (mix1*(ROUNDS-1))*count1;<br />
<br />
encryptTime = Add + sub + sft + mix;<br />
<br />
printf("Key Expansion Time : ");<br />
printf("%lf ", keysh_time);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("AddRoundKey Time : ");<br />
printf("%lf ", Add);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("SubBytes Time : ");<br />
printf("%lf ", sub);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("ShiftRow Time : ");<br />
printf("%lf ", sft);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("MixColunms Time : ");<br />
printf("%lf ", mix);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("Encrytion Time : ");<br />
printf("%lf ", encryptTime);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
cout<<"Number of plaintext blocks of 16 bytes created: "<<count1<<endl;<br />
<br />
cout<<endl;<br />
cout<<" *********** AES Decryption using "<<Nr<<" bits"<<" ********** "<<endl;<br />
cout<<endl;<br />
<br />
cout<<"Key : ";<br />
for(j=0; j< KC; j ++)<br />
for ( i=0; i<4; i++)<br />
cout<<sk[i][j];<br />
cout<<endl;<br />
}<br />
<br />
invadd = (invadd1 + invadd2*(ROUNDS-1) + invadd3)*count2;<br />
invsub = (invsub1 + invsub2*(ROUNDS-1))*count2;<br />
invsft = (invsft1 + invsft2*(ROUNDS-1))*count2;<br />
invmix = (invmix1*(ROUNDS-1))*count2;<br />
<br />
decryptTime = invadd + invsub + invsft + invmix;<br />
<br />
cout<<endl;<br />
<br />
cout<<" ----- Average AES Decryption Time for 1 Operation ----- "<<endl<<endl;<br />
<br />
printf("Key Expansion Time : ");<br />
printf("%lf ", keysh_time);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("AddRoundKey Time : ");<br />
printf("%lf ", invadd);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("Inverse SubBytes Time : ");<br />
printf("%lf ", invsub);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("Inverse ShiftRow Time : ");<br />
printf("%lf ", invsft);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("Inverse MixColunms Time : ");<br />
printf("%lf ", invmix);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
printf("Decrytion Time : ");<br />
printf("%lf ", decryptTime);<br />
printf("seconds.");<br />
printf("\n\n");<br />
<br />
cout<<"Number of plaintext blocks of 16 bytes created: "<<count2<<endl;<br />
<br />
printf("\n\n\t\t End of the program\n\n");<br />
<br />
return 0;<br />
}<br />
key.txt:- 0123456789abcdef0123456789abcdef
myfile1.txt:- its the pixels values
Please help me out how to solve this problem
modified on Sunday, February 24, 2008 2:36 PM
|
|
|
|
|
This is probably unrelated but the last time I checked, C/C++ was case sensitive.
Are you really getting this to compile? Some global variables are declared all caps then used locally in lowercase with no matching declaration so I'm guessing your referring to the global instance.
one example is...
int BC, KC, ROUNDS;
// Used as lowercase in some functions
bc
rounds
|
|
|
|
|
/*
I had a few spare minutes so I gave it look. I removed
all the noise and cleaned it up a bit so I could
navigate it easily.
NOTE: Files renamed to...
key.txt
input.txt
encrypted.txt
output.txt
WARNING: You might have a problem toward the very end
of the encrypt or decrypt code. ---------------->
-13224404 -14211046 ... -2885500 -3082625 -33457977777
*/
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
#include <string.h>
#include <memory.h>
#include <process.h>
#include <tchar.h>
#include <dos.h>
#include <conio.h>
#include <fstream>
#include <string>
#include <time.h>
using namespace std;
double Add,sub,sft,mix;
double Add1,Add2,Add3,sub1,sub2,sft1,sft2,mix1;
double invadd1,invadd2,invadd3,invsub1,invsub2,invsft1,invsft2,invmix1;
typedef unsigned char word8;
typedef unsigned int word32;
word8 Logtable[256] = {
0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3,
100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193,
125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120,
101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142,
150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56,
102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16,
126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186,
43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87,
175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232,
44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160,
127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183,
204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157,
151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209,
83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171,
68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165,
103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7,
};
word8 Alogtable[256] = {
1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,
95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,
229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,
83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,
76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,
131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,
69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,
18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,
57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1,
};
word8 S[256] = {
99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,
4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117,
9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132,
83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207,
208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168,
81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210,
205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115,
96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219,
224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121,
231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8,
186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138,
112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158,
225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22,
};
word8 Si[256] = {
82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251,
124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203,
84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78,
8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37,
114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146,
108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132,
144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6,
208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107,
58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115,
150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110,
71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27,
252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244,
31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95,
96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239,
160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,
23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125,
};
word32 RC[30] = {
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
0xfa, 0xef, 0xc5
};
#define MAXBC 8
#define MAXKC 8
#define MAXROUNDS 14
static word8 shifts[5][4] = {
0, 1, 2, 3,
0, 1, 2, 3,
0, 1, 2, 3,
0, 1, 2, 4,
0, 1, 3, 4
};
static int numrounds[5][5] = {
10, 11, 12, 13, 14,
11, 11, 12, 13, 14,
12, 12, 12, 13, 14,
13, 13, 13, 13, 14,
14, 14, 14, 14, 14
};
int BC, KC, ROUNDS;
word8 mul(word8 a, word8 b) {
if (a && b) {
return Alogtable[(Logtable[a] + Logtable[b])%255];
} else {
return 0;
}
}
void AddRoundKey(word8 a[4][MAXBC], word8 rk[4][MAXBC])
{
int i, j;
for (i=0; i<4; i++) {
for(j=0; j<4; j++) {
a[i][j] ^= rk[i][j];
}
}
}
void SubBytes(word8 a[4][MAXBC], word8 box[256])
{
int i, j;
for (i=0; i<4; i++) {
for(j=0; j< BC; j++) {
a[i][j] = box[a[i][j]];
}
}
}
void ShiftRows(word8 a[4][MAXBC], word8 d)
{
word8 tmp[MAXBC];
int i, j;
if ( d==0) {
for (i=0; i<4; i++) {
for(j=0; j< BC; j++) {
tmp[j] = a[i][(j + shifts[BC-4][i]) % BC];
}
for(j=0; j< BC; j++) {
a[i][j] = tmp[j];
}
}
} else { // for ShiftRows-decryption
for (i=0; i<4; i++) {
for(j=0; j< BC; j++) {
tmp[j] = a[i][(j + 4 - i) % BC];
}
for(j=0; j< BC; j++) {
a[i][j] = tmp[j];
}
}
}
}
void MixColumns(word8 a[4][MAXBC]) {
word8 b[4][MAXBC];
int i, j;
for(j=0; j<BC; j++) {
for(i=0; i<4; i++) {
b[i][j] = mul(2,a[i][j])
^ mul(3,a[(i+1)%4][j])
^ a[(i+2) % 4][j]
^ a[(i+3) % 4][j];
}
}
for(i=0; i<4; i++) {
for(j=0; j< BC; j++) {
a[i][j] = b[i][j];
}
}
}
void InvMixColumns(word8 a[4][MAXBC])
{
word8 b[4][MAXBC];
int i, j;
for(j=0; j<BC; j++) {
for(i=0; i<4; i++) {
b[i][j] = mul(0xe,a[i][j])
^ mul(0xb,a[(i+1) % 4][j])
^ mul(0xd,a[(i+2) % 4][j])
^ mul(0x9,a[(i+3) % 4][j]);
}
}
for(i=0; i<4; i++) {
for(j=0; j< BC; j++) {
a[i][j] = b[i][j];
}
}
}
int KeyExpansion (word8 k[4][MAXKC], word8 W[MAXROUNDS+1][4][MAXBC])
{
int i, j, t, RCpointer = 1;
word8 tk[4][MAXKC];
for(j=0; j< KC; j++) {
for (i=0; i<4; i++) {
tk[i][j] = k[i][j];
}
}
t=0;
for (j=0; (j<KC) && (t<(ROUNDS+1) * BC); j++, t++) {
for ( i=0; i<4; i++) {
W[t / BC][i][t % BC] = tk[i][j];
}
}
while (t < (ROUNDS + 1)*BC) {
for(i=0; i<4; i++) {
tk[i][0] ^= S[tk[(i+1)%4][KC-1]];
}
tk[0][0] ^= RC[RCpointer++];
if (KC <= 6 ) {
for (j=1; j < KC; j++) {
for(i=0; i<4; i++) {
tk[i][j] ^= tk[i][j-1];
}
}
} else {
for (j=1; j < 4; j++) {
for(i=0; i<4; i++) {
tk[i][j] ^= tk[i][j-1];
}
}
for(i=0; i<4; i++) {
tk[i][4] ^= S[tk[i][3]];
}
for (j=5; j < KC; j++) {
for(i=0; i<4; i++) {
tk[i][j] ^= tk[i][j-1];
}
}
}
for (j=0; (j < KC) && (t<(ROUNDS+1)*BC); j++, t++) {
for(i=0; i<4; i++) W[t/BC][i][t%BC] = tk[i][j];
}
}
return 0;
}
int Encrypt (word8 a[4][MAXBC], word8 rk[MAXROUNDS+1][4][MAXBC])
{
int r;
AddRoundKey(a, rk[0]);
for ( r=1; r < ROUNDS; r++) {
SubBytes (a,S);
ShiftRows(a,0);
MixColumns(a);
AddRoundKey(a,rk[r]);
}
SubBytes (a,S);
ShiftRows(a,0);
AddRoundKey(a,rk[ROUNDS]);//round
return 0;
}
int Decrypt (word8 a[4][MAXBC], word8 rk[MAXROUNDS+1][4][MAXBC])
{
int r;
AddRoundKey(a, rk[ROUNDS]);//round
SubBytes(a, Si);
ShiftRows(a,1);
for ( r=ROUNDS-1; r > 0; r--) {
AddRoundKey(a,rk[r]);
InvMixColumns(a);
SubBytes (a,Si);
ShiftRows(a,1);
}
AddRoundKey(a,rk[0]);
return 0;
}
int main()
{
int i, j;
int Nr=0;
word8 a[4][MAXBC], rk[MAXROUNDS+1][4][MAXBC], sk[4][MAXKC];
BC = 4;
while (Nr!=128 && Nr!=192 && Nr!=256) {
printf("Enter the length of Key(128, 192 or 256 only): ");
scanf("%d",&Nr);
}
KC = Nr / 32;
ROUNDS = numrounds[KC-4][BC-4];
cout<<endl;
char key;
ifstream fileKey ("key.txt");
if (fileKey.is_open()) {
for ( j=0; j<KC; j++) {
for ( i=0; i < 4; i++) {
fileKey.get(key);
sk[i][j] = key;
}
}
fileKey.close();
} else {
cout << "Unable to open file";
}
KeyExpansion (sk, rk);
{ // Encrypting the data
char d;
ifstream fileInput ("input.txt");
ofstream fileEncrypted ("encrypted.txt");
fileInput.get(d);
while(!fileInput.eof()) {
for ( j=0; j<BC; j++) {
for ( i=0; i < 4; i++) {
a[i][j] = d;
fileInput.get(d);
}
}
Encrypt(a, rk);
if (fileEncrypted.is_open()) {
for(j=0; j< BC; j ++) {
for ( i=0; i<4; i++) {
fileEncrypted<<a[i][j];
}
}
} else {
cout << "Unable to open file";
}
}
fileEncrypted.close();
fileInput.close();
}
{ // Decrypting the data
char dxc;
ifstream fileEncrypted ("encrypted.txt");
ofstream fileOutput ("output.txt");
fileEncrypted.get(dxc); //priming read
while(!fileEncrypted.eof()) {
for ( j=0; j<BC; j++) {
for ( i=0; i < 4; i++) {
a[i][j] = dxc;
fileEncrypted.get(dxc);
}
}
Decrypt(a, rk);
if (fileOutput.is_open()) {
for(j=0; j<BC; j++) {
for ( i=0; i<4; i++) {
fileOutput<<a[i][j];
}
}
} else {
cout << "Unable to open file";
}
}
cout<<endl;
fileOutput.close();
fileEncrypted.close();
}
return 0;
}
|
|
|
|
|