我正在尝试利用非官方的API文档。我需要使用自己的证书对所有请求进行签名,但是文档仅提供了要使用的Java代码,如下所示:
public class EncryptionUtils {
private static final String ALGORITHM_NAME = "SHA1withRSA";
private static final String CERT_TYPE = "pkcs12";
private static final String CONTAINER_NAME = "LoginCert";
private static final String PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06";
public static String signContent(byte[] contents, final InputStream cert) throws IOException, GeneralSecurityException, NullPointerException {
final KeyStore instance = KeyStore.getInstance(CERT_TYPE);
instance.load(cert, PASSWORD.toCharArray());
final PrivateKey privateKey = (PrivateKey) instance.getKey(CONTAINER_NAME, PASSWORD.toCharArray());
final Signature instance2 = Signature.getInstance(ALGORITHM_NAME);
instance2.initSign(privateKey);
instance2.update(contents);
return Base64.getEncoder().encodeToString(instance2.sign());
}}
我想出了这段代码
private static string password = "CE75EA598C7743AD9B0B7328DED85B06";
public static string Sign(string text, string cert)
{
X509Certificate2 certificate = new X509Certificate2(DecodeCrt(cert), password, X509KeyStorageFlags.Exportable);
RSA provider = (RSA)certificate.PrivateKey;
// Hash the data
var hash = HashText(text);
// Sign the hash
var signature = provider.SignHash(hash, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(signature);
}
public 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;
}
public static byte[] DecodeCrt(string crt)
{
return Convert.FromBase64String(crt);
}
但是输出与Java版本不同。我试图从c#临时运行Java任务,所以我想知道它是否还能工作。有什么办法用C#编写此代码吗?
问题来源:Stack Overflow
这两个代码都用于带有Pkcs#1 v1.5填充和SHA1的签名RSA,这在Java代码中通过SHA1withRSA和在RSA#SignHash方法中通过2nd和3rd参数显式地在C#代码中指定。由于签名的Pkcs#1 v1.5变体(RSASSA-PKCS1-v1_5)是确定性的,因此两个代码都必须提供相同的签名(假定要签名的数据相同和私钥相同)。
如果不是这种情况,实际上只有两种合理的解释:
如果考虑到这一点,则这两个代码都会在我的机器上生成相同的签名(假设要签名的数据相同,并且文件pfx / p12相同)。
最后,应该指出的是,两种代码cert都用于不同的对象。在Java代码中,它表示InputStreamC#代码中的pfx / pf12文件的Base64编码二进制数据。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。