简体   繁体   English

验证由 Windows Crypto API 创建的 Java 签名

[英]Verify a signature in Java that is created by Windows Crypto API

I have signature created by Crypto API我有 Crypto API 创建的签名

if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &Hash))
    return;         
if(!CryptHashData(Hash, Buff,count, 0))
    return;     
if(CryptSignHash(Hash,AT_SIGNATURE,NULL,0,Buff,&count))
...

I want to verify the signature in Java.我想用 Java 验证签名。

C++ generates a key length of 148 bytes, I need a java 162. I generate it using http://www.jensign.com/JavaScience/MSKeytoJKey/ . C++ 生成 148 字节的密钥长度,我需要一个 java 162。我使用http://www.jensign.com/JavaScience/MSKeytoJKey/生成它。 To check out 162 generated 148 coincide.查出162生成148重合。

Then I try to verify the signature然后我尝试验证签名

Signature dsa   = Signature.getInstance("MD5WithRSA");
dsa.initVerify(rsapublickey);
dsa.update(Text);
Sign = dsa.verify(TextSign);

You guessed it, the value of Sign is false.你猜对了,Sign 的值是假的。 What have I missed and is this really going anywhere?我错过了什么,这真的会去任何地方吗?

The native cryptography API uses little-endian byte order while the .NET Framework and JAVA uses big-endian byte order.本机加密 API 使用小端字节序,而 .NET Framework 和 JAVA 使用大端字节序。 If you are verifying a signature generated by using Crypto API, you must swap the order of signature bytes before calling function to verify the signature in Java.如果您正在验证使用 Crypto API 生成的签名,则必须在调用函数之前交换签名字节的顺序,以验证 Java 中的签名。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM