华为云差旅服务-证书FAQ:实现RSA签名

时间:2023-11-01 16:16:03

实现RSA签名

  1. Java

Java语言实现PSS填充模式,需要依赖第三方开源组件Bouncy Castle,要求JDK 1.8及以上版本。

// 从文件、数据库或自己的密钥管理器中间加载公私钥、证书KeyPairEntry keyPairEntry = KeyStorage.getInstance().getKeyPair("trip");KeyPair keyPair = keyPairEntry.getKeyPair(0);String content = "这是原始数据";// RSA的PSS填充模式,可以使用Bouncy Castle的实现,建议全局只加载一次Security.addProvider(new BouncyCastleProvider());// 使用私钥签名Signature cipher = Signature.getInstance("SHA256withRSA/PSS");cipher.initSign(keyPair.getPrivate());cipher.update(content.getBytes(StandardCharsets.UTF_8));String sign = Hex.toHexString(cipher.sign());// 使用公钥验证签名cipher = Signature.getInstance("SHA256withRSA/PSS");cipher.initVerify(keyPair.getPublic());cipher.update(content.getBytes(StandardCharsets.UTF_8));boolean result = cipher.verify(Hex.decode(sign));System.out.println(result);

  1. C#

需要.net framework 4.7及以上版本。

using System;using System.Linq;using System.Diagnostics;using System.Security.Cryptography;using System.Security.Cryptography.X509Certificates;class Hello{    static void Main()    {        string message = "这是原始数据";        byte[] data = System.Text.Encoding.UTF8.GetBytes(message);        // 可以从文件等读取证书公私钥        string privateKey = @"...";        string publicKey = @"...";        string sign;        // 使用私钥签名        using (CngKey cngKey = CngKey.Import(Convert.FromBase64String(privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob))        using (RSACng rsa = new RSACng(cngKey))        {            sign = Convert.ToHexString(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pss));        }        Console.WriteLine(sign);        // 使用公钥验签        X509Certificate2 x509 = new X509Certificate2(Convert.FromBase64String(publicKey));        using (RSA rsa = x509.GetRSAPublicKey())        {            bool result = rsa.VerifyData(data, Convert.FromHexString(sign), HashAlgorithmName.SHA256, RSASignaturePadding.Pss);            Console.WriteLine(result);        }    }}

  1. 公钥证书

公钥证书.rar

support.huaweicloud.com/api-hctms/hctms-0035.html