如果不了解CryptoAPI,这应该是非常困难的。

主要障碍是:

使用CryptStringToBinaryA和CryptDecodeObjectEx解码X509 DSA公钥

转换DSA签名格式

OpenSSL的DSA_sign以ASN.1 DER格式生成DSA签名

CryptoAPI的CryptVerifySignature需要P1363格式的DSA签名

以下是我最终解决问题的粗略示例:

const char* pubKey = "MIIBtjCCASsGByqGSM44BAEwggEeAoGBANW/k8nYREKtRMvIShnJTSAwxF33haU4"

.....

"/FEGAibbOp31rjq9UfaJ2t06eN0t0B+DP1hjz/MfpGtPOxHqF3dQnDRa3ot1FSTP";

bool verify(const unsigned char* msgData, unsigned int msgLength, const unsigned char* signature, unsigned int signatureLength)

{

HCRYPTPROV hCryptProv;

if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT))

{

return false;

}

bool result = false;

unsigned char derPubKey[2048];

DWORD derPubKeyLen = 2048;

CERT_PUBLIC_KEY_INFO *publicKeyInfo = NULL;

DWORD publicKeyInfoLen = 0;

if ( CryptStringToBinaryA( pubKey, strlen(pubKey), CRYPT_STRING_BASE64, derPubKey, &derPubKeyLen, NULL, NULL ) &&

CryptDecodeObjectEx( X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, derPubKey, derPubKeyLen,

CRYPT_ENCODE_ALLOC_FLAG, NULL, &publicKeyInfo, &publicKeyInfoLen ) )

{

HCRYPTKEY hPubKey;

if (CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING, publicKeyInfo, &hPubKey))

{

HCRYPTHASH hHash;

if (CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))

{

CryptHashData(hHash, msgData, msgLength, 0);

BYTE* dsaSignature = NULL;

DWORD dsaSignatureLen = 0;

if (CryptDecodeObjectEx( X509_ASN_ENCODING, X509_DSS_SIGNATURE, signature, signatureLength,

CRYPT_ENCODE_ALLOC_FLAG, NULL, &dsaSignature, &dsaSignatureLen ) )

{

if (CryptVerifySignature(hHash, dsaSignature, dsaSignatureLen, hPubKey, NULL, 0))

{

result = true;

}

LocalFree(dsaSignature);

}

CryptDestroyHash(hHash);

}

CryptDestroyKey(hPubKey);

}

LocalFree(publicKeyInfo);

}

CryptReleaseContext(hCryptProv, 0);

return result;

}

java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...相关推荐

  1. Java中的证书透明度验证

    因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易. 牺牲了整个周末的一半时间,我可以证明这并不是一件小事. 但是, 证书透明性是什么? ...

  2. Java应用程序中的验证

    我经常看到的项目几乎没有任何有意识的数据验证策略. 他们的团队在截止日期,明确要求的巨大压力下工作,只是没有足够的时间以适当且一致的方式进行验证. 因此,数据验证代码随处可见:JavaScript片段 ...

  3. Java微信开发之接入验证

    最近在做微信开发,最开始尝试了很多次都不成功.昨天尝试成功了,还没有开始进一步开发,想把昨天尝试成功的过程记录一下.我是查了很久的资料也尝试过很多方法,现在我把我遇到的问题和解决方法记录一下.我是部署 ...

  4. 梦魇java_[Java教程]魔鬼的梦魇—验证IE中的JS内存泄露模式(一)

    [Java教程]魔鬼的梦魇-验证IE中的JS内存泄露模式(一) 0 2012-05-08 07:00:04 随着移动互联网的发展,现在越来越多的应用开始想bs方向转移,原来很多复杂的计算逻辑也自然随着 ...

  5. java validation_java bean validation 参数验证

    一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间 ...

  6. java生成验证码并进行验证

    一实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证 最后通过ImageI ...

  7. 来自国外高级Java架构师的采访总结

    为了收集有关Java生态系统当前和未来状态的见解,我们与来自14家公司的高管进行了交流.我们首先问道:"从您的角度来看,Java的未来是什么?"以下是受访者告诉我们的内容: 无服务 ...

  8. java山寨qq账号密码验证_Java实战-山寨QQ

    功能: 1.登录界面QQClientLogin.java,好友界面QQFriendList.java,聊天界面QQChar.java 2.当用户点击登录后,把账号密码发送给QQserver.java, ...

  9. Java微信公众号配置验证Token

    Java微信公众号服务器配置-验证Token 一.填写服务器配置 首先我们需要在微信公众平台上填写服务器配置 重点内容 服务器地址URL(一定要外网能访问的到)         在我们提交配置的时候, ...

最新文章

  1. 使用python手写FFT算法
  2. tensorflow 显存 训练_【他山之石】训练时显存优化技术——OP合并与gradient checkpoint...
  3. 【计算机是如何通信 四】Web服务器/Severlet/DispatcherServlet/Controller
  4. 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)
  5. LocalDate,LocalDate,LocateDateTime的常用方法
  6. IBATIS的优缺点
  7. pythoncontinue函数_Python continue语句
  8. 机器学习基础:核密度估计(Machine Learning Fundamentals: Kernel Density Estimation)
  9. 企业信息管理系统(1)_系统页面框架分析
  10. 高频量化交易之王--李庆在华尔街
  11. 配置阿里云maven仓库地址
  12. 汽车租赁管理系统(管理车辆基本信息、租车/还车、统计租金)
  13. android系统字体目录在哪个文件夹,安卓系统System目录下文件夹功能详解
  14. c语言 日期加减天数返回日期 闰年,日期计算器(多图)
  15. BurpSuite使用详解(三)Spider功能
  16. android 模拟滑屏,android模仿桌面左右滑屏
  17. web自动化测试 -- katalon recorder
  18. 无线蓝牙手表FCC ID认证测试项目有哪些?
  19. Android---简易Snackbar
  20. Excel表格的密码设置与取消

热门文章

  1. python爬取商品信息_Python基于BeautifulSoup爬取京东商品信息
  2. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(1)
  3. 世界首富马斯克吟《七步诗》,中外互联网世界究竟发生了什么?
  4. 探索专有领域的端到端ASR解决之道
  5. 【云速建站】SSL证书自助部署
  6. 利用深度学习识别滑动验证码缺口位置
  7. Centos7使用Yum安装高版本的LNMP
  8. 【Python3网络爬虫开发实战】 1.5.4-RedisDump的安装
  9. SpringBoot之SpringMVC自动配置
  10. 关于tensorflow2.0的弊端