kro*_*oky 5 c# java cryptography bouncycastle digital-signature
目前在C#中,我正在签署这样的挑战:
RSACryptoServiceProvider rsa;
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(rsa);
RSAFormatter.SetHashAlgorithm("SHA1");
byte[] SignedHash = RSAFormatter.CreateSignature(paramDataToSign);
Run Code Online (Sandbox Code Playgroud)
然后我将其SignedHash交给Windows,它接受它,一切都OK。但是我需要将这部分移到Android上,这是一个问题,就是我无法获得相同的带符号哈希值。
在Android中,我尝试制作带符号的哈希,但它们不同于C#中生成的哈希。
Signature signer = Signature.getInstance("SHA1withRSA", "BC");
signer.initSign(privateKey);
signer.update(paramDataToSign);
signer.sign();
Run Code Online (Sandbox Code Playgroud)
在C#中-使用以下代码-我得到的结果与Android中的结果相同,但这不是可选项,因为Windows不接受签名的哈希。
ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKey);
signer.BlockUpdate(paramDataToSign, 0, paramDataToSign.Length);
signer.GenerateSignature();
Run Code Online (Sandbox Code Playgroud)
此处写道,C#PKCS1SignatureFormatter和Java Signature应该给出相同的结果,但事实却并非如此。http://www.jensign.com/JavaScience/dotnet/VerifySig/
可能是什么问题呢?
这是我得到的基本64(WebSafe)值:
Challenge = zHyz12Tk4m151nssYIBWqBCAxhQ
RSAPKCS1SignatureFormatter SignedHash = kmu39keplCAV4Qnu22wdprLz4nGSsrVtHbxQ5YMUG7p-0YwReCG4ROIlFvYs4CGfjCiAGFPw4PLrLx7mrlAA6iuhJMkgm_PMTW9alQYTH612hLEUP4EmK0M2kw8CveLcjI3HA08z8bByllIzRyAlM8bcR438vw2uhx_CbgvOOHn8vwBPnvWbFqpi2doYoq2xEuFBRe7eBPrxbMRqEd3ExdQ9c9rYT4ivOJ4pbioyi6D5i5_1crvGwM6nQanMZCmooRYJO65NP3B4wWnvQZpJLRD0U08wWcvyGBFWp188ZovDjnkTQZku6lzmwGXfqQwtBz9uNvLcTbp7cVyt5EyQxw
Signature and ISigner SignedHash = Vt-b5QfGPnSPpZuIB8-H4N1K5hQXpImS4e8k56_HruDSqy3DLsz96QKUrccshjr1z9nTK3Mwvd5yPdyTJOqSUcDQqxV46LPhWQNsubqKxAz97ePpeslIH1gHdnzkh46ixsWqgDrhR7egQtDkU8PPsph1qahCxaVkRYspQBV0jPZ-LK4EjoGGnuWTCihVKjruXJZ2VY8yZ9QRAsHVptr0Nv-mldO2MFK-oEVbtVbHqUPf5So8im3oRSm68OqY4g56bCdFNSbhcFBjrZ1QPjnxiIk43-_5tevafqoOB2D_E_mQHCJwmRg3MrNij6IdAdloCejnhCWzgMHdcG1Ug_Qmig
Run Code Online (Sandbox Code Playgroud)
编辑:
因此,最简单的解决方案是使用Bouncy Castle API:
AsymmetricBlockCipher rsaEngine = new PKCS1Encoding(new RSABlindedEngine());
rsaEngine.init(true, privateKey);
DigestInfo dInfo = new DigestInfo(new AlgorithmIdentifier(X509ObjectIdentifiers.id_SHA1, DERNull.INSTANCE), paramDataToSign);
byte[] digestInfo = dInfo.getEncoded(ASN1Encoding.DER);
rsaEngine.processBlock(digestInfo, 0, digestInfo.length);
Run Code Online (Sandbox Code Playgroud)
问题在于RSAFormatter.CreateSignature(paramDataToSign);传递的是哈希值,而传递的是哈希前的signer.update(paramDataToSign);数据。因此,您可能必须删除Java 代码的计算才能使其正常工作。MessageDigest
或者,如果您只有哈希值,则可以查看 Bouncy Castle 轻量级 API 以查找接受预先哈希值的方法。这可能可以使用 来执行new RSADigestSigner(new StaticDigest(paramDataToSign, "SHA-1")).generateSignature()。
问题是它StaticDigest不存在,所以如果你确实需要它,你必须在这里发表评论。或者,镜像 的实现,RSADigestSigner但替换为预先计算的哈希值。
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |