メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcArcfour.c

説明を見る。
00001 
00007 #define  DKUTIL_C_ARCFOUR_C
00008 #include "dkcArcfour.h"
00009 #include "dkcStdio.h"
00010 
00011 
00012 
00013 DKC_ARCFOUR_STATE *WINAPI dkcAllocArcfour(
00014     const unsigned char *key,size_t keylen)
00015 {
00016 
00017     int i,j;
00018     unsigned char temp;
00019     unsigned char *sb1,sb2[256];
00020     DKC_ARCFOUR_STATE *p;
00021     
00022     memset(sb2,0,sizeof(sb2));
00023     //allocate state struct
00024     p = (DKC_ARCFOUR_STATE *)dkcAllocate(sizeof(DKC_ARCFOUR_STATE));
00025     if(NULL==p){
00026         return NULL;
00027     }
00028     sb1 = p->msbox;
00029     
00030     //initialize
00031     for(i=0;i<256;i++){
00032         sb1[i] = (unsigned char)i;
00033         //嗅ぎ回られないように(なんか、意味あるのか?ないナァ?
00034         //p->msbox2[i] = key [i % keylen];
00035     }
00036     j=i=0;
00037     
00038     for(;j<256;j++){
00039         sb2[j] = key [j % keylen];
00040     }
00041 
00042 
00043     for(i=0;i<256;i++){
00044         //j = (j + sb1 [i] + sb2 [i]) % 256;
00045         j = (j + sb1[i] + sb2[i]) & 0xff;
00046         temp = sb1 [i];
00047         sb1 [i] = sb1 [j];
00048         sb1 [j] = temp;
00049         /*sb1[i] = sb1[j] - sb1[i] ;
00050     sb1[j] -= sb1[i] ;
00051     sb1[i] += sb1[j] ;*/
00052     //SWAP_NUM(sb1[i],sb1[j]);
00053     }
00054     return p;
00055 }
00056 
00057 DKC_EXTERN unsigned char WINAPI dkcArcfourByte(DKC_ARCFOUR_STATE *p){
00058   unsigned char i,j,temp;
00059   unsigned char *sb1 = p->msbox;
00060   
00061   //calc
00062   i = (unsigned char )(p->mi+1);// % 256;
00063   j = (unsigned char )(p->mj + sb1[i]);// % 256;
00064   
00065      //swap
00066   temp = sb1 [i];
00067   sb1 [i] = sb1 [j];
00068   sb1 [j] = temp;
00069 
00070   //SWAP_NUM(sb1[i],sb1[j]);
00071   //refresh
00072   p->mi = i;
00073   p->mj = j;
00074   //calc
00075   i = (unsigned char )(sb1 [i] + sb1 [j]);// % 256;
00076   j = (unsigned char )sb1[i];
00077   return j;
00078 }
00079 
00080 static DKC_INLINE void dkcArcfourEncrypt_Base(DKC_ARCFOUR_STATE *p,
00081     unsigned char *dest,unsigned const char *src,size_t srcsize)
00082 {
00083 
00084     size_t cc;
00085   unsigned char i,j;
00086   unsigned char *sb1 = p->msbox;
00087     unsigned char temp;
00088   
00089      //calc
00090     i = (unsigned char )(p->mi);
00091     j = (unsigned char )(p->mj);
00092 
00093     for(cc = 0;cc < srcsize;cc++){
00094              //calc
00095         i = (unsigned char )(i+1);
00096         j = (unsigned char )(j + sb1[i]);
00097   
00098          //swap
00099         
00100         temp = sb1 [i];
00101         sb1 [i] = sb1 [j];
00102         sb1 [j] = temp;
00103         
00104 
00105         //SWAP_NUM_EX(sb1[i],sb1[j],unsigned char);
00106 
00107         //calc
00108         dest[cc] = (unsigned char )
00109             (src[cc] ^ (unsigned char )sb1[
00110                 (unsigned char )(sb1 [i] + sb1 [j]) 
00111             ] 
00112         );
00113     }
00114     //refresh
00115     p->mi = i;
00116     p->mj = j;
00117 
00118 }
00119 
00120 int WINAPI dkcArcfourEncrypt(DKC_ARCFOUR_STATE *p,
00121     unsigned char *dest,size_t destsize,
00122     const unsigned char *src,size_t srcsize)
00123 {
00124     //size_t i=0;
00125     if(destsize < srcsize){
00126         return edk_BufferOverFlow;
00127     }
00128     dkcArcfourEncrypt_Base(p,dest,src,srcsize);
00129 
00130     /*for(i = 0;i < srcsize;i++){
00131         dest[i] = (unsigned char )(src[i] ^ dkcArcfourByte(p) );
00132     }*/
00133 
00134     return edk_SUCCEEDED;
00135 }
00136 
00137 
00138 
00139 void WINAPI dkcArcfourEncryptNoDest(DKC_ARCFOUR_STATE *p,
00140     unsigned char *dest_and_src,size_t dest_and_srcsize)
00141 {
00142     dkcArcfourEncrypt_Base(p,dest_and_src,dest_and_src,dest_and_srcsize);
00143 }
00144 
00145 int WINAPI dkcFreeArcfour(DKC_ARCFOUR_STATE **p){
00146     if(NULL==p){
00147         return edk_FAILED;
00148     }
00149     return dkcFree((void **)p);
00150 }
00151 
00152 
00153 
00154 

dkutil_cに対してTue Oct 19 03:34:54 2004に生成されました。 doxygen 1.3.6