RSA_public_decrypt 和 MS Crypto API 等效项

2024-04-27

我正在尝试开发许可证验证解决方案。许可证使用 OpenSSL 在服务器上进行编码RSA_private_encrypt功能。

对于 Mac OS X 使用RSA_public_decrypt它就像一个魅力。在 Windows 上,我必须使用非常小的代码,因此我无法与 OpenSSL 或其他库链接,并且我必须使用 MS Crypto API。

我花了几天时间试图找出问题所在,但没有成功。我可以成功导入公钥,但我的成功到此结束。 我知道我需要使用 CAPI 反转字节顺序,因此这可能不是问题。

我已经尝试了一切,包括CryptVerifyMessageSignatureWithKey and CryptDecodeObject使用不同的参数加载 blob,但仍然没有运气。

它总是以GetLastError() == CRYPT_E_ASN1_BADTAG,我认为这意味着 BLOB 不是 ASN1 格式...Google 没有告诉任何有关 RSA_private_encrypt 的输出格式的信息...所以我在这里完全迷失了。

以下是基于 OpenSSL 的 OS X 代码:

void cr_license_init(const char* lic) {
    __cr_license_ = lic;
    unsigned char lic_encoded[CR_LIC_LEN];

    BIO* b64 = BIO_new(BIO_f_base64());
    BIO* licIn = BIO_new_mem_buf((void*)lic, -1);
    licIn = BIO_push(b64, licIn);

    if(BIO_read(licIn, lic_encoded, CR_LIC_LEN) == CR_LIC_LEN) {

        const unsigned char* key_data = license_pub_der;
        RSA* r = d2i_RSA_PUBKEY(NULL, &key_data, sizeof(license_pub_der));

        if(r != NULL) {
            if(__cr_license_data_ != NULL) {
                free((void*)__cr_license_data_);
            }
            __cr_license_data_ = malloc(CR_LIC_LEN);
            if(RSA_public_decrypt(CR_LIC_LEN, lic_encoded,
    (unsigned char*)__cr_license_data_, r, RSA_PKCS1_PADDING) &lt= 0) {
                free((void*)__cr_license_data_);
                __cr_license_data_ = NULL;
            }
            RSA_free(r);
        }
    }
    BIO_free_all(licIn);
}

这部分代码在 Windows 上运行良好,因此我认为公钥不是问题。

__cr_license_ = lic;
unsigned char lic_encoded[CR_LIC_LEN];

DWORD dwSize;
if(CryptStringToBinaryA(__cr_license_, 0/*autocalculate*/, CRYPT_STRING_BASE64, lic_encoded, &dwSize, NULL, NULL) && dwSize == CR_LIC_LEN) {
HCRYPTPROV hProv;
if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
    PCERT_PUBLIC_KEY_INFO pki = NULL;
    DWORD dwKeySize;
    if(CryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, license_pub_der, sizeof(license_pub_der), CRYPT_ENCODE_ALLOC_FLAG, NULL, &pki, &dwKeySize)) {
        HCRYPTKEY hKey = 0;
        if(CryptImportPublicKeyInfo( hProv, X509_ASN_ENCODING, pki, &hKey)) {

但在那之后我尝试对消息做的任何事情都会导致CRYPT_E_ASN1_BADTAG。我试过CryptMsgOpenToDecode with CryptMsgUpdate, CryptDecodeObject, CryptVerifyMessageSignatureWithKey- 没有任何作用。

基本上我认为问题在于 pkcs1 和 pkcs7 不兼容,正如 owlstead 提到的那样。有人有使用 MS CAPI 处理 pkcs1 格式导入/转换等的经验吗?

非常感谢任何帮助甚至线索!提前致谢!


您正在混合更高级别和更低级别的签名格式。 OpenSSL 默认采用 PKCS#1 v1.5 签名,其中仅包含签名数据。 Windows 似乎采用 PKCS#7 容器。这些可能包含 PKCS#1 v1.5,但这些数据和其他数据使用 ASN.1 BER 标记/长度格式进行包装。如果 Microsoft API 尝试对此进行解码,它将假定原始签名是容器格式,并且解码将失败。

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

RSA_public_decrypt 和 MS Crypto API 等效项 的相关文章

  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 使用 Metro 风格应用程序启动桌面应用程序

    有没有办法从 Windows 8 上的 Metro 风格应用程序启动桌面应用程序 我正在尝试创建一些简单的桌面应用程序快捷方式 以替换开始屏幕上看起来不合适的桌面图标 我只需要一些超级简单的东西 最好是用 C 编写 以便在应用程序加载后立即
  • 如何在Python中打印颜色/颜色?

    我对 Python 和 StackOverflow 都是新手 需要一点帮助 我想用 Python 打印颜色 并在 Google 上搜索过 但运气不佳 每次我都很困惑 但都没有成功 这是我输入的代码 answer input Wanna go
  • Windows 7 VM 上的 Android Studio 虚拟设备不兼容

    我的计算机上有一个 VirtualBox VM 该 VM 运行 Windows 7 64 位 我在该虚拟机上安装了 Android Studio 我只有基本的 Hello World 应用程序 当我尝试运行 AVD 时 我收到以下消息 运行
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • 批处理:在特定程序中打开特定文件?

    当记事本是 txt 文件的默认程序时 如何告诉 Windows 在写字板中打开 C test test txt 接受的答案对我不起作用 我不确定这是因为我试图运行的程序 还是因为路径中有空格 即使我用引号引起来 或者其他原因 不管怎样 我可
  • 如何使用 Windows forfiles 命令的完整路径运行命令?

    我正在尝试运行以下命令 forfiles p Schemas m xsd c cmd c C Program Files x86 Microsoft SDKs Windows v10 0A bin NETFX 4 6 1 Tools xsd
  • 无需动态分配的RSA实现

    典型的 RSA 实现包含一个多精度整数库 典型的多精度整数库使用动态分配将大整数表示为大小合适的机器字数组 我预计当使用多精度整数仅使用 RSA 2048 来加密或解密已知长度的消息 通常是对称加密密钥 时 可能会遇到数学整数的限制 并且它
  • 将 webcrypto 密钥导出为 PEM 格式

    我正在将 WebCrypto 与 RSASSA PKCS1 v1 5 结合使用 https github com diafygi webcrypto examples rsassa pkcs1 v1 5 sign https github
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 当工作站锁定然后解锁时,如何防止窗口大小调整?

    我们有一个在多显示器环境中运行的应用程序 用户通常将应用程序对话框分散到多个监视器上 如果用户锁定工作站 然后解锁它 我们的应用程序就会被告知调整大小 我们的用户发现这种行为令人沮丧 因为他们随后花了一些时间恢复以前的布局 我们还不确定是图
  • openssl_pkey_get_public 未打开公钥,“无起始行”错误

    当生成公钥然后用函数读取它时openssl pkey get public publicKeyResource bool false 和消息 错误 0906D06C PEM 例程 PEM read bio 无起始行 privateKey o
  • npm 安装旧版本的(typescript 编译器)包

    在Windows环境下 我有 节点 v4 6 0 npm v3 10 8 我的本地打字稿版本是 npm run tsc v 3 10 8 但是 我有时想使用我的全局 tsc 因为出于某种原因 gulp 使用全局 tsc 但是当我这样做时 n
  • RabbitMQ 管理插件窗口呈现为空白页面

    I have installed Erlang RabbitMQ and configured the management plugin as per the instructions on the website https www r
  • 连接到 VPN 时 HttpClient.GetAsync 超时

    当系统不使用 VPN 时 C 4 5 2 框架 HttpClient GetAsync 方法在 Windows 10 上运行良好 连接 VPN 后 对同一地址的 HttpClient GetAsync 调用只会阻塞 直到超时 Edge 和
  • 如何从数据表中设置 DataGridViewComboBoxColumn 中的值?

    DataGridViewComboBoxColumn dgvcb DataGridViewComboBoxColumn grvPackList Columns Units Globals G ProductUtility G Utility
  • 如何将 OpenSSL 与 WinSock 一起使用?

    我在网上搜索过 但没有找到任何与此相关的内容 有谁有使用 WinSock 和 OpenSSL 的简单代码示例吗 我正在寻找一个简单的 Visual C 2005 或更高版本的代码示例 它创建并打开一个 Winsock 连接 并使用 Open
  • tlb 文件是否具有关联架构?

    我有一个 32 位 DLL 旨在通过 com 模型和关联的 tlb 文件进行访问 该 DLL 似乎是 x86 有没有办法从 x64 程序访问这种 DLL tlb 文件与 x86 x64 无关吗 我问这个问题是因为有些功能似乎可以工作 其他功
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam

随机推荐

  • 创建 .conll 文件作为斯坦福解析器的输出

    我想使用斯坦福解析器创建一个 conll 文件以进行进一步处理 到目前为止 我设法使用以下命令解析测试句子 stanford parser full 2013 06 20 lexparser sh stanford parser full
  • 是否可以附加到 DynamoDB 中的多值属性?

    是否可以附加到 Amazon DynamoDB 表中多值属性的值列表 我不太能够使用 put 请求弄清楚它 如果可能的话 我想避免读取 更新 写入逻辑 假设您指的是字符串和数字集如中所述Amazon DynamoDB 数据类型 https
  • Flask 模板中点表示法和方括号之间的区别

    在 Flask Web 框架中使用方括号或点符号有什么区别 两者似乎都有效 例如 在Python脚本中我可以设置session username Geraint 然后我可以使用模板访问它 session username or sessio
  • 具有替代方案的重载方法值表

    我有编译器抱怨的以下代码 val state KTable String String builder table BARY PATH Materialized as PATH STORE 错误信息 error home developer
  • LINQ 表达式的运行时创建

    假设我有这样的表达 int setsize 20 Expression
  • Facebook Marketing API 获取每个日期的营销活动

    我创建了一个应用程序 请求 Facebook 的营销 API 返回我的所有广告帐户 并从我的所有广告帐户返回我的所有广告活动 并从我的所有活动中获取特定日期 或日期范围 的见解 现在 因为我的活动太多 我无法对帐户中的每个活动提出请求 即使
  • 在同一域上的 MVC.net 和 Web API 站点之间共享表单身份验证登录的方法

    我将在同一域上运行一个 ASP net MVC 网站 example com 和一个 Web API 网站 api example com 使用表单身份验证允许用户登录 MVC 站点并让该登录被接受的最佳和最安全的方法是什么 Authori
  • 如何在 Android 的这个特定用例中实现 MQTT?

    我的用例 登录到我的应用程序的用户应该能够向在另一台 Android 设备上登录到该应用程序的自己发送消息 如果用户拥有多个设备 那么一旦他打开该消息 其他设备上的通知必然会消失 Doubts 如何跨设备向特定用户发送数据 我了解如何使用
  • 使用 xlib 将图像加载到窗口上

    我已经创建了窗口类 我想插入图像作为该窗口的背景 文件格式必须为 png 我使用magick 的XImage来加载图像 但不知道如何将其作为我的窗口的背景 知道怎么做吗 使用创建像素图 Pixmap XCreatePixmap displa
  • Django 类视图:__init__

    我想要得到
  • IBM WebSphere MQ 2042 错误

    我有以下代码 int openOptions MQC MQOO INQUIRE MQC MQOO FAIL IF QUIESCING MQC MQOO INPUT SHARED 执行时 我收到错误 com ibm mq MQExceptio
  • java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/resolver/URIResolver

    我正在尝试创建一个简单的 Hello Web 服务 但收到以下错误 type Exception report message Servlet init for servlet AxisServlet threw exception des
  • Spring 3、Jersey (JSR-311) 和 Maven 依赖项

    我目前正在努力集成基于 Jersey 和 Spring 的 REST 服务 我正在使用 Spring 3 0 2 RELEASE 和 jersey spring 1 2 但是 jersey spring 在我的项目中添加了对 Spring
  • Ruby 中的参数化 get 请求?

    如何创建 HTTPGETRuby 中带参数的请求 这很容易做到 当你POSTing require net http require uri HTTP post form URI parse http www example com sea
  • 使用 Struts 2.2.x 的简单 JSON 示例?

    我在获取 JSON 结果时遇到问题支柱2 2 1 1 http struts apache org 2 2 1 1 index html 有没有人有一个简单的工作示例 可以使用以下命令将 JSON 结果返回到 JSP支柱2 2 1 1并准备
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • ASP.NET MVC4 和 Web API 身份验证 + 授权(Windows 8 和 Web)

    我使用 Simple Membership db 创建了一个 ASP NET MVC 4 Internet Web 应用程序来存储用户 角色和配置文件 在我的应用程序中 我创建了一个 Web API 控制器 它将响应http 127 0 0
  • 并行迭代器

    我正在设计一个 C 数据结构 用于图形 供并行代码 使用 OpenMP 使用 假设我想要一个能够迭代所有元素 节点 的方法 当然 这个迭代将是并行的 是否可以使用迭代器来实现此目的 迭代器应该是什么样子才能实现并行访问 在这种情况下 您会建
  • JavaMail 连接到 Office 365 XOAUTH2 进行 IMAP 身份验证失败

    使用 OAuth2 0 在线 Office365 面临连接问题 我已经设置了应用程序权限以及 IMAP 和 SMTP 连接 基本身份验证似乎工作正常 我相信 IMAP 已启用 我的应用程序配置为任何组织目录 任何 Azure AD 目录 多
  • RSA_public_decrypt 和 MS Crypto API 等效项

    我正在尝试开发许可证验证解决方案 许可证使用 OpenSSL 在服务器上进行编码RSA private encrypt功能 对于 Mac OS X 使用RSA public decrypt它就像一个魅力 在 Windows 上 我必须使用非