问题标签 [cryptoapi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
encryption - 如何在 WinCrypt 中生成和使用公钥加密
我目前正在尝试使用 Windows Cryptography API 并遇到一些 Public-Key-Cryptography 问题。我可以找到很多关于如何加密项目的示例,但没有直接解决从头到尾的公钥模型。
这是我当前代码如何生成加密密钥对的粗略概述,为了便于阅读,我删除了错误检查代码
我的两个导出密钥不同,但都能够在不加载另一个密钥的情况下解密消息。此外,如果我在加载导出的公钥的新会话中加密新消息,我仍然可以使用任一密钥对其进行解密。
谁能告诉我我可能做错了什么或错过了什么?我完全走错了路吗?
openssl - CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名
我正在尝试将 Mac 的AquaticPrime框架移植到 Windows。
在 Mac 上,它使用 opensll 库,我尝试了解如何将其移植到 Windows,我猜我必须使用 CryptoAPI。
我主要需要使用给定公钥验证生成的签名的代码。
以下是使用 openssl 完成验证的方式:
- 输入:许可证数据、公钥和签名,均为 128 字节长。
- SHA1 摘要是根据许可证数据计算得出的。
- 使用公钥数据设置 RSA 上下文
- RSA_public_decrypt() 被调用,给定 RSA 密钥和签名,它返回一个 20 字节长的 SHA1 摘要 - 这个摘要是否等于第 2 步中的摘要,签名是有效的。
那么,如何使用 CryptoAPI 做到这一点?我已经做到了这一点:
- 从 CryptAcquireContext(ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) 开始
- 在这篇文章的帮助下使用 CryptImportKey ,pubexp=3 和 bitlen=1024。一切正常,即我没有收到任何错误,我查看了二进制数据以验证它是否与 MSDN 文章显示的内容相匹配。
- 从许可证数据创建 SHA1 摘要。我检索了生成的 20 字节哈希值,并看到它与我在 Mac 上使用 openssl 获得的值相匹配。
此时,我调用:
此操作失败,错误代码为 ERROR_INVALID_PARAMETER。
奇怪的是,当我第一次不小心将两倍大的公钥存储到 PUBLICKEYBLOB 结构中时,我收到了 NTE_BAD_SIGNATURE 错误。这可能表明现在我传递的公钥是正确的。
那么,为什么现在出现 ERROR_INVALID_PARAMETER 错误呢?我已经验证了哈希值是正确的,并且密钥似乎也被接受了。而“sig”参数只是一个指向签名的128字节的指针,sigLen是128。
那么,我在这里缺少什么?
openssl - CryptoAPI:如何使用 CryptVerifySignature 从 OpenSSL 或 Java 验证 DSA 签名
我希望能够使用 Microsoft CryptoAPI 验证 OpenSSL 生成的 DSA 签名。
考虑您有以下输入:
- 现有的 DSA 公钥:
- 待验证的数据
- 二进制签名
签名已经从 Base64 转换为一系列 48 字节。
session - CryptoAPI 中的 CryptImportKey 接受 hPubKey 为 0 来导入加密的会话密钥
谁能解释为什么 CryptImportKey 函数在从另一台计算机导入加密的会话类型密钥 blob 时接受 0 的 hPubKey(解密密钥句柄)?
环境是这样的:
PC #1:在本地密钥容器 (w/AT_KEYEXCHANGE) 中生成密钥交换密钥对(公共/私有)CryptGenKey
,然后将公共部分导出为 PUBLICKEYBLOB 并将其发送到 PC #2
PC #2:从 PC #1 获取公钥 blob 并将其导入本地密钥容器。在同一本地密钥容器中创建会话密钥。使用从客户端密钥 blob 导入的公钥(用于加密会话密钥)将本地密钥容器会话密钥导出到 SIMPLEBLOB ( CryptExportKey
)。
PC #1:从 PC #2 获取加密的会话密钥块并调用CryptImportKey
,提供本地密钥容器 hProv、密钥块缓冲区指针和长度、hPubKey 和标志的 0(零)以及指向 HCRYPTKEY 句柄的指针.
完成上述操作后,我得到了一个有效的句柄,并且可以调用CryptEncrypt
并CryptDecrypt
使用我得到的句柄。是的,如果我在 CryptImportKey 上指定从 PC #1 上的第一步生成的密钥交换密钥对的句柄,那也可以。我只是不明白为什么 hPubKey 的 0 有效,就好像 CryptoAPI“知道”私钥是什么来加密数据一样。
谢谢。
c# - Pinvoking adwapi.dll - cryptDecrypt 和 cryptEncrypt 函数,奇怪的问题
我正在观察此函数的奇怪行为,我要加密的字符串包含 14 个字节,如果我使用该函数发送缓冲区 = 14 的长度,它会失败(“内部错误” - 非常具有描述性和最有用的错误代码) ,但它在缓冲区长度(和缓冲区本身)为 128 字节大时工作。
我通过制作一个大小为 128 字节的数组克服了这个问题,并从纯文本(我希望加密)中复制了 14 个字节,
当我解密这些字节时,我必须再次为函数提供整个 128 字节数组(现在每个字节都已加密,即使是来自 #13-#127 的那些(我猜这是意料之中的))。幸运的是,前 14 个字节按应有的方式解密,其余的都是乱码。
我想知道如果传入缓冲区不是 128 字节大,为什么加密方法会失败,以及为什么解密函数也需要 128 字节数组,是填充的东西吗?
这就是我调用加密函数的方式:
// 在这种情况下,MyKey 是指向加密密钥的指针,第二个参数是 null,第三个是“真”(没有更多数据),没有标志,缓冲区字节数组 (128),Testing.Length 在这种情况下是 7 , 128
这就是我解密它的方式:
结果如下所示:Testing?R????7?q?????$??uj??m%?b??e?a?74p?)?n9??w?R*O )E? i?+?
>[?S???}Ct?n?&??b?P!?u1??%?JQ???/?mP?5wB????
它几乎按预期工作,但我需要能够只获得字符串的“测试”部分,而不使用子字符串等技巧。
我正在尝试做的(也许有另一种方法)是这样的;我有一个二进制文件(文件),其中包含由我从智能卡导出的证书中获得的公钥加密的“测试”。我需要使用我的智能卡(我正在使用它的专有 CSP)和私钥来验证(解密)这个文件。如您所见,它几乎可以工作。
提前致谢。
c# - 哪种加密方法适合加密单个单词以及整个文档?
我需要将多个文档保存到云端,并且需要保存文档、文档元数据和用于搜索的单词/短语。
我的计划是使用对称密码来加密整个文档,但我不确定散列每个单词的正确方法。我想要一些安全的东西,但我不想不必要地增加每个单词中的字符数。
哪种实现最适合对文档进行对称加密,以及在不使其比所需大小大很多倍的情况下散列单词或短语的最佳方法是什么?
c# - 我什么时候应该使用 CryptoAPI vs System.Security.Cryptography vs Bouncycastle?
据我所知,BouncyCastle 和 System.Security.Cryptography 提供了执行高级任务的能力,而 CryptoAPI 级别较低。
我被告知 BouncyCastle 不符合 FIPS,而 CryptoAPI 允许这样做。这是真的?
我什么时候应该使用其中一种?
.net - .NET + OpenSSL + 智能卡
我正在使用 .NET 和 OpenSSL 生成 CA 和客户端证书。
以下代码生成客户端证书并使用 CA 证书对其进行签名:
这段代码工作正常,但有一个问题。我想在智能卡上生成密钥和 PFX,因此证书生成步骤应该是下一个:
1.) 在智能卡上生成公钥/私钥对;
2.) 通过 OpenSLL 创建证书签名请求,并使用智能卡上的私钥对其进行签名;
3.) 向我们的 CA Authority 服务发送证书签名请求,并使用 CA 证书对其进行签名;
4.) 检索证书(由 CA 授权签署),用存储在智能卡上的私钥对其进行签名,并在智能卡上生成 pfx;
为了使用智能卡,我使用了 Microsoft CryptoAPI 和 NCryptoki。NET 库,但我最多只能在智能卡上生成公钥/私钥对,并在智能卡上使用 CA 链导入 pfx 证书。我无法签署从自己的 CA 机构检索到的证书请求和证书。
使用 Microsoft CryptoAPI:
使用 NCryptoki。网络库:
任何人都可以帮助我签署证书请求(通过 Open SLL 生成)并使用存储在智能卡上的私钥签署从自己的 CA 机构检索到的证书吗?
使用 NCryptoki Sign 方法对某些文本进行签名:
encryption - CryptAcquireCertificatePrivateKey - 创建访问证书的永久密钥容器
如何使用cryptoAPI
PFX 自签名证书创建持久密钥容器?
我可以通过CryptAcquireCertificatePrivateKey
调用访问 PFX 中的私钥,但是如何将私钥和公钥对导入到密钥容器中?完成导入过程后,此密钥容器应永久存在于 USER 密钥存储中。
期待建议。
谢谢
c++ - 在 openssl 中使用公钥验证数字签名
我已经使用 wincrypt cryptoapi (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) 在 Windows 中签署了数据,在 linux 中,我有 x509 证书和我必须验证的签名消息
. 谁能告诉我如何验证签名的消息
我得到 x509 pem 证书和签名消息作为 linux 中的输入,我必须验证