Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenSSL API实现Windows CryptoAPI CryptoderiveKey_C_Encryption_Cross Platform_Openssl_Cryptoapi - Fatal编程技术网

使用OpenSSL API实现Windows CryptoAPI CryptoderiveKey

使用OpenSSL API实现Windows CryptoAPI CryptoderiveKey,c,encryption,cross-platform,openssl,cryptoapi,C,Encryption,Cross Platform,Openssl,Cryptoapi,我有一个使用AES-128加密/解密给定数据的加密API代码,以及一个使用SHA-256从密码派生的密钥 我如何编写一个OpenSSL等效实现,以便能够用它加密数据,然后用CryptoAPI解密数据,反之亦然 尝试将EVP_BytesToKey与EVP_aes_128_cbc()和EVP_sha256()一起使用“按原样”无法正常工作。 (我所说的“不起作用”的意思是-无法解密CryptoAPI生成的加密数据,反之亦然。这确实适用于解密OpenSSL的加密数据) 有什么想法或好的参考资料吗 先谢

我有一个使用AES-128加密/解密给定数据的加密API代码,以及一个使用SHA-256从密码派生的密钥

我如何编写一个OpenSSL等效实现,以便能够用它加密数据,然后用CryptoAPI解密数据,反之亦然

尝试将EVP_BytesToKey与EVP_aes_128_cbc()和EVP_sha256()一起使用“按原样”无法正常工作。 (我所说的“不起作用”的意思是-无法解密CryptoAPI生成的加密数据,反之亦然。这确实适用于解密OpenSSL的加密数据)

有什么想法或好的参考资料吗

先谢谢你

以下是Windows CryptoAPI代码:

// Get the handle to the default provider. 
      if(CryptAcquireContext(
                   &hCryptProv, 
                   NULL, 
                   MS_ENH_RSA_AES_PROV, 
                   PROV_RSA_AES, 
                   CRYPT_VERIFYCONTEXT))
          {
                   _tprintf(
                             TEXT("A cryptographic provider has been acquired. \n"));
          }
          else
          {
                   goto Exit_PrepareCAPI;
          }
          // Create a hash object. 
          if(!CryptCreateHash(
                   hCryptProv, 
                   HASH_ALGORITHM, 
                   0, 
                   0, 
                   &hHash))
          {
                   goto Exit_PrepareCAPI;
          }
          // Hash in the password data. 
          if(!CryptHashData(
                   hHash, 
                   (BYTE*) strPassword.c_str(),
                   strPassword.length(),
                   (DWORD)0)) 
          {
                   goto Exit_PrepareCAPI;
          }
          // Derive a session key from the hash object. 
          if(!CryptDeriveKey(
                   hCryptProv, 
                   ENCRYPT_ALGORITHM, 
                   hHash, 
                    0x00800000 /*128 bit*/, 
                   &hKey))
          { 
                   goto Exit_PrepareCAPI;
          }
          DWORD cryptMode = CRYPT_MODE_CBC;

          if(!CryptSetKeyParam(
                   hKey, 
                   KP_MODE, 
                   (BYTE*)&cryptMode, 
                   0))
          { 
                   goto Exit_PrepareCAPI;
          }

                   if(!CryptGetHashParam(
                   hHash,
                   HP_HASHSIZE,
                   (BYTE *)&dwHashLen,
                   &dwHashLenSize,
                   0))
          {
                   goto Exit_PrepareCAPI;
          }

          pbHash = new BYTE[dwHashLen];

          if(!CryptGetHashParam(
                   hHash,
                   HP_HASHVAL,
                   pbHash,
                   &dwHashLen,
                   0))
          {
                   goto Exit_PrepareCAPI;
          }

          SecureZeroMemory( ivBuff, sizeof(ivBuff) );

          for(DWORD i = 16, j = 0 ; i < dwHashLen ; i++, j++)
          {
                   ivBuff[j] = pbHash[i];
          }

          if(!CryptSetKeyParam(
                   hKey, 
                   KP_IV, 
                   ivBuff, 
                   0))
          { 
                   goto Exit_PrepareCAPI;
          }
          //
          // Read the data into pre-allocated pbBuffer
          //
// Encrypt data.           if(!CryptEncrypt(
                    hKey, 
                    NULL, 
                    fEOF,
                    0, 
                    pbBuffer, 
                    &dwCount, 
                    dwBufferLen))
{ 
                    goto Exit_MyEncryptFile;
          } 
Exit_MyEncryptFile:
          // Cleanup allocated objects
//获取默认提供程序的句柄。
如果(加密)上下文(
&hCryptProv,
无效的
吴恩华女士,
证明,
CRYPT_VERIFYCONTEXT)
{
_tprintf(
文本(“已获取加密提供程序。\n”);
}
其他的
{
转到出口(准备出口);;
}
//创建一个散列对象。
if(!CryptCreateHash)(
hCryptProv,
哈希算法,
0, 
0, 
&hHash))
{
转到出口(准备出口);;
}
//密码数据中的散列。
if(!CryptHashData)(
哈什,
(字节*)strPassword.c_str(),
strPassword.length(),
(德沃德)0)
{
转到出口(准备出口);;
}
//从哈希对象派生会话密钥。
if(!CryptDeriveKey)(
hCryptProv,
加密算法,
哈什,
0x00800000/*128位*/,,
&(港币)
{ 
转到出口(准备出口);;
}
DWORD cryptMode=CRYPT_MODE_CBC;
如果(!CryptSetKeyParam)(
香港大学,
KP_模式,
(字节*)&密码模式,
0))
{ 
转到出口(准备出口);;
}
如果(!CryptGetHashParam)(
哈什,
HP_HASHSIZE,
(字节*)和dwHashLen,
&dwHashLenSize,
0))
{
转到出口(准备出口);;
}
pbHash=新字节[dwHashLen];
如果(!CryptGetHashParam)(
哈什,
HP_HASHVAL,
pbHash,
&德瓦哈斯伦,
0))
{
转到出口(准备出口);;
}
SecureZeroMemory(ivBuff,sizeof(ivBuff));
对于(DWORD i=16,j=0;i
毕竟,这个代码起作用了:

int generateKey(const string& strSecter)
{    
SHA256_CTX sha256Ctx;
unsigned char hash[SHA256_DIGEST_LENGTH];
SecureZeroMemory(hash, sizeof hash);
SHA256_Init(&sha256Ctx);
SHA256_Update(&sha256Ctx, strSecter.c_str(), strSecter.length());
SHA256_Final(hash, &sha256Ctx);
memcpy(Key, hash, AES_BLOCK_SIZE);
memcpy(IV, hash + AES_BLOCK_SIZE, AES_BLOCK_SIZE);

return 0;
}

希望这会对某人有所帮助。

据我所知,对于32字节的SHA256,前16个字节将是键,其余16个字节将是IV。使用20字节的SHA1如何?