Java 和 Delphi 之间的数字签名
Digital signature between Java and Delphi
我正在做一个项目,我需要在 Java 和 Delphi 之间实现数字签名。我正在开发 Java 部分,另一个开发人员正在开发 Delphi 部分。
我们能够使用 SHA256WithRSA 与私钥互操作签名(签名字节的基数 64 相同)。
我正在使用 OpenJDK 实现,Delphi 开发人员正在使用 Chilkat 库。
问题出在签名验证上。我们无法在两种语言上获得 public 键的相同字节表示。
Java public 键的 base 64 表示
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2L6O8YUP5vNJAjqIZAh8yMaPdL+Xcs2lwI9+bvstQT+3sy8S/EC15BoL7vIbp7I2SarPp9ASvxTRvU6sNyD5cVPUW05NkBOM24uhdLs8TNXibbnQAVAMpjkMGkmqZTTeWfYjeHImwjX/K32mNSC+F3i2rQHLtnyPO2ktmAW9lJbGvdwAX0HT0CBT9Z4tZKVn3cRlJva2bqK5z/0xx8Po+Yzh2eK1WZC3coKQQggiPVzFcJJFHtICuklrFZ+vTkpx3apFov27XgkWhCjh6ZZ7UPIVHEZhTlixKBxM36agRZTqZROwFc01nau9f4HWCpsnbm2RBoT3IkNxEq8IRgcFaQIDAQAB
Delphi public 键的 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
差异很小,但足以使密钥在其他语言上不起作用。
有什么想法吗?
谢谢
要从 Chilkat 库的 java.security.PublicKey.getEnconded() 获得相同的值,您必须使用 CkPublicKey.GetDer() 并将 false 传递给布尔参数以使其使用 PKCS8 格式。
我正在做一个项目,我需要在 Java 和 Delphi 之间实现数字签名。我正在开发 Java 部分,另一个开发人员正在开发 Delphi 部分。
我们能够使用 SHA256WithRSA 与私钥互操作签名(签名字节的基数 64 相同)。
我正在使用 OpenJDK 实现,Delphi 开发人员正在使用 Chilkat 库。
问题出在签名验证上。我们无法在两种语言上获得 public 键的相同字节表示。
Java public 键的 base 64 表示
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2L6O8YUP5vNJAjqIZAh8yMaPdL+Xcs2lwI9+bvstQT+3sy8S/EC15BoL7vIbp7I2SarPp9ASvxTRvU6sNyD5cVPUW05NkBOM24uhdLs8TNXibbnQAVAMpjkMGkmqZTTeWfYjeHImwjX/K32mNSC+F3i2rQHLtnyPO2ktmAW9lJbGvdwAX0HT0CBT9Z4tZKVn3cRlJva2bqK5z/0xx8Po+Yzh2eK1WZC3coKQQggiPVzFcJJFHtICuklrFZ+vTkpx3apFov27XgkWhCjh6ZZ7UPIVHEZhTlixKBxM36agRZTqZROwFc01nau9f4HWCpsnbm2RBoT3IkNxEq8IRgcFaQIDAQAB
Delphi public 键的 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
差异很小,但足以使密钥在其他语言上不起作用。
有什么想法吗?
谢谢
要从 Chilkat 库的 java.security.PublicKey.getEnconded() 获得相同的值,您必须使用 CkPublicKey.GetDer() 并将 false 传递给布尔参数以使其使用 PKCS8 格式。