【发布时间】:2018-11-19 12:58:04
【问题描述】:
我有一个 rsa 私钥,我想用它签署数据。我写了这段代码,但它不起作用:
public string Sign(string text)
{
var sha = new SHA1Managed();
var encoding = new UTF8Encoding();
var bytes = encoding.GetBytes(text);
var digest = sha.ComputeHash(bytes);
var cert = new X509Certificate2(Convert.FromBase64String(PermissionKey));
var rsa = (RSACryptoServiceProvider)cert.PrivateKey;
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
rsaFormatter.SetHashAlgorithm("SHA1");
var SignedHashValue = rsa.SignData(digest, sha);
return Convert.ToBase64String(SignedHashValue).Replace("=", "") + "\n";
}
我得到了这个异常:
'Cannot find the requested object.
当我尝试创建 X509Certificate2 时:
var cert = new X509Certificate2(Convert.FromBase64String(PermissionKey));
PS: 我厌倦了在 C# 中模拟 android 代码。这是主要的android:
public static PrivateKey makePrivateKeyFromPermissionKey(String permissionKey)
throws InvalidKeySpecException, NoSuchProviderException, NoSuchAlgorithmException {
KeyFactory keyFactory;
byte[] certificate = decode(
permissionKey
.replaceAll("\\n", "")
.replace("-----BEGIN RSA PRIVATE KEY-----", "")
.replace("-----END RSA PRIVATE KEY-----", "")
);
if (Build.VERSION.SDK_INT < 27) {
keyFactory = KeyFactory.getInstance("RSA", "BC");
} else {
keyFactory = KeyFactory.getInstance("RSA");
}
return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(certificate));
}
【问题讨论】:
-
Android 代码包含废话。它根本不包含证书; PKCS#8 只是对私钥进行了编码(如 PEM 标头所示)。它还只是返回一个私钥 - 而这样的私钥不包括证书。
标签: c# android cryptography rsa sign