kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
阅读:4754回复:7

usb key读取证书和数字签名经常有错误,求解.

楼主#
更多 发布于:2007-05-30 10:06
1、 CryptGetUserKey函数经常错误,错误为:NTE_NO_KEY,但是用“智能卡管理器”看好像也没什么问题,而且这种情况不是一直存在的,比如刚才我在VC6下以调试状态一路跟踪下去就是正常的,可是接下来直接运行的时候又出现这个问题了。

          // 获取一个密钥//句柄的函数
    if(CryptGetUserKey(    
        hProv,    
        AT_SIGNATURE,            //,  AT_KEYEXCHANGE  
        &hKey))
    {
         printf("获取数字签名公钥成功. \n");
    }
    else
    {
        // NTE_NO_KEY
         MyHandleError("Error during CryptGetUserKey for signkey.");
    }

2、CryptReleaseContext的时候每次都会出错,错误代码为0x00000057L  。

                     if(!CryptReleaseContext(hProv, 0))
        {            
            sprintf(szMsg, "释放CSP失败,错误代码: 0x%8X", GetLastError());
            writeToLog(szMsg);            
        }

总之就是操作usb key里很不稳定,经常会出现pin锁住啊,读取CSP失败啊,等问题。
bbs.80dnst.com -- 驱动/逆向
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-31 10:05
我就问了两次,怎么两次都冷冷清清的,心寒的来,人呢?
bbs.80dnst.com -- 驱动/逆向
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-31 18:21
呵呵,你的问题涉及到具体硬件,别人又不知道你的KEY是哪个厂商的。如果是硬件厂商提供的CSP本身有问题,如何解决?
1、CryptGetUserKey的dwKeySpec参数,你用AT_KEYEXCHANGE | AT_SIGNATURE试试,我知道很多厂商对签名密钥是这么指定的,MSDN也提到允许这样干。
2、CryptReleaseContext出错有点奇怪,象是CSP有问题,或加了什么限制。
3、关于你调试没问题,而直接运行有问题,可能是这个原因造成的:厂商可能有个服务模块,负责将指令排队、执行并返回结果。厂商的管理器可能也在定时地发一些指令,而整个指令执行的机制有BUG,没处理好吧。
以上只是猜测,第1条你可以试试,2、3在正常情况下不应该有,很可能是厂商的软件问题。顺便问下,是哪个公司的产品。
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-01 10:06
哪个厂商还真不好说哎,不过那个智能卡管理器是A.E.T.Europe.B.V的,不知道是不是这个公司出的,好像是个外国公司的,也不清楚为什么就只给个USB key,连接口都不给的。

还有一个奇怪问题,就是在IE中把证书删掉,用我们的DEMO程序来读数字签名就一切正常的,用我的程序一读就会提示失败了,然后用DEMO程序读也会失败。
bbs.80dnst.com -- 驱动/逆向
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-02 01:51
可以确认硬件是捷德,软件是飞天提供的,产品可能是ePass系列。两公司曾经合作过。正常调用其提供的CSP,应该不会出问题。
你提到的读取数字签名是怎么回事,你是想说的读取证书数据吗?读取证书数据是不需要校验PIN的,如果理参数正确的情况下,不会失败。你说的DEMO程序又是怎么回事,是二次开发包中的DEMO吗?
如果可以,把你的程序和DEMO,发来我看看,也许能找到问题。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2007-06-02 09:46
飞天的硬件还将就,软件质量一向比较垃圾,我用过好多款,软件都有问题. 我感觉他们的软件开发人员不是专业的,可能是硬件转行的,好多细节处理不完善,把我们当白老鼠...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-04 17:34
是这样的,因为我不知道为什么,我用反汇编分析得到的C_Login等一系列函数,在读取证书的时候就会出错,因为找不到可以参考的代码,所以我们换了种方法,验证pin密码的时候用C_Login这一套函数,但是读证书等操作用的是微软的cryptoapi来操作了。不知道谁能提供个用C_Login这一套函数的演示程序,读取证书,验证数字签名,等。
bbs.80dnst.com -- 驱动/逆向
ytwei
驱动小牛
驱动小牛
  • 注册日期2005-04-01
  • 最后登录2010-07-30
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望102点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-06 00:36
飞天的软件层是CSP调用P11,你用的C_Login就是他的P11库提供的接口。你这样跨层用是不行的,因为他的CSP内部对PIN的状态是有管理的,而且它有些型号的PIN是用加密的,加密方法你可以逆向分析一下,这里我不方便透露。你没有必要管P11,对不熟悉P11开发者来说,使用P11非常不合适。调用CSP要简单得多,你不想用CSP是否因为它的PIN码输入对话框。如果不是,要完成你说的操作,只要参照MSDN里CryptoApi的例子代码即可。
游客

返回顶部