起因是对接一个接口 他们只能提供java deom c#的没有,  百度了一天不能适配, 只能看java 还原的C#。

代码

public class SM2CryptoUtil{public SM2CryptoUtil(string pubkey, string privkey, Mode mode = Mode.C1C2C3, bool isPkcs8 = false){if (pubkey != null)this.pubkey = pubkey;if (privkey != null)this.privkey = privkey;this.mode = mode;}string pubkey;string privkey;Mode mode;ICipherParameters _privateKeyParameters;ICipherParameters PrivateKeyParameters{get{try{var r = _privateKeyParameters;if (r == null) r = _privateKeyParameters =new ECPrivateKeyParameters(new BigInteger(privkey, 16),new ECDomainParameters(GMNamedCurves.GetByName("SM2P256V1")));return r;}catch (Exception ex){return null;}}}ICipherParameters _publicKeyParameters;ICipherParameters PublicKeyParameters{get{try{var r = _publicKeyParameters;if (r == null){//截取64字节有效的SM2公钥(如果公钥首个字节为0x04)if (pubkey.Length > 128){pubkey = pubkey.Substring(pubkey.Length - 128);}//将公钥拆分为x,y分量(各32字节)String stringX = pubkey.Substring(0, 64);String stringY = pubkey.Substring(stringX.Length);//将公钥x、y分量转换为BigInteger类型BigInteger x = new BigInteger(stringX, 16);BigInteger y = new BigInteger(stringY, 16);//通过公钥x、y分量创建椭圆曲线公钥规范var x9ec = GMNamedCurves.GetByName("SM2P256V1");r = _publicKeyParameters = new ECPublicKeyParameters(x9ec.Curve.CreatePoint(x,y),new ECDomainParameters(x9ec));}return r;}catch (Exception ex){return null;;}}}public byte[] Decrypt(byte[] data){try{if (mode == Mode.C1C3C2)data = C132ToC123(data);var sm2 = new SM2Engine();sm2.Init(false, this.PrivateKeyParameters);return sm2.ProcessBlock(data, 0, data.Length);}catch (Exception ex) {return null;}}public byte[] Encrypt(byte[] data){try{//  var sm2 = new SM2Engine(new SM3Digest());var sm2 = new SM2Engine();sm2.Init(true, new ParametersWithRandom(this.PublicKeyParameters));data = sm2.ProcessBlock(data, 0, data.Length);if (mode == Mode.C1C3C2) data = C123ToC132(data);return data;}catch (Exception ex) {return null;}}static byte[] C123ToC132(byte[] c1c2c3){var gn = GMNamedCurves.GetByName("SM2P256V1");int c1Len = (gn.Curve.FieldSize + 7) / 8 * 2 + 1;int c3Len = 32;byte[] result = new byte[c1c2c3.Length];Array.Copy(c1c2c3, 0, result, 0, c1Len); //c1Array.Copy(c1c2c3, c1c2c3.Length - c3Len, result, c1Len, c3Len); //c3Array.Copy(c1c2c3, c1Len, result, c1Len + c3Len, c1c2c3.Length - c1Len - c3Len); //c2return result;}static byte[] C132ToC123(byte[] c1c3c2){var gn = GMNamedCurves.GetByName("SM2P256V1");int c1Len = (gn.Curve.FieldSize + 7) / 8 * 2 + 1;int c3Len = 32;byte[] result = new byte[c1c3c2.Length];Array.Copy(c1c3c2, 0, result, 0, c1Len); //c1: 0->65Array.Copy(c1c3c2, c1Len + c3Len, result, c1Len, c1c3c2.Length - c1Len - c3Len); //c2Array.Copy(c1c3c2, c1Len, result, c1c3c2.Length - c3Len, c3Len); //c3return result;}public enum Mode{C1C2C3, C1C3C2}}

调用方式

//实例化string pukey="";string PRKEY="";var handle = new SM2CryptoUtil(pukey, PRKEY, SM2CryptoUtil.Mode.C1C3C2);
//加密
string str="";
var Encryptdata = handle.Encrypt(System.Text.Encoding.UTF8.GetBytes(str));
string datac = Hex.ToHexString(Encryptdata);
//解密
string str="";
var original = handle.Decrypt(Hex.Decode(str));
string data = System.Text.Encoding.Default.GetString(original);

如果不能用 请留言
苦逼呀!!!

Java通用C# SM2加密解密相关推荐

  1. android java加密_Android、iOS和Java通用的AES128加密解密示例代码

    前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密. ...

  2. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  3. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

  4. C# Java间进行RSA加密解密交互

    C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...

  5. C# Java间进行RSA加密解密交互(二)

    接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...

  6. [转]JAVA与.NET DES加密解密

    [转]原文地址:http://www.cnblogs.com/prince3245/archive/2010/03/23/1692630.html JAVA与.NET DES加密解密 前几天做了个项目 ...

  7. c++国密算法SM2加密解密demo

    c++国密算法SM2加密解密 一.代码 一.代码 封装加密.解密接口: 加密接口: Encrpt_SM2() 解密接口:Decrypt_SM2() 加密解密结果可以和nodejs的模块sm-crypt ...

  8. SM2加密解密执行报 Invalid point encoding 0x5c

    SM2加密解密执行报 Invalid point encoding 0x5c 私钥前加00,密文前加04,公钥前加04 确实可以解决问题.内在原因? 解决方法一: SM2加密数据 由C1,C2,C3组 ...

  9. Java简单实现DES加密解密算法

    Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...

最新文章

  1. oracle date怎么用,Oracle to_date的使用方法
  2. Android 应用进行性能分析/APP/系统性能分析
  3. 别在.NET死忠粉面前黑.NET5,它未来可期!
  4. 谁优谁劣?——AMD与Intel产品对比分析
  5. 零基础入门Python3-列表list详解
  6. java模拟dos窗口
  7. JDBC 与 JNDI 这两种连接方式 区别
  8. 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答
  9. pytorch之expand和repeat
  10. WayOS路由器企业应用方案
  11. JAVA动漫论坛BBS系统的设计与实现
  12. 农场游戏开发记录十二
  13. pp助手苹果版_PP助手下线iOS版,曾首发iOS 9完美越狱工具,再见~
  14. java webservice接口开发实例_Webservice 接口开发简单例子
  15. 如何编写一份高质量的测试报告
  16. 利用SPSS进行多重线性回归分析-基础篇
  17. 邮箱前台html,WEB独特的邮箱
  18. RPL(4):RFC6550翻译(4)---RPL的通信流支持RPL实例
  19. sRGB转CIEXYZ转CIELAB,以及色彩距离
  20. UEFI+GPT+双硬盘下 搭建Windos10 和CentOS7 双系统

热门文章

  1. 基于ssm的拍卖系统
  2. mathtype获得试用
  3. 妙健康:数字化精准健康管理平台,提供个性化健康解决方案
  4. android操作系统
  5. 如何实现更好的推荐结果?腾讯微信提出深度反馈网络
  6. 牛血清白蛋白包裹金纳米簇
  7. 大学自习室简易抢座小程序
  8. 了解python编程语言_《了》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  9. 两周自制脚本语言--第二天 设计程序设计语言
  10. 武昌首义学院计算机中心,武昌首义学院_新闻中心