⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serpent.cpp

📁 本人本科的毕业设计。基于Serpent密码的回退N协议的数据传输。希望可供大家参考。谢谢诶!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Serpent.cpp: implementation of the Serpent class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SerpentGBN.h"
#include "Serpent.h"
#include "serpentsboxes.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Serpent::Serpent()
{

}

Serpent::~Serpent()
{

}
void Serpent::MakeKey(char* key) 
 {
    unsigned long w[132],k[132];     
	 WORD temp1,temp2;
 	 for(int i=0;i<=7;i++)
     {  //w[i]=(key[4*i]<<24)|(key[4*i+1]<<16)|(key[4*i+2]<<8)|key[4*i+3];
    	 temp1=MAKEWORD(key[4*i],key[4*i+1]);
	     temp2=MAKEWORD(key[4*i+2],key[4*i+3]);
	     w[i]=MAKELONG(temp1,temp2);
	 }
     for(i=8;i<16;i++)
      w[i]=ROL(w[i-8]^w[i-5]^w[i-3]^w[i-1]^PHI^(i-8),11);
     for(i=0;i<8;i++)
      w[i]=w[i+8];
     for(i=8;i<132;i++)
      w[i]=ROL(w[i-8]^w[i-5]^w[i-3]^w[i-1]^PHI^i,11);
 
    RND03(w[  0], w[  1], w[  2], w[  3], k[  0], k[  1], k[  2], k[  3]);
    RND02(w[  4], w[  5], w[  6], w[  7], k[  4], k[  5], k[  6], k[  7]);
    RND01(w[  8], w[  9], w[ 10], w[ 11], k[  8], k[  9], k[ 10], k[ 11]);
    RND00(w[ 12], w[ 13], w[ 14], w[ 15], k[ 12], k[ 13], k[ 14], k[ 15]);
    RND31(w[ 16], w[ 17], w[ 18], w[ 19], k[ 16], k[ 17], k[ 18], k[ 19]);
    RND30(w[ 20], w[ 21], w[ 22], w[ 23], k[ 20], k[ 21], k[ 22], k[ 23]);
    RND29(w[ 24], w[ 25], w[ 26], w[ 27], k[ 24], k[ 25], k[ 26], k[ 27]);
    RND28(w[ 28], w[ 29], w[ 30], w[ 31], k[ 28], k[ 29], k[ 30], k[ 31]);
    RND27(w[ 32], w[ 33], w[ 34], w[ 35], k[ 32], k[ 33], k[ 34], k[ 35]);
    RND26(w[ 36], w[ 37], w[ 38], w[ 39], k[ 36], k[ 37], k[ 38], k[ 39]);
    RND25(w[ 40], w[ 41], w[ 42], w[ 43], k[ 40], k[ 41], k[ 42], k[ 43]);
    RND24(w[ 44], w[ 45], w[ 46], w[ 47], k[ 44], k[ 45], k[ 46], k[ 47]);
    RND23(w[ 48], w[ 49], w[ 50], w[ 51], k[ 48], k[ 49], k[ 50], k[ 51]);
    RND22(w[ 52], w[ 53], w[ 54], w[ 55], k[ 52], k[ 53], k[ 54], k[ 55]);
    RND21(w[ 56], w[ 57], w[ 58], w[ 59], k[ 56], k[ 57], k[ 58], k[ 59]);
    RND20(w[ 60], w[ 61], w[ 62], w[ 63], k[ 60], k[ 61], k[ 62], k[ 63]);
    RND19(w[ 64], w[ 65], w[ 66], w[ 67], k[ 64], k[ 65], k[ 66], k[ 67]);
    RND18(w[ 68], w[ 69], w[ 70], w[ 71], k[ 68], k[ 69], k[ 70], k[ 71]);
    RND17(w[ 72], w[ 73], w[ 74], w[ 75], k[ 72], k[ 73], k[ 74], k[ 75]);
    RND16(w[ 76], w[ 77], w[ 78], w[ 79], k[ 76], k[ 77], k[ 78], k[ 79]);
    RND15(w[ 80], w[ 81], w[ 82], w[ 83], k[ 80], k[ 81], k[ 82], k[ 83]);
    RND14(w[ 84], w[ 85], w[ 86], w[ 87], k[ 84], k[ 85], k[ 86], k[ 87]);
    RND13(w[ 88], w[ 89], w[ 90], w[ 91], k[ 88], k[ 89], k[ 90], k[ 91]);
    RND12(w[ 92], w[ 93], w[ 94], w[ 95], k[ 92], k[ 93], k[ 94], k[ 95]);
    RND11(w[ 96], w[ 97], w[ 98], w[ 99], k[ 96], k[ 97], k[ 98], k[ 99]);
    RND10(w[100], w[101], w[102], w[103], k[100], k[101], k[102], k[103]);
    RND09(w[104], w[105], w[106], w[107], k[104], k[105], k[106], k[107]);
    RND08(w[108], w[109], w[110], w[111], k[108], k[109], k[110], k[111]);
    RND07(w[112], w[113], w[114], w[115], k[112], k[113], k[114], k[115]);
    RND06(w[116], w[117], w[118], w[119], k[116], k[117], k[118], k[119]);
    RND05(w[120], w[121], w[122], w[123], k[120], k[121], k[122], k[123]);
    RND04(w[124], w[125], w[126], w[127], k[124], k[125], k[126], k[127]);
    RND03(w[128], w[129], w[130], w[131], k[128], k[129], k[130], k[131]);
      for(i=0; i<=32; i++)
	  { 
	  for(int j=0; j<4; j++)
      {
        subkeys[i][j]=k[i*4+j];
	  }        
      }   	
}



