java - 在 C# 中验证在 Java 中签名的内容

标签 java c# .net rsa sha1

我正在尝试将代码从 C# 移植到 java。 有一部分需要使用 RSA/Sha1 对字符串进行签名。

为了确保 java 代码产生与 C# 代码相同的结果,我尝试从 java 中签署一个字符串,并使用现有的 c# 代码来验证签名。我的挑战是我无法验证用 Java 签名的字符串。

这是代码;

Java 签名方法:

public static String signPayload(byte[] stringToSign, PrivateKey privateKey){ 
    try {
        Signature rsaSignatureProvider = Signature.getInstance("SHA1withRSA");
        rsaSignatureProvider.initSign(privateKey);
        rsaSignatureProvider.update(stringToSign);
        byte[] signature = rsaSignatureProvider.sign();
        return new String(Base64.encodeBase64String(signature));
    } catch (Exception ex) {
        ex.printStackTrace();
    } 

    return null;
}

C# 签名方法:

public String signPayload(String stringToSign, AsymmetricAlgorithm privateKey)
{

    var hash = sha1.ComputeHash(Convert.FromBase64String(stringToSign));
    RSACryptoServiceProvider cryptoProv = (RSACryptoServiceProvider)privateKey;
    return Convert.ToBase64String(cryptoProv.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
}

我用来验证签名数据的 C# 方法:

public bool verifyHash(String signature, String stringToSign, PublicKey publicKey)
{
    bool isVerified = false;
    var responseHash = sha1.ComputeHash(Convert.FromBase64String(stringToSign));
    RSACryptoServiceProvider publicKeyCrypto = (RSACryptoServiceProvider)publicKey.Key;
    isVerified = publicKeyCrypto.VerifyHash(responseHash, CryptoConfig.MapNameToOID("SHA1"), Convert.FromBase64String(signature));
    return isVerified;
}

我无法看出两种签名方法(Java 和 C#)之间的差距。我的 Java 代码哪里做错了?

最佳答案

我已经通过更改对签名进行编码的方式解决了我的问题。下面是代码;

public static String signPayload(byte[] stringToSign, PrivateKey privateKey) { 
    try {
        Signature rsaSignatureProvider = Signature.getInstance("SHA1withRSA");
        rsaSignatureProvider.initSign(privateKey);
        rsaSignatureProvider.update(stringToSign);
        byte[] signature = rsaSignatureProvider.sign();

        return java.util.Base64.getEncoder().encodeToString(signature);
    } catch (Exception ex) {
        ex.printStackTrace();
    } 
    return null;
}

关于java - 在 C# 中验证在 Java 中签名的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40680396/

相关文章:

c# - 在 monogame 中调试

c# - 如何在 C# 中最大化我的应用程序使用的功率?

c# - 奇怪的通用行为

c# - 不安全代码对安全代码有影响吗?

java - 如何创建一个由用户输入定义长度的静态数组?

java - 无法实例化类型 Set

java - 在模型中创建复杂的业务逻辑

java - JDBC 连接到 MySQL 需要哪些文件?

c# - Linq 到实体。空引用异常

c# - 为什么这段调整 .NET 窗体高度的代码会使窗体太小?