📄 crypt.txt
字号:
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 + -