【发布时间】:2017-09-08 18:01:26
【问题描述】:
我正在做一个需要在 Java 和 Delphi 之间实现数字签名的项目。我正在开发 Java 部分,而另一个开发者正在开发 Delphi 部分。
我们能够使用 SHA256WithRSA 与私钥进行互操作签名(签名字节的基数 64 相同)。
我正在使用 OpenJDK 实现,而 Delphi 开发人员正在使用 Chilkat 库。
问题在于签名验证。我们无法在两种语言上获得相同的公钥字节表示。
公钥的 Java base 64 表示
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2L6O8YUP5vNJAjqIZAh8yMaPdL+Xcs2lwI9+bvstQT+3sy8S/EC15BoL7vIbp7I2SarPp9ASvxTRvU6sNyD5cVPUW05NkBOM24uhdLs8TNXibbnQAVAMpjkMGkmqZTTeWfYjeHImwjX/K32mNSC+F3i2rQHLtnyPO2ktmAW9lJbGvdwAX0HT0CBT9Z4tZKVn3cRlJva2bqK5z/0xx8Po+Yzh2eK1WZC3coKQQggiPVzFcJJFHtICuklrFZ+vTkpx3apFov27XgkWhCjh6ZZ7UPIVHEZhTlixKBxM36agRZTqZROwFc01nau9f4HWCpsnbm2RBoT3IkNxEq8IRgcFaQIDAQAB
Delphi base 64 公钥的表示
MD8BIjANBgkqP0g/9w0BAQEFAAM/AQ8AMD8BCgI/AQEA2L4/8T8P5vNJAjo/ZAh8yMaPdL8/cs2lwI9+bvstQT+3sy8S/EC15BoL7vIbp7I2SarPp9ASvxTRvU6sNyD5cVPUW05NkBM/2z+hdLs8TNXibbnQAVAMpjkMGkmqZTTeWfYjeHImwjX/K32mNSC+F3i2rQHLtnyPO2ktPwW9Pz/GvdwAX0HT0CBT9T8tZKVn3cRlJva2bqK5z/0xx8Po+T/h2eK1WZC3cj+QQggiPVzFcD9FHtICuklrFT+vTkpx3apFov27XgkWPyjh6T97UPIVHEZhTlixKBxM36agRT/qZROwFc01nau9f4HWCj8nbm0/Bj/3IkNxEq8IRgcFaQIDAQAB
差异很小,但足以使密钥在其他语言上不起作用。
有什么想法吗?
谢谢
【问题讨论】:
-
不是没有代码,没有。
-
答案可在您的代码中找到。祝你好运。 minimal reproducible example.
-
base64 输出不同,因为被编码的输入数据不同。如果将这两个 base64 字符串解码为原始字节,您会看到这两组字节之间存在差异。您的两个代码在 base64 编码之前产生的字节不同。
-
如果您有 Chilkat 软件,他们会提供 Java 版本吗?如果是这样,您可以检查在他们的 Java 版本和用于 Delphi 的 Windows DLL 之间是否有任何差异(顺便说一句,差异很大,不小)。正如其他人所说,如果没有看到代码差异(这也可能产生影响),甚至不可能从可能的错误开始。
-
这是调试 101。跟踪两个程序的执行和中间值,找到它们的分歧点。令人失望的是,现代程序员似乎没有学会这些技能。