我在Windows平台上使用了密码代码,它使用Crypto函数,并需要在OS上将其转换为使用公共密码。
从本质上讲,原始代码是这样的,为了简洁起见,删除了错误检查:
CryptAcquireContext(&m_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT));
CryptCreateHash(m_hProv, CALG_MD5 ,0, 0, &hHash);
CryptHashData(hHash,(LPBYTE)pszInputData, lstrlen(pszInputData)*sizeof(TCHAR), 0);
CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey);
CryptDecrypt(m_hKey, 0, bFinal, 0, pData, pdwDataSize);据我所知,事情就是这样的:-
CryptAcquireContext -获取一个对象来处理密码学 CryptCreateHash -创建一个MD5散列对象 CryptHashData -用MD5散列输入数据 CryptDeriveKey,CryptDecrypt -使用键m_hKey用RC4解码pData
pszInputData的大小为12个字节,两个平台上MD5哈希对象的输出数组都是相同的。
要使用RC4进行解码,我将使用公共密码进行以下操作:-
CCCryptorRef cryptor = NULL;
CCCryptorCreate(kCCDecrypt, kCCAlgorithmRC4, 0,
(void*)m_hKey.data(), m_hKey.length(), NULL, &cryptor);
char outBuffer[12];
size_t outBytes;
CCCryptorUpdate(cryptor, (void*)pData, *pdwDataSize, outBuffer, 12, &outBytes);测试来自公共密码的输出(outBuffer数组)与在线RC4解码器匹配,因此这是正确的解码。
但是,pData中的Windows代码的最终输出与在公共密码中解码的RC4不匹配。
这里的Windows调用是否缺少一些步骤,或者不理解这些步骤;为什么输出不同?
(请注意,我不想征求关于使用RC4的安全性或缺陷的评论)
发布于 2015-06-19 16:30:15
问题在于理解CryptDeriveKey如何使用指定的位数和RC4解密。
CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey);这里声明我们需要一个40位密钥(0x00280000 = 40 << 16)。
然而,当调用CryptDecrypt时,Windows实际上使用16个字节作为键,取前40位,并将数组的其余部分设置为零。
因此,将一个仅设置了前40位的16字节键传递给CCCryptorCreate函数将生成匹配的输出到Windows。
发布于 2015-06-18 16:21:16
尝试使用Open (基于EVP_BytesToKey密码的加密例程)中描述的API。
https://stackoverflow.com/questions/30919161
复制相似问题