高手请进!-----关于CString与BYTE相互转化的问题!
非常谢谢!
我要进行的操作过程是这样的:
CString sTest="ABC";//明文
CString sKEY="ABC";// 密匙
我的目的是将这两个串异或,由此将明文加密.
解密是将结果与密匙再进行一次异或.
我知道CString是不能直接进行按位异或的,得先转化为BYTE类型.
请问这个过程如何实现?特别感谢!
问题点数:20、回复次数:14Top
1 楼sungengyu(快乐机器)回复于 2005-06-01 09:50:52 得分 0
CString 重载了 operator const CHAR* 可以直接转化为 const CHAR*
Top
2 楼stoney0914(石头)回复于 2005-06-01 09:53:58 得分 0
能不能说说具体怎么实现啊?
谢谢!Top
3 楼sungengyu(快乐机器)回复于 2005-06-01 09:54:39 得分 0
CString 重载了 operator [] ,sTest[i]就可以取得第i个字符。
Top
4 楼sungengyu(快乐机器)回复于 2005-06-01 10:00:03 得分 20
int len = sTest.GetLength() ;
char *buffer = new char[len+1] ;
buffer[len] = 0 ;
ASSERT(len>=sKey.GetLength() ; // 密匙 的长度不要小于明文的长度
for(int i=0 ; i<len ; i++)
{
buffer[i] = sTest[i] ^ sKey[i] ; // 异或
}
// 得到的 buffer 就是密文。
delete []buffer ;Top
5 楼sungengyu(快乐机器)回复于 2005-06-01 10:01:46 得分 0
ASSERT(len>=sKey.GetLength() ; // 密匙 的长度不要小于明文的长度
--------------------------------------------------------------------
这个写错了,应该是
ASSERT( len <= sKey.GetLength() ) ;
抱歉。Top
6 楼stoney0914(石头)回复于 2005-06-01 10:05:07 得分 0
那异或操作呢?
是这样吗?
int index;
index=0;
for(int i=0;i<sTest.GetLength;i++)
{
sTest[i]=sTest[i]^sKEY[(index++)];
if(index=sKEY.GetLength)index=0;
}
自己很笨,这个问题弄了好几天!
希望能得到帮助.Top
7 楼gwinner(动力引擎)回复于 2005-06-01 10:06:10 得分 0
void
EncryptPsw(const CString & sPsw, const CString & sKey, BYTE * pbEncryptedPsw, const int & nBuffLenEncryptedPsw)
{
ASSERT(pbEncryptedPsw);
ASSERT(sKey.GetLength() >= sPsw.GetLength());
ASSERT(sPsw.GetLength() <= nBuffLenEncryptedPsw);
for (int i = 0; i < sPsw.GetLength(); i++)
{
pbEncryptedPsw[i] = sPsw[i] ^ sKey[i];
}
}Top
8 楼stoney0914(石头)回复于 2005-06-01 10:08:38 得分 0
谢谢啦!
那buffer里的内容如何再变成字符串CString呢?Top
9 楼sungengyu(快乐机器)回复于 2005-06-01 10:14:32 得分 0
1. sTest[i] = sTest[i] ^ sKey[index++] ;
// 这个地方过不去,sTest[i] 好像只能读不能写。
2. sTest.GetLength 这个地方漏了括号,应该是 sTest.GetLength()
3. if(index=sKey.GetLength)
判断等于要用 == ,不能用 =
Top
10 楼sungengyu(快乐机器)回复于 2005-06-01 10:17:25 得分 0
稍微改了一点:
int len = sTest.GetLength() ;
char *buffer = new char[len+1] ;
buffer[len] = 0 ;
int index = 0 ;
for(int i=0 ; i<len ; i++)
{
buffer[i] = sTest[i] ^ sKey[index++] ; // 异或
if( index == sKey.GetLength() ) index = 0 ;
}
// 得到的 buffer 就是密文。
CString answer = buffer ; // 直接对 CString 赋值就行了。
delete []buffer ;
Top
11 楼stoney0914(石头)回复于 2005-06-01 10:30:38 得分 0
下面的程序进行调试后,结果是"qrs",结果不应该是这个吧!?
CString sTest="ABC";//明文
CString sKey="0";// 密匙
int len = sTest.GetLength() ;
char *buffer = new char[len+1] ;
buffer[len] = 0 ;
int index = 0 ;
for(int i=0 ; i<len ; i++)
{
buffer[i] = sTest[i] ^ sKey[index++] ; // 异或
if( index == sKey.GetLength() ) index = 0 ;
}
// 得到的 buffer 就是密文。
CString answer = buffer ; // 直接对 CString 赋值就行了。
delete []buffer ;
AfxMessageBox(answer);Top
12 楼sungengyu(快乐机器)回复于 2005-06-01 10:41:16 得分 0
'A' ^ '0' = 'q'
'A' = 0x30 ; // 00110000
'0' = 0x41 ; // 01000001
'q' = 0x71 ; // 01110001
有问题么?
Top
13 楼stoney0914(石头)回复于 2005-06-01 10:47:16 得分 0
'A'的ASCII码是:65, 转化为16进制是41H啊?
'0'是00H
Top
14 楼stoney0914(石头)回复于 2005-06-01 10:51:49 得分 0
明白了,隆重谢谢!
感谢的一塌糊涂!Top




