程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++中實現數據加密

VC++中實現數據加密

編輯:關於VC++

為了保證數據的安全性與完整性,常常要對數據進行加密,在數據傳輸過程進行數據加密可以防止中途非法截獲。我們通常稱原始數據叫做源文,用約定的加密算法進行加密處理。加密算法的輸入是源文與加密鍵,而輸出的則是密文。加密算法可以分為兩種,一種是密鍵加密算法,一種是明鍵加密法。

一、密鍵加密法:

加密算法可以公開,但加密鍵一定要保密。密文對不知道加密鍵的人來說,是不容易解密的。如下述算法:

A.把源文分成等長的塊,每塊的長度和加密鍵的長度相等,對長度不夠的塊用空格補充;

B.用自己定義的整數代替源文的數據;

C.對加密鍵也進行數據替換操作;

D.對源文的整數碼與加密鍵相應字符的整數碼進行相加,然後對某一整數進行取模操作;

E.將整數碼再用相應的字符進行替換,這樣就得到了密文。

實現代碼如下:

CString CEncryptDlg::Encrypt_Key(CString Source,CString Key)
{
  int iSourceLen,iKeyLen;
  int iCount;
  div_t div_Result;
  char strTarget[255];
  char pKey[255],pSource[255],pMid[255];
  CString strTmp;
  int i,j,n;
  BYTE PWD_key[255];
  j=0;
  for (i=32;i<=126;i++)
  {
    PWD_key[i]=j;
    j++;
  }//取ASCII值在32~126之間的可視字符
  iSourceLen=Source.GetLength();
  iKeyLen=Key.GetLength();
  div_Result=div(iSourceLen,iKeyLen);
  if (div_Result.rem)
    iCount=div_Result.quot+1;
  else
    iCount=div_Result.quot;
  wsprintf(pKey,"%s",m_Key);
  n=0;
  for (i=1;i<=iCount;i++)
  {
    strTmp=Source.Mid((i-1)*iKeyLen,iKeyLen);
    if (strTmp.GetLength()<iKeyLen)
    {
      for (j=1;j<=iKeyLen-strTmp.GetLength();j++)
        strTmp+=" ";
    }
    wsprintf(pSource,"%s",strTmp);
    for (j=1;j<=iKeyLen;j++)
    {
      int k1;
      int k2;
      k1=PWD_key[pKey[j-1]];
      k2=PWD_key[pSource[j-1]];
      int k=k1+k2;
      div_Result=div(k,ENCRYPT_KEY);
      k=div_Result.rem;
      pMid[j-1]=k;
      strTarget[n++]=k;
    }//對源文進行替換加密處理
  }
  for (j=0;j<n;j++)
  {
    strTarget[j]+=32;
    if (strTarget[j]==32) strTarget[j]=''*''; //用“*”替代密文中的空格
  }
  strTarget[n]=''\0'';
  CString strResult;
  strResult.Format("%s",strTarget);
  return(strResult);
}

注:對D步的數據處理,每人也可以根據自己的具體情況用別的計算方法替換。

二、明鍵加密算法

明鍵加密算法可以隨意使用加密算法與加密鍵,但是解密鍵是保密的。所在,它同時需要兩個鍵,一個用於加密,一個用於解密。而解密鍵不能從加密鍵推出的。從而,每個人都可以對源文進行加密操作,但是在沒有授權進行解密時,他是不能完成解密工作的,因為他不知道解密鍵。具體算法如下所述:

A.任意選擇兩個質數p與q,它們取值最好在100位左右。同時計算r=p*q;

B.任意選擇一個整數e,e是與(p-1)*(q-1)互為質數的,e就是算法中的加密鍵;

C.求解方程式:(d*e) mod ((p-1)*(q-1))=1,d即是加密算法中的解密鍵;

D.對源文p進行加密即可得到密文,計算公式為c=pe mod r;c即為密文;

E.對密文c進行解密即可得到源文,計算公式為p=cd mod r;p即為源文;

加密算法實現如下:

CString CEncryptDlg::Encrypt_KnownKey(CString Source)
{
   int r=ENCRYPT_P*ENCRYPT_Q;
   int e=101;
   //設置加密鍵,一般比P與Q大的質數就可以選作加密鍵
   int k=(ENCRYPT_P-1)*(ENCRYPT_Q-1);
   int d=5;
   //求得解密鍵,即滿足公式:(d*11) mod k=1
   char pSource[255];
   char pTarget[255];
   int iLen;
   int i;
   DWORD dw1;
   wsprintf(pSource,"%s",m_Source);
   iLen=m_Source.GetLength();
   for (i=0;i<iLen;i++)
   {
     div_t div_Result;
     dw1=Exp(pSource[i],e,r);
     div_Result=div(dw1,r);
     pTarget[i]=div_Result.rem;
     //獲取密文
   }
   pTarget[iLen]=''\0'';
   CString strTarget;
   strTarget.Format("%s",pTarget);
   return(strTarget);
}

解密算法如下:

CString CEncryptDlg::Decode_KnownKey(CString Source)
{
   int r=ENCRYPT_P*ENCRYPT_Q;
   int e=101;
   //設置加密鍵,一般比P與Q大的質數就可以選作加密鍵
   int k=(ENCRYPT_P-1)*(ENCRYPT_Q-1);//k=168
   int d=5;
   //求得解密鍵,即滿足公式:(d*29) mod k=1
   int iLen=m_Source.GetLength();
   char pSource[255],pTarget[255];
   wsprintf(pSource,"%s",m_Source);
   for (int i=0;i<iLen;i++)
   {
     DWORD dw1;
     dw1=Exp(pSource[i],d,r);
     div_t div_Result;
     div_Result=div(dw1,r);
     pTarget[i]=div_Result.rem;
   }
   pTarget[iLen]=''\0'';
   CString strTarget;
   strTarget.Format("%s",pTarget);
   return(strTarget);
}

本文僅列出了最基本的算法實現,只是為了拋磚引玉。

程序在Windows XP + VC++ 6.0下調試通過。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved