Java通用C# SM2加密解密
起因是对接一个接口 他们只能提供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加密解密相关推荐
- android java加密_Android、iOS和Java通用的AES128加密解密示例代码
前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密. ...
- java之php、Android、JAVA、C# 3DES加密解密
异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...
- java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)
RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...
- C# Java间进行RSA加密解密交互
C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...
- C# Java间进行RSA加密解密交互(二)
接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...
- [转]JAVA与.NET DES加密解密
[转]原文地址:http://www.cnblogs.com/prince3245/archive/2010/03/23/1692630.html JAVA与.NET DES加密解密 前几天做了个项目 ...
- c++国密算法SM2加密解密demo
c++国密算法SM2加密解密 一.代码 一.代码 封装加密.解密接口: 加密接口: Encrpt_SM2() 解密接口:Decrypt_SM2() 加密解密结果可以和nodejs的模块sm-crypt ...
- SM2加密解密执行报 Invalid point encoding 0x5c
SM2加密解密执行报 Invalid point encoding 0x5c 私钥前加00,密文前加04,公钥前加04 确实可以解决问题.内在原因? 解决方法一: SM2加密数据 由C1,C2,C3组 ...
- Java简单实现DES加密解密算法
Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...
最新文章
- oracle date怎么用,Oracle to_date的使用方法
- Android 应用进行性能分析/APP/系统性能分析
- 别在.NET死忠粉面前黑.NET5,它未来可期!
- 谁优谁劣?——AMD与Intel产品对比分析
- 零基础入门Python3-列表list详解
- java模拟dos窗口
- JDBC 与 JNDI 这两种连接方式 区别
- 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答
- pytorch之expand和repeat
- WayOS路由器企业应用方案
- JAVA动漫论坛BBS系统的设计与实现
- 农场游戏开发记录十二
- pp助手苹果版_PP助手下线iOS版,曾首发iOS 9完美越狱工具,再见~
- java webservice接口开发实例_Webservice 接口开发简单例子
- 如何编写一份高质量的测试报告
- 利用SPSS进行多重线性回归分析-基础篇
- 邮箱前台html,WEB独特的邮箱
- RPL(4):RFC6550翻译(4)---RPL的通信流支持RPL实例
- sRGB转CIEXYZ转CIELAB,以及色彩距离
- UEFI+GPT+双硬盘下 搭建Windos10 和CentOS7 双系统