gpt4 book ai didi

windows - RSA_public_decrypt 和 MS Crypto API 等效

转载 作者:可可西里 更新时间:2023-11-01 12:50:10 25 4
gpt4 key购买 nike

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

对于 Mac OX X,我使用 RSA_public_decrypt,它的效果非常好。在 Windows 上,我必须使用非常少的代码,所以我无法链接到 OpenSSL 或其他库,而且我必须使用 MS Crypto API。

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

我已经尝试了所有方法,包括 CryptVerifyMessageSignatureWithKeyCryptDecodeObject 以使用不同的参数加载 blob,但仍然没有成功。

它总是以 GetLastError() == CRYPT_E_ASN1_BADTAG 结尾,我认为这意味着 BLOB 不是 ASN1 格式的......谷歌没有说明 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。我用 CryptMsgUpdateCryptDecodeObjectCryptVerifyMessageSignatureWithKey 尝试了 CryptMsgOpenToDecode - 没有任何效果。

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

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

最佳答案

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

关于windows - RSA_public_decrypt 和 MS Crypto API 等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com