Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Implement the RC4 stream cipher in C++. User should be able to enter any key that is 5 bytes to 32 bytes long. Be sure

Implement the RC4 stream cipher in C++. User should be able to enter any key that is 5 bytes to 32 bytes long. Be sure to discard the first 3072 bytes of the pseudo random numbers. THE KEY OR THE INPUT TEXT MUST NOT BE HARD CODED IN THE PROGRAM.

Test your program with the following plain text file:

In cryptography, RC4 (Rivest Cipher 4 also known as ARC4 or ARCFOUR meaning Alleged RC4) is a stream cipher. While remarkable for its simplicity and speed in software, multiple vulnerabilities have been discovered in RC4, rendering it insecure. It is especially vulnerable when the beginning of the output keystream is not discarded, or when nonrandom or related keys are used. Particularly problematic uses of RC4 have led to very insecure protocols such as WEP.

Using the following code below. Write TWO separate programs: encryption and decryption. The encryption program should input the plaintext file and output a cipher text in hex. The decryption program should input the cipher text file in hex and output the plaintext.

#include #include #include #include

typedef uint8_t byte; typedef struct { byte i, j; byte S[256]; } Rc4State;

void swap(byte *a, byte *b) { byte temp = *a; *a = *b; *b = temp; }

/*Initialization & initial permutation also initialize i&j counters in state for stream generation*/ void initState(const byte K[256], int keylen, Rc4State *state) { byte T[256]; assert(keylen >= 1 && keylen <= 256); int i; for (i = 0; i < 256; i++) { state->S[i] = i; T[i] = K[i % keylen]; }

//Initial permutation of S byte *S = state->S; int j = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + T[i]) % 256; swap(&S[i], &S[j]); }

//Initialize counters in state state->i = state->j = 0; }

/*Encrypt/Decrypt text by XORing with next byte of keystream*/ byte crypt(byte text, Rc4State *state) { byte t, k; byte *i = &(state->i), *j = &(state->j); byte *S = state->S; *i = (*i + 1) % 256; *j = (*j + S[*i]) % 256; swap(&S[*i], &S[*j]); t = (S[*i] + S[*j]) % 256; k = S[t];

return text ^ k; }

static byte rc4CryptByte(Rc4State *state, byte plainText) { byte *S = state->S; byte i = ++(state->i); byte j = (state->j += S[i]);

swap(&S[i], &S[j]); byte t = S[i] + S[j]; byte k = S[t];

return plainText ^ k; }

void rc4Crypt(Rc4State *state, byte text[], size_t len) { for (size_t i = 0; i < len; i++) { text[i] = rc4CryptByte(state, text[i]); }

system("pause"); }

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Database Concepts International Edition

Authors: David M. Kroenke

6th Edition International Edition

0133098222, 978-0133098228

More Books

Students also viewed these Databases questions