gpt4 book ai didi

c# - 如何让 PHP 对与 C# 完全相同的输入进行签名?

转载 作者:行者123 更新时间:2023-12-03 11:22:54 25 4
gpt4 key购买 nike

我正在使用需要对 XML 进行签名的旧 API。没有适当的文档,唯一的代码示例是在 C# 中给出的。我需要将此示例移植到 PHP。但是,即使提供相同的输入,我用 PHP 编写的代码也会得到不同的输出,从而导致 API 调用失败。
我在 C# 中将它缩小到这个函数:

public byte[] CreateSignature(byte[] hash)
{
RSAPKCS1SignatureFormatter signatureFormatter = new RSAPKCS1SignatureFormatter(pfxCert.PrivateKey);
signatureFormatter.SetHashAlgorithm("SHA1");
return signatureFormatter.CreateSignature(hash);
}
这是 PHP 中的相同操作:
public function createSignature($hashByteArray, $certArray) {
$hash = implode(array_map("chr", $hashByteArray));
$hashEncoded = base64_encode($hash);
openssl_sign($hashEncoded,$signature, $certArray);
return unpack("C*", $signature);
}
请注意, openssl_sign 中的输入不能采用字节数组,因此这可能是一个不同点。我已经尝试了 openssl_get_md_methods() 和 phpseclib 提供的所有算法,但都没有匹配输出。
我在 C# 中创建了相同示例输入和证书的 GitHub 要点。和 PHP以更好地说明问题。
给定相同的输入,如何在 PHP 中获得与 C# 相同的签名输出?

最佳答案

它们之间有根本的区别。
RSAPKCS1SignatureFormatter.CreateSignature方法期望 一个数据哈希 . openssl_sign另一方面期望数据本身 .

From PHP: openssl_sign - Manual

openssl_sign() computes a signature for the specified data bygenerating a cryptographic digital signature using the private keyassociated with priv_key_id. Note that the data itself is notencrypted.


显然,您生成了一些数据的哈希值,以便与用 C# 编写的 API 一起使用。不要用 openssl_sign ,而是使用原始数据调用。 openssl_sign将在签名前对其进行哈希处理,这是设计使然。

关于c# - 如何让 PHP 对与 C# 完全相同的输入进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65095389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com