|
下载本文示例源代码 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;elseiCount=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步的数据处理,每人也可以根据自己的具体情况用别的计算方法替换。
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=1char 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=168int d=5;//求得解密键,即满足公式:(d*29) mod k=1int 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 + |