C# 如何使用RSA签名创建SHA1

C# 如何使用RSA签名创建SHA1,c#,.net,C#,.net,我有一个Java签名生成器: private static String getPvtKeyFromConfig = "merchantPvtKey"; private static String getPubKeyFromConfig = "merchantPubKey"; private static String getSaltFromConfig = "merchant_salt"; public static void main(String[] args) throws Excep

我有一个Java签名生成器:

private static String getPvtKeyFromConfig = "merchantPvtKey";
private static String getPubKeyFromConfig = "merchantPubKey";
private static String getSaltFromConfig = "merchant_salt";
public  static void main(String[] args) throws Exception {   
    // Generate Signature    
    String uniqueId="ab123";
    byte[] data = Base64.decodeBase64(uniqueId);
    java.security.Signature sig =java.security.Signature.getInstance("SHA1WithRSA");        
    sig.initSign(getPrivateFromSpec(getPvtKeyFromConfig));
    sig.update(data);  
    byte[] signatureBytes = sig.sign(); 
    System.out.println("Signature for uniqueId - "+uniqueId+": "+ Base64.encodeBase64String(signatureBytes));
}

我怎样才能在C#中做到这一点?

我想这就是你想要的:

static byte[] Sign(string text, string certSubject)
{
    // Access a store
    using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
    {
        store.Open(OpenFlags.ReadOnly);

        // Find the certificate used to sign
        RSACryptoServiceProvider provider = null;
        foreach (X509Certificate2 cert in store.Certificates)
        {
            if (cert.Subject.Contains(certSubject))
            {
                // Get its associated CSP and private key
                provider = (RSACryptoServiceProvider)cert.PrivateKey;
                break;
            }
        }

        if (provider == null)
            throw new Exception("Certificate not found.");

        // Hash the data
        var hash = HashText(text);

        // Sign the hash
        var signature = provider.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
        return signature;
    }                
}


static bool Verify(string text, byte[] signature, string certPath)
{

    // Load the certificate used to verify the signature
    X509Certificate2 certificate = new X509Certificate2(certPath);

    // Get its associated provider and public key
    RSACryptoServiceProvider provider = (RSACryptoServiceProvider)certificate.PublicKey.Key;

    // Hash the data
    var hash = HashText(text);

    // Verify the signature with the hash
    var result = provider.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), signature);
    return result;
}

static byte[] HashText(string text)
{
    SHA1Managed sha1Hasher = new SHA1Managed();
    UnicodeEncoding encoding = new UnicodeEncoding();
    byte[] data = encoding.GetBytes(text);
    byte[] hash = sha1Hasher.ComputeHash(data);
    return hash;
}
示例用法:

var signature = Sign("To be or not to be, that is the question.", "CN=some_cert");
var result = Verify("To be or not to be, that is the question.", signature, "C:\\temp\\some_cert.cer");
Console.WriteLine("Verified: {0}", result);

这太类似于你可以查看它的库…至于base 64,请查看Convert.ToBase64String和Convert.FromBase64String。我不认为“这里有一些java代码”算作试图自己解决这个问题的第一个可能的副本,可能的副本谢谢…但我没有任何证书,我刚准备好XML格式的公钥和私钥。@OlehYavorskiy:您在最初的问题中没有提到这一点。很抱歉。。。我能用XML键做吗?@OlehYavorskiy:没关系。欢迎来到SO。请参阅我将问题标记为重复问题时添加的注释。这里有一个指向另一个问题的链接,可能对您有所帮助。祝你好运@你好!有人知道这是什么“CN=某种证书”