在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计算才能使其生效.

或者,如果您只有哈希值,则可以查看Bouncy Castle轻量级API以查找接受预先哈希值的方法.这可以使用新的RSADigestSigner(new StaticDigest(paramDataToSign,“SHA-1”)).generateSignature()来执行.

问题是StaticDigest不存在,所以如果你真的需要它,你必须在这里发表评论.替代方案,镜像RSADigestSigner的实现,但替换预先计算的哈希.

标签:c,java,cryptography,bouncycastle,digital-signature

来源: https://codeday.me/bug/20190623/1272204.html

java 消息摘要_java – 使用BouncyCastle签名消息摘要相关推荐

  1. java 微信模板_java开发微信模板消息推送

    概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添 ...

  2. java pgp 加密_java – 如何解密签名的pgp加密文件?

    如何使用BouncyCastle Java API解密和验证使用PGP加密的文件? 解决方法: 加密代码: private static void encryptFile(OutputStream o ...

  3. java打架游戏_java模拟游戏打斗场景摘要.doc

    java模拟游戏打斗场景摘要.doc //游戏人物属性模型 package dahuaxiyou; public class Immortal { public String name; public ...

  4. java消息 框架_java 框架-消息队列ActiveMQ

    https://www.jianshu.com/p/ecdc6eab554c ActiveMQ从入门到精通(一) 22017.03.11 21:40:42字数 2650阅读 57286 这是关于消息中 ...

  5. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些

    Java编程开发好入门吗?消息队列的用途有哪些?消息队列是指能够提供消息排队消费功能的软件程序,是消息队列中间件的一部分.消息队列中间件是分布式系统中重要的组件.接下来就给大家讲解消息队列的优势.类型 ...

  6. java消息平台_Java微信公众平台之消息管理

    Java微信公众平台开发之消息管理,一定要先看下官方文档 微信消息管理分为接收普通消息.接收事件推送.发送消息(被动回复).客服消息.群发消息.模板消息这几部分 一.接收普通消息 当普通微信用户向公众 ...

  7. java jms 消息服务_Java消息服务JMS详解

    Java消息服务(JMS Java Message Services)提供了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics). ...

  8. java发微信_java访问微信接口发送消息

    最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批人发送一个消息,提示有审批需要处理. 参考了一下微信的开发者文档和网络上的一些技术博客,现在记录一下.以便后续继 ...

  9. java开发微信公众号-订阅号-消息接收,及返回给用户信息

    创建java项目 1)导入依赖 pom.xml: <parent><groupId>org.springframework.boot</groupId><ar ...

最新文章

  1. (一)七种AOP实现方法
  2. KNN学习之图像分类与KNN原理
  3. linux sersync2 ssh start=true,rsync+nfs+sersync实战案例
  4. AngularJS笔记之创建服务方式比较 : factory vs service vs provider
  5. ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
  6. python 混淆矩阵_绘制混沌矩阵
  7. php input 数组的值,如何获取2值表单输入数组到PHP数组中(How to get 2 value form input array into PHP array)...
  8. 从服务器上传和下载文件方法
  9. 一分钟了解四层/七层反向代理
  10. antix linux安装教程,antiX 19.1 发布,轻量级的桌面Linux发行版
  11. Spring Boot 实际应用(三)发送邮件实现
  12. Sklearn专题实战——针对Category特征进行分类
  13. Lucene系列:番外篇-DocValues
  14. Ubuntu恢复官方默认源
  15. 使用邻接矩阵实现商品SKU表单联动
  16. 互联网金融指导意见或引发P2P跑路狂潮
  17. 【记录+解决】ubuntu服务器显卡驱动安装;Ubuntu20.04重启后找不到Nvidia显卡驱动
  18. 定时任务实现(中午12点执行,每1分钟执行一次)
  19. 还在问java架构师路线?学习路线?十年京东架构师教你这样做
  20. 【OSX】MAC下能用的炒股软件_我是亲民_新浪博客

热门文章

  1. 计算机系统的组成一般不包括,计算机系统的基本组成,一般应包括哪些
  2. 锂离子电池和燃料电池特性介绍
  3. S-Nim (HDU 1536)组合博弈SG多组游戏
  4. BAT文件的编写及使用
  5. 智能交通系统(ITS)的无线网络技术
  6. 十大优质外盘炒黄金平台排名
  7. 基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例
  8. Unity之Failed to import package with error: Couldn‘t decompress package
  9. 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
  10. 谷歌浏览器(Google Chrome)清除密码等缓存记录