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

📄 crypt.txt

📁 包含MD5,SHA-1,DES,RSA的程序代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
EncryValues = GetValues(iMessage,d,n); 
EncryMessage.Format(_T("%d"), EncryValues); 
return EncryMessage; 
} 

CString CRSA::Decrypt(CString szMessage,int e,int n) 
{ 
int EncryValues,iMessage; 
CString EncryMessage; 
iMessage = atoi(szMessage.GetBuffer(szMessage.GetLength())); 
EncryValues = GetValues(iMessage,e,n); 
EncryMessage.Format(_T("%d"), EncryValues); 
return EncryMessage; 
} 

//获取与Itemp的素数 
int CRSA::GetSecretKey(int p, int q) 
{ 
int IResult,Itemp; 
Itemp = (p-1)*(q-1); 
for(IResult = (int)(0.2*Itemp);IResult < Itemp;IResult++) 
 if(IsPrime(IResult)) 
  return IResult; 
return Itemp; 
} 

//判别是否为素数 
BOOL CRSA::IsPrime(int x) 
{ 
int k; 
k = int(sqrt ( x )); 
for ( int i = 2; i <= k; i ++ ) 
{ 
 if ( x % i == 0 )     
  break; 
} 
if ( i >= k + 1 )               
 return  TRUE; 
else 
 return  FALSE; 
} 

/* 
求高次模运算 
输入参数:u表示公开密钥,V为n 
*/ 
int CRSA::GetValues(int iMessage,int d,int n) 
{ 
int s,t,u; 
s = 1; 
t = iMessage; 
u = d; 
while(u) 
{ 
 if(u&1) 
  s = (s*t)%n; 
 u>>=1; 
 t = (t*t)%n; 
} 
return s; 
} 

/* 
求模逆元运算---欧几里德拓展算法 
输入参数:u表示t,V为公开密钥 
*/ 
void CRSA::ExtBinEuclid(int* u,int* v,int* u1,int* u2,int* u3) 
{ 
int k,t1,t2,t3; 
if(* u < * v) 
 swap(* u,* v); 
for(k = 0;isEven(*u)&&isEven(*v);++k) 
{ 
 *u >>= 1; 
 *v >>= 1; 
} 
*u1 = 1; 
*u2 = 0; 
*u3 = *u; 
t1 = *v; 
t2 = *u - 1; 
t3 = *v; 
do 
{ 
 do 
 { 
  if(isEven(*u3)) 
  { 
   if(isOdd(*u1) || isOdd(*u2)) 
   { 
    *u1 += *v; 
    *u2 += *u; 
   } 
   *u1 >>= 1; 
   *u2 >>= 1; 
   *u3 >>= 1; 
  } 
  if(isEven(t3) || *u3 < t3) 
  { 
   swap(*u1,t1); 
   swap(*u2,t2); 
   swap(*u3,t3); 
  } 
 }while(isEven(*u3)); 
 while(*u1 < t1 || *u2 < t2) 
 { 
  *u1 += *v; 
  *u2 += *u; 
 } 
 *u1 -= t1; 
 *u2 -= t2; 
 *u3 -= t3; 
}while(t3 > 0); 
while(*u1 >= *v && *u2 >= *u) 
{ 
 *u1 -= *v; 
 *u2 -= *u; 
} 
*u1 <<= k; 
*u2 <<= k; 
*u3 <<= k; 
} 

5)、DES 

// DES.h: interface for the CDES class. 
// 
////////////////////////////////////////////////////////////////////// 

#if !defined(AFX_DES_H__20CE37EF_1AD4_43FD_A437_9FABCF07E121__INCLUDED_) 
#define AFX_DES_H__20CE37EF_1AD4_43FD_A437_9FABCF07E121__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
class CDES   
{ 
public: 
CString Decrypt(); 
CString Encrypt(CString szMessage,CString szKey); 
CDES(); 
virtual ~CDES(); 
void Transform(int NumShift);//进行IP置换 

private: 
int  oldMessage[64];//原来的64位明文 
int  tempByte[8];//8位字节,也就是64位 
int  Key[56];//56位密钥 
int  subKey[48];//48位子密钥, 是从56位选出来的密钥 

int  L0[32],R0[32];//对明文进行左右平分 
int  LTemp[32],RTemp[32];//临时变量 
int  KeyC0[28],KeyD0[28];//初始密钥 

int  RShift[48];//密钥移动的位数与Ki形成F函数 

int  S[8][6];//S盒 
int  S0[8];//初始 
int frk[32];//f函数的32位数与Ri做模2运算 

int stmp[8];//将S0存储S盒的值 
int item; 
bool isDecrypt;//是否为加密还是解密 
}; 

