Re: CCryptProv Q
On Jan 24, 1:39 pm, "Tom Walker" <nob...@example.com> wrote:
"mike" <mikebi...@hotmail.com> wrote in
messagenews:dbc91611-9ca7-4b45-9195-ea3983b33c48@e32g2000prn.googlegrou=
ps.com...
However, I now have another problem in that the Encrypt method only
seems to encrypt the first 8 bytes. This is my function; hoping a
fresh set of eyes can spot something obvious.
DWORD encLength = 0;
hr = derKey.Encrypt(
TRUE
, m_pbInBuffer
, &encLength
, m_lOutBufferLength
, md5
);
By setting encLength = 0, you are telling the Encrypt function to encryp=
t
zero bytes.
Tom,
Thanks for the help. I have finally got this to work:
HRESULT CEncryptLib::EncryptBuffer( )
{
HRESULT hr = E_FAIL;
CString errMsg;
CCryptProv prov;
hr = prov.Initialize(
PROV_RSA_AES
, _T( "aKey" )
, NULL
);
if (GetLastError() == NTE_BAD_KEYSET)
{
hr = prov.Initialize(
PROV_RSA_AES
, _T( "aKey" )
, NULL
, CRYPT_MACHINE_KEYSET
);
}
if( FAILED( hr ) )
{
errMsg.Append( _T( "CCryptProv Initialize failed " ) );
goto EncryptBuffer_Return;
}
CCryptDerivedKey derKey;
CCryptSHAHash sha;
hr = sha.Initialize( prov );
if( FAILED( hr ) )
{
errMsg.Append( _T( "CCryptSHAHash Initialize failed " ) );
goto EncryptBuffer_Return;
}
BYTE key[ 16 ] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
DWORD keyLen = 16;
hr = sha.AddData(
key
, keyLen
);
if( FAILED( hr ) )
{
errMsg.Append( _T( "sha.AddData failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.Initialize(
prov
, sha
, CALG_RC4
);
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.Initialize failed " ) );
goto EncryptBuffer_Return;
}
BYTE iv[ 16 ];
hr = prov.GenRandom( 16, iv );
if( FAILED( hr ) )
{
errMsg.Append( _T( "prov.GenRandom failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.SetIV( iv );
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.SetIV failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.SetMode( CRYPT_MODE_CBC );
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.SetMode failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.SetPadding( PKCS5_PADDING );
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.SetPadding failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.SetParam( KP_IV, iv );
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.SetParam failed " ) );
goto EncryptBuffer_Return;
}
hr = derKey.SetPermissions( CRYPT_ENCRYPT );
if( FAILED( hr ) )
{
errMsg.Append( _T( "derKey.SetPermissions failed " ) );
goto EncryptBuffer_Return;
}
DWORD encLength = m_lOutBufferLength;
hr = derKey.Encrypt(
TRUE
, m_pbInBuffer
, &encLength
, m_lOutBufferLength
);
EncryptBuffer_Return:
return hr;
}
My goal was to port some .NET code I had written in C# to C++/ATL. In
it, I used the RijndaelManaged class and the SHA1Managed class to
encrypt my data. In reading the docs/examples/etc. I've found via
google, I'm not sure how close I've come to reproducing it. By
specifing PROV_RSA_AES for provider, does this give me the Rijndael
provider? Also, CALG_RC4 was the only algorithim I could get to work
even though the docs indicated I could use RC2 or AES (I must have
something else configured incorrectly).
Thanks,
Mike