[英]Signing a message digest using BouncyCastle
在C#的那一刻,我正在簽署這樣的挑戰:
RSACryptoServiceProvider rsa;
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(rsa);
RSAFormatter.SetHashAlgorithm("SHA1");
byte[] SignedHash = RSAFormatter.CreateSignature(paramDataToSign);
然后我將SignedHash
給Windows,它接受它並且一切正常。 但我需要將此部分移至Android,並且存在問題,即我無法獲得相同的簽名哈希值。
在Android中,我嘗試制作簽名哈希,但它們與C#中生成的哈希不同。
Signature signer = Signature.getInstance("SHA1withRSA", "BC");
signer.initSign(privateKey);
signer.update(paramDataToSign);
signer.sign();
在C#中 - 使用下面一段代碼 - 我得到的結果與Android相同,但它不是一個選項,因為Windows不接受簽名的哈希。
ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKey);
signer.BlockUpdate(paramDataToSign, 0, paramDataToSign.Length);
signer.GenerateSignature();
這里寫的是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
編輯:
所以最簡單的解決方案是使用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);
問題是RSAFormatter.CreateSignature(paramDataToSign);
傳遞哈希值,而signer.update(paramDataToSign);
在散列之前傳遞數據。 因此,您可能必須刪除Java代碼的MessageDigest
計算才能使其MessageDigest
。
或者,如果您只有哈希值,則可以查看Bouncy Castle輕量級API以查找接受預先哈希值的方法。 這可以使用new RSADigestSigner(new StaticDigest(paramDataToSign, "SHA-1")).generateSignature()
。
問題是StaticDigest
不存在,所以如果你真的需要它,你必須在這里發表評論。 替代方案,鏡像RSADigestSigner
的實現,但替換預先計算的哈希。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.