我有在 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/
我编写了一个程序,该程序应该使用WindowsCryptoAPI保存和恢复用户证书。我的印象是它工作正常,但现在用户提示证书恢复后附加到证书的私钥无效。我使用以下方式保存证书:HCERTSTOREhCertStore=CertOpenStore(CERT_STORE_PROV_PHYSICAL_W,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER|CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG|CERT_STORE_UPDATE_KEYID_FLAG,(PVOID)storeName.c_str()
我有在Windows平台中使用的密码代码,它使用CryptoAPI函数,需要将其转换为在OSX上使用CommonCrypto。基本上原始代码是这样的,为简洁起见删除了错误检查:-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);CryptDe
我已经采用了SHA1HMACexample来自微软的网站并根据这个stack-overflowpost进行了修改以及Internet上的其他一些建议,但是我无法生成正确的值。基本上我只是将SHA1替换为MD5CALG_SHA1->CALG_MD5。有人有工作示例吗?密码的CryptDeriveKey()使用什么算法(RC2或RC4)重要吗?谢谢!编辑:找到工作代码here 最佳答案 您的值与示例不同,因为您使用了不同的键:可以使用Linux获取示例值openssldgst-md5-hmackey命令。如果该命令的长度小于MD5哈希b
我正在考虑使用来自Python的WindowsCryptoAPI,但我找不到任何现有的模块-作为win32all套件的一部分的win32crypt模块只公开了几个没有用的高级函数对我来说。是否有包装CryptoAPI的现有模块?搜索PyPi找到了zip。从ctypes、cython等调用API的示例代码失败将很有用。 最佳答案 这个:HowcanIuseaDLLfilefromPython?+从Crypt32.dll获取所需函数的地址应该可行。 关于python-如何从Python使用W
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我需要使用MicrosoftCryptoAPI编写自己的SSL套接字(CSocketansestor)以及服务器端证书验证。你能告诉我哪本书对我有帮助(或任何其他用户友好的信息来源)吗?
我试图充分利用MSCAPI,并陷入了一个巨大的恶作剧......SunMSCapi提供者只有,嗯,提供,因为缺乏更好的词,至少对于签名,以下算法:MD2withRSAMD5与RSASHA1与RSA而且我并不急于使用BouncyCaSTLe制作的GOST3411withECGOST3410或RIPEMD128withRSA等算法使用,但它会很好,在这种特殊情况下,即使不是必需的,也非常重要,至少能够登录SHA256withRSA算法...(512等和ECDSA加密,将是一个很大的优势,但我不期望那么多)。我正在尝试寻找替代方案,但只找到了thiswrapper,看起来不错,但我必须再深入
我有一个CERT_CONTEXT我通过CryptoAPI从Windows上的智能卡中提取的结构。我需要将此结构转换为与OpenSSL一致的DER编码字节数组。到目前为止我得到的最接近的匹配是通过CryptEncodeObject使用X509_ASN_ENCODING和采用CERT_INFO的X509_CERT_TO_BE_SIGNED修饰符结构作为输入。问题是它与OpenSSLi2d_X509生成的输出不匹配功能。使用2048位x509证书作为输入,OpenSSL产生1789字节的编码输出,而WindowsCryptoAPI产生1638字节的编码输出。我能看到的唯一选项是使用CERT_
我在Windowskeystore中创建了RSAkey对。我成功加密数据(对称key):HCERTSTOREhstore=::CertOpenSystemStore(NULL,L"TestStore");PCCERT_CONTEXTpctxt=::CertFindCertificateInStore(hstore,X509_ASN_ENCODING,NULL,CERT_FIND_SUBJECT_STR,L"MyTestKeys",NULL);HCRYPTPROVhprovider=NULL;if(!::CryptAcquireContext(&hprovider,NULL,MS_ENH
美好的一天。Stackoverflow之前已经帮过我很多次了,但是我有点卡在这上面,希望有人能给我一些指点。背景:我需要将证书的X509数据传递给Adobe的SDKCertListCab,以便使用我的Acrobat插件API签署PDF。我的问题是如何使用CryptoAPI从PFX证书中获取X509数据?我做了以下事情:将我的PFX证书转换为内存存储。CRYPT_DATA_BLOB数据;打开文件并填充数据。FILE*fIn=fopen("C:\\certificate\\MyPfx.pfx","rb")fseek(fIn,0,SEEK_END);data.cbData=ftell(f
是的,所以我有一个API,我正试图将密码传递给它。我需要将密码作为加密的AES256字符串发送。我有一个使用Rijndael用C#编写的这个过程的工作实现。这是如下:AESKey.Text="WebServices_TestKeyT218adje2s83a";UniqueIV.Text="T6wfOZgP0Q1uq0gaEHo8ww==";pwd1.Text=@"test12";ASCIIEncodingtextConverter=newASCIIEncoding();//Padenteredpasswordtomultipleof16intpadLen=16-(pwd1.TextLe