snoopy5376
Newbie level 5
Hi all,
I am implementing a RC4 encryption on C++. RC4 is a stream cipher which generates a pseudorandom stream of bits (a keystream). As with any stream cipher, these can be used for encryption by combining it with the plaintext using bit-wise exclusive-or;
There are two phases:
Key Setup
1. f = ( f + Si + Kg ) mod 4
2. Swapping Si with Sf
Ciphering ( XOR)
1. i = ( i + 1 ) mod 4 , and f = ( f + Si ) mod 4
2. Swaping Si with Sf
3. t = ( Si + Sf ) mod 4
Random byte St
Below are my codes:
I understand that the keystream generated musts be different each and every time and hence the cipher text will be different even though the same plain text is encrypted. However, what i get is always the same.
Can someone help me with this?
- - - Updated - - -
i've done some correction on it.
the S[] should not be initialize to S[]=[0,1,2,3] everytime. it should store the previous state. Can someone tell me whether this is the correct RC4 concept? thanks.
Below are my corrected codes
Below is my output:
[td]SD[/td]
[td]PlainText [/td]
[td]CipherText [/td]
[td]Decoded[/td]
[tr]
[td]1203[/td]
[td]1203[/td]
[td]001100001 110010[/td]
[td]001100011 110000[/td]
[td]001100001 110010[/td]
[/tr]
[tr]
[td]0321[/td]
[td]0321[/td]
[td]001100001 110010[/td]
[td]001100000 110010[/td]
[td]001100001 110010[/td]
[/tr]
[tr]
[td]0213[/td]
[td]0213[/td]
[td]001100001 110010[/td]
[td]001100010 110010[/td]
[td]001100001 110010[/td]
[/tr]
I am implementing a RC4 encryption on C++. RC4 is a stream cipher which generates a pseudorandom stream of bits (a keystream). As with any stream cipher, these can be used for encryption by combining it with the plaintext using bit-wise exclusive-or;
There are two phases:
Key Setup
1. f = ( f + Si + Kg ) mod 4
2. Swapping Si with Sf
Ciphering ( XOR)
1. i = ( i + 1 ) mod 4 , and f = ( f + Si ) mod 4
2. Swaping Si with Sf
3. t = ( Si + Sf ) mod 4
Random byte St
Below are my codes:
Code:
void prepareKey (char key[], int *s)
{
int t[4], i, j, temp;
cout<<"S[]= ";
for(i=0;i<4;i++)//assigning S[]
{
s[i]=i;
t[i]=key[i%strlen(key)];
}
for(i=0;i<4;i++) //swapping of S[]
{
j=(j+s[i]+t[i])%4;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
Code:
void rc4 (char plainText[], int s[], char *key, char *ciphertext)
{
int m, n, i, q;
for(i=0;i<16;i++)
ciphertext[i]=0;
cout<<"Cipher Text:";
for(i=0;i<strlen(plainText);i++)
{
int temp, temp2;
m=(m+1)% 4;
n=(n+s[m])% 4;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%4;
temp2 = s[q];
ciphertext[i]=plainText[i]^temp2;
cout.fill('0');
cout.width(8);
cout << right <<convBase(ciphertext[i],2)<<" ";
}
cout<<endl;
}
I understand that the keystream generated musts be different each and every time and hence the cipher text will be different even though the same plain text is encrypted. However, what i get is always the same.
Can someone help me with this?
- - - Updated - - -
i've done some correction on it.
the S[] should not be initialize to S[]=[0,1,2,3] everytime. it should store the previous state. Can someone tell me whether this is the correct RC4 concept? thanks.
Below are my corrected codes
Code:
int main()
{
for(i=0;i<4;i++)//assigning S[]
{
S[i]=i;
SD[i]=i;
}
}
Code:
void prepareKey (char key[], int *s)
{
int g=0, i, j=0, temp=0;
for(i=0;i<4;i++) //swapping of S[]
{
j=(j+s[i]+key[i%strlen(key)])%4;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
Code:
void rc4 (char plainText[], int s[], char *key, char *ciphertext)
{
int m=0, n=0, i, q=0;
for(i=0;i<16;i++)
ciphertext[i]=0;
cout<<"Cipher Text:";
for(i=0;i<strlen(plainText);i++)
{
int temp, temp2;
m=(m+1)% 4;
n=(n+s[m])% 4;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%4;
temp2 = s[q];
ciphertext[i]=plainText[i]^temp2;
cout.fill('0');
cout.width(8);
cout << right <<convBase(ciphertext[i],2)<<" ";
}
cout<<endl;
}
Below is my output:
S |
[td]SD[/td]
[td]PlainText [/td]
[td]CipherText [/td]
[td]Decoded[/td]
[tr]
[td]1203[/td]
[td]1203[/td]
[td]001100001 110010[/td]
[td]001100011 110000[/td]
[td]001100001 110010[/td]
[/tr]
[tr]
[td]0321[/td]
[td]0321[/td]
[td]001100001 110010[/td]
[td]001100000 110010[/td]
[td]001100001 110010[/td]
[/tr]
[tr]
[td]0213[/td]
[td]0213[/td]
[td]001100001 110010[/td]
[td]001100010 110010[/td]
[td]001100001 110010[/td]
[/tr]
Last edited: