MS CryptoAPI 无法在 Windows XP 上使用 CryptAcquireContext() 运行

2024-01-21

我使用 Microsoft CryptoAPI 编写了一些代码来计算 SHA-1,并让编译后的 exe 在 Windows 7、Win Server 2008、Win Server 2003 上运行。但是,当我在 Windows XP SP3 下运行它时,它不起作用。

我将失败的范围缩小到CryptAcquireContext() call.

我确实注意到了以前的帖子 https://stackoverflow.com/a/4523302谈到 XP 的错误命名“… (原型)" 并且必须通过使用 WinXP 特定宏 MS_ENH_RSA_AES_PROV_XP 来解决。

我做了XP特定的代码修改,但它仍然不起作用。 (这bResult在 Win XP 和所有其他平台上返回 0 falsebResult返回 1 true。)

我使用在 regedit.exe 中看到的实际密钥+字符串值检查了 MS_ENH_RSA_AES_PROV_XP,因此一切看起来都已设置为工作但没有成功。

我是否忽略了一些让它在 Windows XP 上运行的东西?

我粘贴了最短的示例来说明该问题。我用的是VS2010 C++。

// based on examples from http://msdn.microsoft.com/en-us/library/ms867086.aspx

#include "windows.h"
#include "wincrypt.h"
#include <iostream>
#include <iomanip>  // for setw()

void main()
{
    BOOL bResult;
    HCRYPTPROV hProv;

    // Attempt to acquire a handle to the default key container.
    bResult = CryptAcquireContext(
        &hProv,            // Variable to hold returned handle.
        NULL,              // Use default key container.
        MS_DEF_PROV,       // Use default CSP.
        PROV_RSA_FULL,     // Type of provider to acquire.
        0);                // No special action.
    std::cout << "line:  " << std::setw(4) << __LINE__ << ";  " << "bResult = " << bResult << std::endl;

    if (! bResult) {        // try Windows XP provider name
        bResult = CryptAcquireContext(
            &hProv,            // Variable to hold returned handle.
            NULL,              // Use default key container.
            MS_ENH_RSA_AES_PROV_XP,  // Windows XP specific instead of using default CSP.
            PROV_RSA_AES,     // Type of provider to acquire.
            0);                // No special action.
        std::cout << "line:  " << std::setw(4) << __LINE__ << ";  " << "bResult = " << bResult << std::endl;
    }

    if (bResult)
        CryptReleaseContext(hProv, 0);
}

Windows 7 success: enter image description here

Windows XP failure: enter image description here


在您的 CryptAcquireContext 代码中,您似乎缺少用于获取没有特定容器集的上下文的参数。您需要在 CryptAcquireContext 中传递 CRYPT_VERIFYCONTEXT 选项。

Windows 7 可能正在解决这个问题。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

为了进一步诊断,GetLastError() 的结果是必需的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MS CryptoAPI 无法在 Windows XP 上使用 CryptAcquireContext() 运行 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 不希望 netbeans 调试器进入反汇编窗口

    我使用 NetBeans IDE 7 4 内部版本 201310111528 进行 C 编程 每次我调试程序时 对于每个 printf 和 scanf 或者可能每个系统调用 它都会打开反汇编窗口并遍历每个汇编代码 我只是想观察变量 与此类函
  • 在 iOS 4 中本地化应用程序图标

    好吧 这个让我发疯了 我已经使用 InfoPlist strings 和特定于语言的 CFBundleIconFile 值对我的应用程序图标进行了本地化 为每种支持的语言选择不同的图标 从 iOS 4 开始 这种方法不再有效 我正在努力寻找
  • PyQt:在运行时翻译模块字符串

    字符串在QObjects 在运行时翻译 如果翻译器发生变化 所有这些字符串都会刷新 但是 在模块级别声明的字符串甚至静态类属性都会在导入时进行翻译 我可以看到 3 种允许翻译模块字符串的方法 但其中没有一种让我完全满意 安装翻译器后导入模块
  • 在PowerShell中从绝对路径获取相对路径

    问题 您有一个绝对路径 但您希望它相对于另一个路径 Example P SO data database txt gt Now we want the filename to be relative to P SO team lists d
  • 在非焦点 ToolStripItem 上显示工具提示

    当您将鼠标悬停在 ToolStripItems 上时 它们会显示活动突出显示 即使它们所在的表单未处于焦点状态 但是 除非表单获得焦点 否则它们不会显示工具提示 我见过ToolStrip 点击通过 黑客 http blogs msdn co
  • kubectl 无法从私有存储库中提取镜像

    我正在运行 kubeadm alpha 版本来设置我的 kubernates 集群 我正在尝试从 kubernates 提取托管在 nexus 存储库中的 docker 镜像 当我尝试创建一个 Pod 时 它每次都会给出 ImagePull
  • 低延迟模式与 Linux 串行端口一起使用是否安全?

    在 Linux 串行端口上使用 low latency tty 模式是否安全 这tty flip buffer push https github com torvalds linux blob master drivers tty tty
  • 在 Windows Phone 8.1 中使用加速度计传感器数据在画布上绘制线条

    我正在根据设备移动在画布上绘图 我想根据移动移动在画布上绘制不同的字符 目前它正在工作 但我想找到时间差 并且我想检测暂停 暂停意味着用户没有尝试绘制并且用户没有移动手机 因此应用程序可以假设现在用户想要绘制下一个字符 如何找到加速度计值的
  • 打散列

    哈希上的 splat 将其转换为数组 foo bar gt foo bar 这里是否存在一些隐藏机制 例如隐式类转换 或者它是内置的原始功能 除了数组之外 还有nil并哈希唯一在 Ruby 1 9 下使用 splat 运算符消失 改变的东西
  • 在 C 中等待/暂停一定秒数

    我编写了一个小控制台应用程序 我希望它在循环 一段时间 再次开始之前暂停一定的秒数 我正在使用 Windows 操作系统 在 Windows 上 执行此操作的函数是Sleep 这需要量毫秒你想睡觉 使用Sleep 你需要包括windows
  • SQL Server 函数获取层次结构中的顶级父级

    我有下表 master group 结构 code name under 1 National Sales Manager 1 2 regional sales manager 1 3 area sales manager 2 4 sale
  • 使用 Python requests 模块发出 SOAP 请求

    我使用 python requests 模块来处理 REST 请求 我正在尝试提出肥皂请求 但我想知道无法获得这方面的示例 这是我的肥皂体和标题
  • IEqualityComparer 和 IEquatable 之间有什么区别?

    我想了解场景IEqualityComparer
  • 输出不正确。 C++ 入门 1.4.4

    下面的程序应该计算用户输入整数的次数 示例 用户输入 42 42 10 10 程序应该输出 42 出现 2 次 10 出现 2 次 问题 代码不会输出数字 10 的最后结果 直到您输入另一个数字 我已经粘贴了下面的代码 这段代码来自c 底漆
  • 如何在 Android 应用程序中从 WordPress 博客检索帖子?

    我正在尝试开发一个 Android 应用程序来浏览我拥有的由 Wordpress 驱动的博客 我正在尝试弄清楚如何从博客中检索帖子和其他信息以在应用程序中显示 我已经看遍了一切 但我感觉完全迷失了 这是完全可以用 Java XML 完成的事
  • 如何捕获 urllib.urlretrieve 中的 404 错误

    背景 我正在使用urllib urlretrieve http docs activestate com activepython 2 6 python library urllib html 与任何其他函数相反urllib 模块 因为钩子
  • 在文件的某个位置(行和列)启动 Vim

    要从特定行开始 我将使用 vim FILE LINE 但是需要向 vim 传递什么参数才能将光标定位到该行的某一列呢 一种方法是 vim call cursor
  • Subgit:避免将 git 分支同步到 svn

    我正在尝试使用SubGit http subgit com 但我面临着分支的问题 我希望在 Git 下创建的分支仅在 Git 中生存和消亡 我找到了这个 SubGit 如何排除分支 https stackoverflow com quest
  • 如何从 Hibernate Validator 检索默认验证消息?

    我正在尝试使用检索默认验证错误消息MessageSource 我正在使用的代码使用反射来检索message范围 在不覆盖的约束上message参数 我想检索默认的错误消息 当我调用message验证注释的方法 我得到 org hiberna
  • MS CryptoAPI 无法在 Windows XP 上使用 CryptAcquireContext() 运行

    我使用 Microsoft CryptoAPI 编写了一些代码来计算 SHA 1 并让编译后的 exe 在 Windows 7 Win Server 2008 Win Server 2003 上运行 但是 当我在 Windows XP SP