void Serpent::Encrypt(CString strin, CString &strout) 
{   
	 
  // TODO: Add your control notification handler code here
    CString strTemp   =_T("");
	int output[16]={0};
   
    unsigned int Lenth;
	while((strin.GetLength()%16)!=0)               //因Serpent将数据分成128位的数据组,
	    strin+=" ";
		Lenth=strin.GetLength();       //对于不能组成16个字节一个分组的字符串要进行处理
		round=Lenth/16;  
     ULONG ciphertext[4],plaintext[4];
	  char *plaint;
      plaint=new char[16];
      for(int j=0;j<16;j++)
		  plaint[j]=0;
     for(int i=0;i<round;i++)
	 {    
	  CString str=strin.Left(16);
      plaint=(LPTSTR)(LPCTSTR)str;  	 	
      for(j=0;j<4;j++)
      { plaintext[j]=(plaint[4*j+0]<<24)|(plaint[4*j+1]<<16)|(plaint[4*j+2]<<8)|plaint[4*j+3];
       /*  temp1=MAKEWORD(plaint[4*i+1],plaint[4*i]);
	     temp2=MAKEWORD(plaint[4*i+3],plaint[4*i+2]);
	     plaintext[i]=MAKELONG(temp2,temp1);*/
	  }
      EncryptProc(plaintext,ciphertext);		 
     for(int k=0;k<4;k++)
	 {
/*		temp1=LOWORD(plaintext[i]);
		temp2=HIWORD(plaintext[i]);
        output[i*4+0]=HIBYTE(temp2); 
		output[i*4+1]=LOBYTE(temp2);         
        output[i*4+2]=HIBYTE(temp1); 
		output[i*4+3]=LOBYTE(temp1);         
       
     output[i*4+0]=ciphertext[i]>>24;
     output[i*4+1]=ciphertext[i]<<8>>24;
     output[i*4+2]=ciphertext[i]<<16>>24;
     output[i*4+3]=ciphertext[i]<<24>>24;  */
     cipherOut[i*4+k]=ciphertext[k];
     strTemp.Format("%lx",ciphertext[k]);   
     strout+=strTemp;         
    }  
 /*   for(i=0;i<16;i++)   
	{   
     strTemp.Format("%c",output[i]);   
     strout+=strTemp;   
	}  	*/
      strin=strin.Mid(16);
	 } 
}

void Serpent::EncryptProc(ULONG* plain,ULONG* cipher)
{
   register ULONG x0, x1, x2, x3;
   register ULONG y0, y1, y2, y3;
   //unsigned long static *temp;
   x0=plain[0];
   x1=plain[1];
   x2=plain[2];
   x3=plain[3];
   /* Start to encrypt the plaintext x */
   keying(x0, x1, x2, x3, subkeys[0]);
   RND00(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 1]);
   RND01(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 2]);
   RND02(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 3]);
   RND03(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 4]);
   RND04(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 5]);
   RND05(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 6]);
   RND06(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 7]);
   RND07(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 8]);
   RND08(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[ 9]);
   RND09(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[10]);
   RND10(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[11]);
   RND11(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[12]);
   RND12(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[13]);
   RND13(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[14]);
   RND14(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[15]);
   RND15(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[16]);
   RND16(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);
   keying(x0, x1, x2, x3, subkeys[17]);
   RND17(x0, x1, x2, x3, y0, y1, y2, y3);
   transform(y0, y1, y2, y3, x0, x1, x2, x3);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -