首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CryptoApi到CommonCrypto

CryptoApi到CommonCrypto
EN

Stack Overflow用户
提问于 2015-06-18 15:08:00
回答 2查看 502关注 0票数 2

我在Windows平台上使用了密码代码,它使用Crypto函数,并需要在OS上将其转换为使用公共密码。

从本质上讲,原始代码是这样的,为了简洁起见,删除了错误检查:

代码语言:javascript
复制
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进行解码,我将使用公共密码进行以下操作:-

代码语言:javascript
复制
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的安全性或缺陷的评论)

EN

回答 2

Stack Overflow用户

发布于 2015-06-19 16:30:15

问题在于理解CryptDeriveKey如何使用指定的位数和RC4解密。

代码语言:javascript
复制
CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey);

这里声明我们需要一个40位密钥(0x00280000 = 40 << 16)。

然而,当调用CryptDecrypt时,Windows实际上使用16个字节作为键,取前40位,并将数组的其余部分设置为零。

因此,将一个仅设置了前40位的16字节键传递给CCCryptorCreate函数将生成匹配的输出到Windows。

票数 1
EN

Stack Overflow用户

发布于 2015-06-18 16:21:16

尝试使用Open (基于EVP_BytesToKey密码的加密例程)中描述的API。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30919161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档