110,536
社区成员
发帖
与我相关
我的任务
分享
CspParameters cspParam = new CspParameters( 1, null, "x-user" );
RSACryptoServiceProvider ras = new RSACryptoServiceProvider( cspParam );
bool bset = ras.PersistKeyInCsp;
bset = ras.PublicOnly;
string key1 = ras.KeyExchangeAlgorithm;
key1 = ras.SignatureAlgorithm;
byte[] blob = ras.ExportCspBlob( true );
StreamWriter blbWriter = new StreamWriter( "e:\\blob.txt" );
for( int mm = 0; mm < blob.Length; mm++ )
{
blbWriter.Write( "{0:x2} ", blob[mm] );
if( (mm + 1) % 20 == 0 )
blbWriter.WriteLine();
}
blbWriter.Dispose();
BOOL WINAPI CryptAcquireContext(
_Out_ HCRYPTPROV *phProv,
_In_ LPCTSTR pszContainer,
_In_ LPCTSTR pszProvider,
_In_ DWORD dwProvType,
_In_ DWORD dwFlags
);
这是使用 CSP 时要调用的第一个函数,它以指定的“密钥服务提供者”,创建一个带指定名字的密钥容器。
一个密钥容器中,只能存放上面表中一行上的 4 种密钥算法,貌似每种还只能有一个实例。交换算法和签名算法的实例肯定只能各自有 1 个,至于能否创建多个对称加密算法和Hash算法的实例,我还没测试。按道理说,估计应该是可以的。
函数中,当给 pszContainer 传递一个容器名字,而 dwFlags 为 0 时,这将会创建一个永久存储在Windows 当前用户的密钥存储区的。它一旦被创建,任何进程都可以用同样的容器名字获得它,并输出其中的密钥。
但是当给 pszContainer 传 NULL 值,而 dwFlags 为 CRYPT_VERIFYCONTEXT 时,这将创建一个临时的密钥容器,其它进程不能获得它,它也不被存储在任何系统位置。