C# 如何使用RSA签名创建SHA1
我有一个Java签名生成器: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
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=某种证书”