我先前做的对于message的加密也是用crypto api来实现的,整个程序是为了实现这样的一套东西。浏览器端相关页面载入一个activex control来对与本地的一个message来进行签名,然后发到server端进行验证,而用来签名的private key是由导入IE的一个带私钥的证书来提供的。server验证完毕后,返回bool的参数来给浏览器。如果这样的话,我担心我传诵出去的signature和public key调用JAVA的API来验证,无法进行,格式并不匹配。不知道有没有实现了的高手指教。

解决方案 »

  1.   

    在CryptoAPI中提供一个函数CryptExportKey是用来导出公钥的,是PUBLICKEYBLOB形式。
      

  2.   

    找到你要用到的公钥用CertSaveStore将证书文件保存下来,就跟ie导出公钥的证书是一样的,把这个给服务器。这个证书文件是标准格式的,java应该有相应的api可以进行验证的。
      

  3.   

    CryptExportKey()这个函数是用相应的handle来从容器中取出相key的,我试用过,但是还不知道怎么从证书中取出。因为是WEB登陆页面。如果每次都是传输证书文件的话,效率太低了,有没有好的办法,最好是能传输标准的签名和公钥。
      

  4.   

    CertOpenStore()->CertFindCertificateInStore()->CERT_CONTEXT->CERT_INFO
    这样的步骤确实是可以取出PUBLIC KEY的,但是PK是被装在一个BYTE[]里面的。我不知道怎么样能够象使用JAVA的API那样能够输出能够有实际意义的STRING来看PUBLIC KEY的内容。请问有人能解释下吗?我觉得很可能CRYPTO API就是这样把PK装在BYTE中,而没有考虑能够输出成给人看懂的情况。还有一个问题CryptSignMessage()这个函数中,MSDN介绍说了其中有一个参数fDetachedSignature 
    [in] TRUE if this is to be a detached signature. Otherwise, FALSE. If this parameter is set to TRUE, only the signed hash is encoded in pbSignedBlob. Otherwise, both rgpbToBeSigned and the signed hash are encoded. 
    这里的encoded是说的从string到byte[]用的编码么,那么这个编码用的是什么标准呢?还是用的是在SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;参数这里设置的编码类型呢?
      

  5.   

    你可以把证书导入到证书库中,然后直接调用CryptoAPI的函数,把数字证书中的公钥分解出来,不要指望自己做,因为这样很麻烦,你完全可以把这个工作交给CryptoAPI。楼主现在要做的是,如何把一张证书放到证书库中,其他的任务就不用烦了。:)
      

  6.   

    CertOpenStore()->CertFindCertificateInStore()->CERT_CONTEXT->CERT_INFO
    这样的步骤确实是可以取出PUBLIC KEY的,但是PK是被装在一个BYTE[]里面的。我不知道怎么样能够象使用JAVA的API那样能够输出能够有实际意义的STRING来看PUBLIC KEY的内容。请问有人能解释下吗?我觉得很可能CRYPTO API就是这样把PK装在BYTE中,而没有考虑能够输出成给人看懂的情况。还有一个问题CryptSignMessage()这个函数中,MSDN介绍说了其中有一个参数fDetachedSignature 
    [in] TRUE if this is to be a detached signature. Otherwise, FALSE. If this parameter is set to TRUE, only the signed hash is encoded in pbSignedBlob. Otherwise, both rgpbToBeSigned and the signed hash are encoded. 
    这里的encoded是说的从string到byte[]用的编码么,那么这个编码用的是什么标准呢?还是用的是在SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;参数这里设置的编码类型呢?
    ------------------------------------------
    这里的encoded可能是DER编码