CryptoApi 到 CommonCrypto

标签 c windows macos cryptography commoncrypto

我有在 Windows 平台中使用的密码代码,它使用 Crypto API 函数,需要将其转换为在 OS X 上使用 Common Crypto。

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

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 - Get an object to handle the cryptography

CryptCreateHash - Create an MD5 hashing object

CryptHashData - Hash the input data with MD5

CryptDeriveKey, CryptDecrypt - Decode pData with RC4, using the key m_hKey

pszInputData大小为12字节,MD5哈希对象的输出数组在两个平台上是一样的。

为了使用 RC4 进行解码,我正在使用 Common Crypto 执行以下操作:-

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);

使用在线 RC4 解码器测试 Common Crypto 的输出(outBuffer 数组)是否匹配,因此解码正确。

但是,pData 中 Windows 代码的最终输出与 Common Crypto 中解码的 RC4 不匹配。

这里的 Windows Crypto API 调用是否有一些我遗漏或不理解的步骤?为什么输出不同?

(请注意,我不是在寻找有关使用 RC4 的安全性或缺陷的评论)

最佳答案

问题原来是理解 CryptDeriveKey 如何使用 RC4 解密的指定位数。

CryptDeriveKey(m_hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE | 0x00280000, &m_hKey);

此处说明我们需要一个 40 位 key (0x00280000 = 40 << 16)。

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

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

关于CryptoApi 到 CommonCrypto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30919161/

相关文章:

将用户输入与文本文件进行比较并在 C 中循环

windows - 尝试使用Progressbar运行tkinter时Python崩溃

c++ - 在 win32 控制台应用程序中跟踪剪贴板更改数据?

python - 如何使用 python 在 MacOS 上设置代理设置

android - Mac Eclipse 分层 View 也在 com.example.test(包)中

c - Islower功能故障

c - 关于 MPI_Reduce

c# - 在 Windows XP Embedded 上禁用每个控件的 C# Winforms 应用程序中的右键单击(按住)

objective-c - 本地插入符号位置 macos cocoa

c - 有多少单词使 memcpy 值得?