#endif // !defined(AFX_DES_H__20CE37EF_1AD4_43FD_A437_9FABCF07E121__INCLUDED_) 


6)
// DES.cpp: implementation of the CDES class. 
// 
////////////////////////////////////////////////////////////////////// 

#include "stdafx.h" 
#include "EncryAndDecrypt.h" 
#include "DES.h" 
#include "table.h" 

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

////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
//默认的构造函数 
CDES::CDES() 
{ 

} 

CDES::~CDES() 
{ 

} 

//每一轮的迭代 
void CDES::Transform(int NumShift) 
{ 
//生成子密钥ki 
int j=2; 
// 移位次数 
if( NumShift==1||NumShift==2||NumShift==9||NumShift==16) 
{ 
 j=1; 
} 
////////////////////////////////////////////////////////////////////////// 
//如果为解密,迭代移位的次序变换相反方向 
if(isDecrypt) 
{ 
 if(NumShift == 16) 
 { 
  j=0; 
 } 
 else if(NumShift ==15||NumShift ==8||NumShift==1) 
 { 
  j=-1; 
 } 
 else 
 { 
  j=-2; 
 } 
} 

int Kctmp[28], Kdtmp[28]; //  C0, D0中间传递数据 
memset(Kctmp, 0, 28); 
memset(Kdtmp, 0, 28); 
for(int i=0; i<28; i++) 
{ 
 Kctmp[i]=KeyC0[(i+j+28)%28]; 
 Kdtmp[i]=KeyD0[(i+j+28)%28]; 
} 

////////////////////////////////////////////////////////////////////////// 
// 将KCTMP, KDTMP的数据存入KC,KD中去 
for(i=0; i<28; i++) 
{ 
 KeyC0[i]=Kctmp[i]; 
 KeyD0[i]=Kdtmp[i]; 
} 

////////////////////////////////////////////////////////////////////////// 
// 生成子密钥Ki,存储到数组k1[48]中去 
int ktmp[56]; 
memset(ktmp, 0, 56); 
for(i=0; i<28; i++) 
{ 
 ktmp[i]=KeyC0[i]; 
 ktmp[i+28]=KeyD0[i]; 
} 

memset(subKey, 0, 48); 
for(i=0; i<48; i++) 
{ 
 subKey[i]=ktmp[PC2_Table[i]-1]; 
} 

////////////////////////////////////////////////////////////////////////// 
//将Ri-1扩充成48位并与Ki相加并模2 
memset(RShift, 0, 48); 
for(i=0; i<48; i++) 
{ 
 RShift[i]=(R0[E_Table[i]-1]+subKey[i])%2; 
} 

////////////////////////////////////////////////////////////////////////// 
//分成8组, 每组6位,有一个二维数组s[8][6]存储 
for(i=0; i<6; i++) 
{ 
 for(int j=0; j<8; j++) 
 { 
  S[j][i]=RShift[6*j+i]; 
 } 
} 

////////////////////////////////////////////////////////////////////////// 
//以下通过8个S盒得到8个S数并存到S[8]中S_Box[8][4][16] 
memset(S0, 0, 8); 
for(i=0; i<8; i++) 
{ 
 S0[i]=S_Box[i][S[i][5]+S[i][0]*2][S[i][1]*8+S[i][2]*4+S[i][3]*2+S[i][4]]; 
} 

memset(stmp, 0, 8); 
memcpy(stmp, S0, sizeof(S0)); 
////////////////////////////////////////////////////////////////////////// 
// 将8个数分别转换成2进制,再存入到frk[32] 
int f[32]; 
memset(f, 0, 32); 
for(i=0; i<8; i++) 
{ 
 int tmp[4]; 
 memset(tmp, 0, 4); 
 for(int j=0; j<4; j++) 
 { 
  tmp[j]=S0[i]%2; 
  S0[i]/=2; 
 } 
 for(j=0; j<4; j++) 
 { 
  f[4*i+j]=tmp[3-j]; 
 } 
} 

// 经过P变换存入frk[32] 
for(i=0; i<32; i++) 
{ 
 frk[i]=f[P_Table[i]-1]; 
} 

int Ltmp[32], Rtmp[32]; 
memset(Ltmp, 0, 32); 
memset(Rtmp, 0, 32); 

for(i=0; i<32; i++) 
{ 
 Ltmp[i]=R0[i]; 
 Rtmp[i]=(L0[i]+frk[i])%2; 
} 

// 最后将数据存入L0,RO里面去 
for(i=0; i<32; i++) 
{ 
 L0[i]=Ltmp[i]; 
 R0[i]=Rtmp[i]; 
} 

} 
CString CDES::Encrypt(CString szMessage,CString szKey) 
{ 
//初始化数组元素清0 
memset(L0, 0, 32);   
memset(R0, 0, 32); 

memset(subKey, 0, 48); 
memset(KeyC0, 0, 28); 
memset(KeyD0, 0, 28); 

memset(RShift, 0, 48); 
memset(oldMessage, 0, 64); 

memset(S, 0, 48); 
////////////////////////////////////////////////////////////////////////// 
// 此处开始加密 
////////////////////////////////////////////////////////////////////////// 
/// 此处对明文处理,将对应的ASCII码转化为二进制 
int flag=true; 
for(int i=0; i<8; i++) 
{ 
 //为szMessage输入的字符串 
 char ch = szMessage.GetAt(i); 
 if(ch&0x80&&flag) 
 { 
  AfxMessageBox("含有中文字符"); 
  flag=false; 
 } 
 memset(tempByte, 0, 8); 
 for(int j=0; j<8; j++) 
 { 
  tempByte[j]=(ch%2+2)%2; 
  ch/=2; 
 } 
 for(j=7; j>=0; j--) 
 { 
  oldMessage[i*8+7-j]=tempByte[j]; 
 } 
} 

for(i=0; i<32; i++) 
{ 
 L0[i]=oldMessage[IP_Table[i]-1];   /// 获得L0共32位 
 R0[i]=oldMessage[IP_Table[i+32]-1];  /// 获得R0共32位 
} 

////////////////////////////////////////////////////////////////////////// 
/// 此处开始对C0,D0处理 
for(i=0; i<8; i++) 
{ 
 memset(tempByte, 0, 8); 
 //szKey为输入的密钥 
 char ch = szKey.GetAt(i); 
 if(ch&0x80) 
 { 
  AfxMessageBox("含有中文字符"); 
  return "FALSESTRING"; 
 } 
 for(int j=0; j<8; j++) 
 { 
  tempByte[j]=ch%2; 
  ch/=2; 
 } 
 for(j=7; j>=0; j--) 
 { 
  Key[i*8+7-j]=tempByte[j]; 
 } 
} 

for(i=0; i<28; i++) 
{ 
 KeyC0[i]=Key[PC1_Table[i]-1];   /// 获得c0共28位 
 KeyD0[i]=Key[PC1_Table[i+28]-1];  /// 获得d0共28位 
} 

7)


//对字符串或者是16进制数据进行加密或者解密 
void CEncryAndDecryptDlg::OnBtnstringdigest() 
{ 
// TODO: Add your control notification handler code here 
//判别算法为加密算法还是解密算法 
CButton* poAction = (CButton*)(GetDlgItem(IDC_RADENCRYPT)); 
CEdit* poEdit; 
//获取单选框的值,用于区分为字符串还是16进制数据 
CButton* poButton = (CButton*)(GetDlgItem(IDC_RADALPHA)); 
//确定选择的方法 
/*switch(m_iMethod) 
{ 
 case DES: 
  AfxMessageBox("采用DES算法"); 
  break; 
 case MD5: 
  AfxMessageBox("采用MD5算法"); 
  break; 
 case RSA: 
  AfxMessageBox("采用RSA算法"); 
  break; 
}*/ 
CString strTemp,strPrimeP,strPrimeQ;//用于获取EDIT中输入的信息 

⌨️ 快捷键说明

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