国密SM2遇到的坑 BouncyCastle

由于我服务端用的加密库是BouncyCastle

    SM2加密数据 由C1,C2,C3组成    国密密文的正确排序是  C1+C3+C2

  1. 我们安全芯片SM2加密处理的密文顺序是 C1+C3+C2  而BC库加密出来的顺序是C1+C2+C3
  2. 我们安全在C1数据最前面没有04,而BC库加密出来的数据前面有04
  3. BC库生成SM2公私钥对时 
    1. 私钥的前面 偶尔会多加两个 00  而我们安全芯片 不支持   去掉00就可以
    2. 公钥的签名偶尔会多加04 而我们安全芯片 不支持   去掉04就可以

转载于:https://my.oschina.net/547217475/blog/2252583

C# 是一种通用的编程语言,可以用来开发各种类型的应用程序,包括使用国密SM2非对称算法进行加密和解密操作。 要在C#中使用国密SM2算法,你可以使用BouncyCastle库。BouncyCastle是一个流行的密码学库,提供了各种加密算法的实现,包括SM2。 首先,你需要将BouncyCastle库添加到你的项目中。你可以通过NuGet包管理器或手动下载并添加引用。 下面是一个使用C#BouncyCastle库实现SM2加密和解密的示例代码: ```csharp using System; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; public class SM2Example { public static void Main() { // 生成SM2密钥对 AsymmetricCipherKeyPair keyPair = GenerateKeyPair(); // 获取公钥和私钥 ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters)keyPair.Private; ECPublicKeyParameters publicKey = (ECPublicKeyParameters)keyPair.Public; // 要加密的明文 string plaintext = "Hello, SM2!"; // 使用公钥进行加密 byte[] ciphertext = Encrypt(publicKey, plaintext); // 使用私钥进行解密 string decryptedText = Decrypt(privateKey, ciphertext); Console.WriteLine("Plaintext: " + plaintext); Console.WriteLine("Ciphertext: " + Convert.ToBase64String(ciphertext)); Console.WriteLine("Decrypted text: " + decryptedText); } // 生成SM2密钥对 public static AsymmetricCipherKeyPair GenerateKeyPair() { ECKeyPairGenerator keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator("SM2"); keyPairGenerator.Init(new ECKeyGenerationParameters(SM2NamedCurves.GetByName("sm2p256v1"), new SecureRandom())); return keyPairGenerator.GenerateKeyPair(); } // 使用公钥进行加密 public static byte[] Encrypt(ECPublicKeyParameters publicKey, string plaintext) { IBasicAgreement agreement = AgreementUtilities.GetBasicAgreement("SM2"); agreement.Init(publicKey); byte[] input = System.Text.Encoding.UTF8.GetBytes(plaintext); byte[] output = agreement.CalculateAgreement(publicKey.Q).ToByteArrayUnsigned(); return output; } // 使用私钥进行解密 public static string Decrypt(ECPrivateKeyParameters privateKey, byte[] ciphertext) { IBasicAgreement agreement = AgreementUtilities.GetBasicAgreement("SM2"); agreement.Init(privateKey); byte[] input = new byte[ciphertext.Length]; Array.Copy(ciphertext, input, ciphertext.Length); BigInteger sharedSecret = new BigInteger(1, input); byte[] output = agreement.CalculateAgreement(privateKey.D, sharedSecret).ToByteArrayUnsigned(); return System.Text.Encoding.UTF8.GetString(output); } } ``` 这个示例代码演示了如何生成SM2密钥对,并使用公钥进行加密,私钥进行解密。注意,在实际应用中,你需要妥善保管私钥,确保安全性。 希望这可以帮助到你!如果有任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值