【问题标题】:CryptoApi to CommonCryptoCryptoApi 到 CommonCrypto
【发布时间】:2015-09-04 07:35:29
【问题描述】:

我有用于 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 - 获取一个对象来处理加密

CryptCreateHash - 创建一个 MD5 散列对象

CryptHashData - 使用 MD5 散列输入数据

CryptDeriveKey, CryptDecrypt - 使用 RC4 解码 pData,使用密钥 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 的安全性或缺陷的 cmets)

【问题讨论】:

    标签: c windows macos cryptography commoncrypto


    【解决方案1】:

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

    【讨论】:

    • 感谢 Sri,但 EVP_BytesToKey 已被弃用,因为 OS X 10.7 不再可用。
    【解决方案2】:

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

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

    这里说明我们需要一个 40 位密钥 (0x00280000 = 40

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

    因此,将一个 16 字节的密钥(仅设置了前 40 位)传递给 CCCryptorCreate 函数会为 Windows 生成匹配的输出。

    【讨论】:

    • 谢谢,我一直在为此苦苦挣扎,完全忘记了前 40 位的奇怪用法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多