Problem with RC4 encryption

Status
Not open for further replies.

snoopy5376

Newbie level 5
Joined
Feb 19, 2009
Messages
10
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,367
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:
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:

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…