0


javascript实现SM2加密解密

前提JavaWeb环境

前端代码

window.sm2=function(t){functioni(e){if(r[e])return r[e].exports;var n = r[e]={i: e,l:!1,exports:{}};return t[e].call(n.exports, n, n.exports, i), n.l =!0, n.exports
    }var r ={};return i.m = t, i.c = r, i.d=function(t, r, e){
        i.o(t, r)|| Object.defineProperty(t, r,{configurable:!1,enumerable:!0,get: e})}, i.n=function(t){var r = t && t.__esModule ?function(){return t.default
        }:function(){return t
        };return i.d(r,"a", r), r
    }, i.o=function(t, i){returnObject.prototype.hasOwnProperty.call(t, i)}, i.p ="",i(i.s =2)}([function(t, i, r){(function(){functionr(t, i, r){null!= t &&("number"==typeof t ?this.fromNumber(t, i, r):null== i &&"string"!=typeof t ?this.fromString(t,256):this.fromString(t, i))}functione(){returnnewr(null)}functionn(t, i, r, e, n, o){for(;--o >=0;){var s = i *this[t++]+ r[e]+ n;
                n = Math.floor(s /67108864), r[e++]=67108863& s
            }return n
        }functiono(t, i, r, e, n, o){for(var s =32767& i, u = i >>15;--o >=0;){var h =32767&this[t], a =this[t++]>>15, f = u * h + a * s;
                h = s * h +((32767& f)<<15)+ r[e]+(1073741823& n), n =(h >>>30)+(f >>>15)+ u * a +(n >>>30), r[e++]=1073741823& h
            }return n
        }functions(t, i, r, e, n, o){for(var s =16383& i, u = i >>14;--o >=0;){var h =16383&this[t], a =this[t++]>>14, f = u * h + a * s;
                h = s * h +((16383& f)<<14)+ r[e]+ n, n =(h >>28)+(f >>14)+ u * a, r[e++]=268435455& h
            }return n
        }functionu(t){return pi.charAt(t)}functionh(t, i){var r = vi[t.charCodeAt(i)];returnnull== r ?-1: r
        }functiona(t){for(var i =this.t -1; i >=0;--i) t[i]=this[i];
            t.t =this.t, t.s =this.s
        }functionf(t){this.t =1,this.s = t <0?-1:0, t >0?this[0]= t : t <-1?this[0]= t +this.DV:this.t =0}functionl(t){var i =e();return i.fromInt(t), i
        }functionc(t, i){var e;if(16== i) e =4;elseif(8== i) e =3;elseif(256== i) e =8;elseif(2== i) e =1;elseif(32== i) e =5;else{if(4!= i)returnvoidthis.fromRadix(t, i);
                e =2}this.t =0,this.s =0;for(var n = t.length, o =!1, s =0;--n >=0;){var u =8== e ?255& t[n]:h(t, n);
                u <0?"-"== t.charAt(n)&&(o =!0):(o =!1,0== s ?this[this.t++]= u : s + e >this.DB?(this[this.t -1]|=(u &(1<<this.DB- s)-1)<< s,this[this.t++]= u >>this.DB- s):this[this.t -1]|= u << s,(s += e)>=this.DB&&(s -=this.DB))}8== e &&0!=(128& t[0])&&(this.s =-1, s >0&&(this[this.t -1]|=(1<<this.DB- s)-1<< s)),this.clamp(), o && r.ZERO.subTo(this,this)}functionp(){for(var t =this.s &this.DM;this.t >0&&this[this.t -1]== t;)--this.t
        }functionv(t){if(this.s <0)return"-"+this.negate().toString(t);var i;if(16== t) i =4;elseif(8== t) i =3;elseif(2== t) i =1;elseif(32== t) i =5;else{if(4!= t)returnthis.toRadix(t);
                i =2}var r, e =(1<< i)-1, n =!1, o ="", s =this.t, h =this.DB- s *this.DB% i;if(s-->0)for(h <this.DB&&(r =this[s]>> h)>0&&(n =!0, o =u(r)); s >=0;) h < i ?(r =(this[s]&(1<< h)-1)<< i - h, r |=this[--s]>>(h +=this.DB- i)):(r =this[s]>>(h -= i)& e, h <=0&&(h +=this.DB,--s)), r >0&&(n =!0), n &&(o +=u(r));return n ? o :"0"}functiony(){var t =e();return r.ZERO.subTo(this, t), t
        }functionm(){returnthis.s <0?this.negate():this}functiong(t){var i =this.s - t.s;if(0!= i)return i;var r =this.t;if(0!=(i = r - t.t))returnthis.s <0?-i : i;for(;--r >=0;)if(0!=(i =this[r]- t[r]))return i;return0}functiond(t){var i, r =1;return0!=(i = t >>>16)&&(t = i, r +=16),0!=(i = t >>8)&&(t = i, r +=8),0!=(i = t >>4)&&(t = i, r +=4),0!=(i = t >>2)&&(t = i, r +=2),0!=(i = t >>1)&&(t = i, r +=1), r
        }functionT(){returnthis.t <=0?0:this.DB*(this.t -1)+d(this[this.t -1]^this.s &this.DM)}functionF(t, i){var r;for(r =this.t -1; r >=0;--r) i[r + t]=this[r];for(r = t -1; r >=0;--r) i[r]=0;
            i.t =this.t + t, i.s =this.s
        }functionb(t, i){for(var r = t; r <this.t;++r) i[r - t]=this[r];
            i.t = Math.max(this.t - t,0), i.s =this.s
        }functionB(t, i){var r, e = t %this.DB, n =this.DB- e, o =(1<< n)-1, s = Math.floor(t /this.DB),
                u =this.s << e &this.DM;for(r =this.t -1; r >=0;--r) i[r + s +1]=this[r]>> n | u, u =(this[r]& o)<< e;for(r = s -1; r >=0;--r) i[r]=0;
            i[s]= u, i.t =this.t + s +1, i.s =this.s, i.clamp()}functionw(t, i){
            i.s =this.s;var r = Math.floor(t /this.DB);if(r >=this.t)returnvoid(i.t =0);var e = t %this.DB, n =this.DB- e, o =(1<< e)-1;
            i[0]=this[r]>> e;for(var s = r +1; s <this.t;++s) i[s - r -1]|=(this[s]& o)<< n, i[s - r]=this[s]>> e;
            e >0&&(i[this.t - r -1]|=(this.s & o)<< n), i.t =this.t - r, i.clamp()}functionx(t, i){for(var r =0, e =0, n = Math.min(t.t,this.t); r < n;) e +=this[r]- t[r], i[r++]= e &this.DM, e >>=this.DB;if(t.t <this.t){for(e -= t.s; r <this.t;) e +=this[r], i[r++]= e &this.DM, e >>=this.DB;
                e +=this.s
            }else{for(e +=this.s; r < t.t;) e -= t[r], i[r++]= e &this.DM, e >>=this.DB;
                e -= t.s
            }
            i.s = e <0?-1:0, e <-1? i[r++]=this.DV+ e : e >0&&(i[r++]= e), i.t = r, i.clamp()}functionD(t, i){var e =this.abs(), n = t.abs(), o = e.t;for(i.t = o + n.t;--o >=0;) i[o]=0;for(o =0; o < n.t;++o) i[o + e.t]= e.am(0, n[o], i, o,0, e.t);
            i.s =0, i.clamp(),this.s != t.s && r.ZERO.subTo(i, i)}functionS(t){for(var i =this.abs(), r = t.t =2* i.t;--r >=0;) t[r]=0;for(r =0; r < i.t -1;++r){var e = i.am(r, i[r], t,2* r,0,1);(t[r + i.t]+= i.am(r +1,2* i[r], t,2* r +1, e, i.t - r -1))>= i.DV&&(t[r + i.t]-= i.DV, t[r + i.t +1]=1)}
            t.t >0&&(t[t.t -1]+= i.am(r, i[r], t,2* r,0,1)), t.s =0, t.clamp()}functionI(t, i, n){var o = t.abs();if(!(o.t <=0)){var s =this.abs();if(s.t < o.t)returnnull!= i && i.fromInt(0),void(null!= n &&this.copyTo(n));null== n &&(n =e());var u =e(), h =this.s, a = t.s, f =this.DB-d(o[o.t -1]);
                f >0?(o.lShiftTo(f, u), s.lShiftTo(f, n)):(o.copyTo(u), s.copyTo(n));var l = u.t, c = u[l -1];if(0!= c){var p = c *(1<<this.F1)+(l >1? u[l -2]>>this.F2:0), v =this.FV/ p,
                        y =(1<<this.F1)/ p, m =1<<this.F2, g = n.t,T= g - l,F=null== i ?e(): i;for(u.dlShiftTo(T,F), n.compareTo(F)>=0&&(n[n.t++]=1, n.subTo(F, n)), r.ONE.dlShiftTo(l,F),F.subTo(u, u); u.t < l;) u[u.t++]=0;for(;--T>=0;){var b = n[--g]== c ?this.DM: Math.floor(n[g]* v +(n[g -1]+ m)* y);if((n[g]+= u.am(0, b, n,T,0, l))< b)for(u.dlShiftTo(T,F), n.subTo(F, n); n[g]<--b;) n.subTo(F, n)}null!= i &&(n.drShiftTo(l, i), h != a && r.ZERO.subTo(i, i)), n.t = l, n.clamp(), f >0&& n.rShiftTo(f, n), h <0&& r.ZERO.subTo(n, n)}}}functionE(t){var i =e();returnthis.abs().divRemTo(t,null, i),this.s <0&& i.compareTo(r.ZERO)>0&& t.subTo(i, i), i
        }functionq(t){this.m = t
        }functionO(t){return t.s <0|| t.compareTo(this.m)>=0? t.mod(this.m): t
        }functionA(t){return t
        }functionR(t){
            t.divRemTo(this.m,null, t)}functionM(t, i, r){
            t.multiplyTo(i, r),this.reduce(r)}functionP(t, i){
            t.squareTo(i),this.reduce(i)}functionC(){if(this.t <1)return0;var t =this[0];if(0==(1& t))return0;var i =3& t;return i = i *(2-(15& t)* i)&15, i = i *(2-(255& t)* i)&255, i = i *(2-((65535& t)* i &65535))&65535, i = i *(2- t * i %this.DV)%this.DV, i >0?this.DV- i :-i
        }functionk(t){this.m = t,this.mp = t.invDigit(),this.mpl =32767&this.mp,this.mph =this.mp >>15,this.um =(1<< t.DB-15)-1,this.mt2 =2* t.t
        }functionV(t){var i =e();return t.abs().dlShiftTo(this.m.t, i), i.divRemTo(this.m,null, i), t.s <0&& i.compareTo(r.ZERO)>0&&this.m.subTo(i, i), i
        }functionH(t){var i =e();return t.copyTo(i),this.reduce(i), i
        }functionN(t){for(; t.t <=this.mt2;) t[t.t++]=0;for(var i =0; i <this.m.t;++i){var r =32767& t[i],
                    e = r *this.mpl +((r *this.mph +(t[i]>>15)*this.mpl &this.um)<<15)& t.DM;for(r = i +this.m.t, t[r]+=this.m.am(0, e, t, i,0,this.m.t); t[r]>= t.DV;) t[r]-= t.DV, t[++r]++}
            t.clamp(), t.drShiftTo(this.m.t, t), t.compareTo(this.m)>=0&& t.subTo(this.m, t)}functionL(t, i){
            t.squareTo(i),this.reduce(i)}functionz(t, i, r){
            t.multiplyTo(i, r),this.reduce(r)}functionj(){return0==(this.t >0?1&this[0]:this.s)}functionZ(t, i){if(t >4294967295|| t <1)return r.ONE;var n =e(), o =e(), s = i.convert(this), u =d(t)-1;for(s.copyTo(n);--u >=0;)if(i.sqrTo(n, o),(t &1<< u)>0) i.mulTo(o, s, n);else{var h = n;
                n = o, o = h
            }return i.revert(n)}function_(t, i){var r;return r = t <256|| i.isEven()?newq(i):newk(i),this.exp(t, r)}functionK(){var t =e();returnthis.copyTo(t), t
        }functionU(){if(this.s <0){if(1==this.t)returnthis[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)returnthis[0];if(0==this.t)return0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}functionX(){return0==this.t ?this.s :this[0]<<24>>24}functionG(){return0==this.t ?this.s :this[0]<<16>>16}functionY(t){return Math.floor(Math.LN2*this.DB/ Math.log(t))}functionJ(){returnthis.s <0?-1:this.t <=0||1==this.t &&this[0]<=0?0:1}functionQ(t){if(null== t &&(t =10),0==this.signum()|| t <2|| t >36)return"0";var i =this.chunkSize(t), r = Math.pow(t, i), n =l(r), o =e(), s =e(), u ="";for(this.divRemTo(n, o, s); o.signum()>0;) u =(r + s.intValue()).toString(t).substr(1)+ u, o.divRemTo(n, o, s);return s.intValue().toString(t)+ u
        }functionW(t, i){this.fromInt(0),null== i &&(i =10);for(var e =this.chunkSize(i), n = Math.pow(i, e), o =!1, s =0, u =0, a =0; a < t.length;++a){var f =h(t, a);
                f <0?"-"== t.charAt(a)&&0==this.signum()&&(o =!0):(u = i * u + f,++s >= e &&(this.dMultiply(n),this.dAddOffset(u,0), s =0, u =0))}
            s >0&&(this.dMultiply(Math.pow(i, s)),this.dAddOffset(u,0)), o && r.ZERO.subTo(this,this)}function$(t, i, e){if("number"==typeof i)if(t <2)this.fromInt(1);elsefor(this.fromNumber(t, e),this.testBit(t -1)||this.bitwiseTo(r.ONE.shiftLeft(t -1), ut,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(i);)this.dAddOffset(2,0),this.bitLength()> t &&this.subTo(r.ONE.shiftLeft(t -1),this);else{var n =newArray, o =7& t;
                n.length =1+(t >>3), i.nextBytes(n), o >0? n[0]&=(1<< o)-1: n[0]=0,this.fromString(n,256)}}functiontt(){var t =this.t, i =newArray;
            i[0]=this.s;var r, e =this.DB- t *this.DB%8, n =0;if(t-->0)for(e <this.DB&&(r =this[t]>> e)!=(this.s &this.DM)>> e &&(i[n++]= r |this.s <<this.DB- e); t >=0;) e <8?(r =(this[t]&(1<< e)-1)<<8- e, r |=this[--t]>>(e +=this.DB-8)):(r =this[t]>>(e -=8)&255, e <=0&&(e +=this.DB,--t)),0!=(128& r)&&(r |=-256),0== n &&(128&this.s)!=(128& r)&&++n,(n >0|| r !=this.s)&&(i[n++]= r);return i
        }functionit(t){return0==this.compareTo(t)}functionrt(t){returnthis.compareTo(t)<0?this: t
        }functionet(t){returnthis.compareTo(t)>0?this: t
        }functionnt(t, i, r){var e, n, o = Math.min(t.t,this.t);for(e =0; e < o;++e) r[e]=i(this[e], t[e]);if(t.t <this.t){for(n = t.s &this.DM, e = o; e <this.t;++e) r[e]=i(this[e], n);
                r.t =this.t
            }else{for(n =this.s &this.DM, e = o; e < t.t;++e) r[e]=i(n, t[e]);
                r.t = t.t
            }
            r.s =i(this.s, t.s), r.clamp()}functionot(t, i){return t & i
        }functionst(t){var i =e();returnthis.bitwiseTo(t, ot, i), i
        }functionut(t, i){return t | i
        }functionht(t){var i =e();returnthis.bitwiseTo(t, ut, i), i
        }functionat(t, i){return t ^ i
        }functionft(t){var i =e();returnthis.bitwiseTo(t, at, i), i
        }functionlt(t, i){return t &~i
        }functionct(t){var i =e();returnthis.bitwiseTo(t, lt, i), i
        }functionpt(){for(var t =e(), i =0; i <this.t;++i) t[i]=this.DM&~this[i];return t.t =this.t, t.s =~this.s, t
        }functionvt(t){var i =e();return t <0?this.rShiftTo(-t, i):this.lShiftTo(t, i), i
        }functionyt(t){var i =e();return t <0?this.lShiftTo(-t, i):this.rShiftTo(t, i), i
        }functionmt(t){if(0== t)return-1;var i =0;return0==(65535& t)&&(t >>=16, i +=16),0==(255& t)&&(t >>=8, i +=8),0==(15& t)&&(t >>=4, i +=4),0==(3& t)&&(t >>=2, i +=2),0==(1& t)&&++i, i
        }functiongt(){for(var t =0; t <this.t;++t)if(0!=this[t])return t *this.DB+mt(this[t]);returnthis.s <0?this.t *this.DB:-1}functiondt(t){for(var i =0;0!= t;) t &= t -1,++i;return i
        }functionTt(){for(var t =0, i =this.s &this.DM, r =0; r <this.t;++r) t +=dt(this[r]^ i);return t
        }functionFt(t){var i = Math.floor(t /this.DB);return i >=this.t ?0!=this.s :0!=(this[i]&1<< t %this.DB)}functionbt(t, i){var e = r.ONE.shiftLeft(t);returnthis.bitwiseTo(e, i, e), e
        }functionBt(t){returnthis.changeBit(t, ut)}functionwt(t){returnthis.changeBit(t, lt)}functionxt(t){returnthis.changeBit(t, at)}functionDt(t, i){for(var r =0, e =0, n = Math.min(t.t,this.t); r < n;) e +=this[r]+ t[r], i[r++]= e &this.DM, e >>=this.DB;if(t.t <this.t){for(e += t.s; r <this.t;) e +=this[r], i[r++]= e &this.DM, e >>=this.DB;
                e +=this.s
            }else{for(e +=this.s; r < t.t;) e += t[r], i[r++]= e &this.DM, e >>=this.DB;
                e += t.s
            }
            i.s = e <0?-1:0, e >0? i[r++]= e : e <-1&&(i[r++]=this.DV+ e), i.t = r, i.clamp()}functionSt(t){var i =e();returnthis.addTo(t, i), i
        }functionIt(t){var i =e();returnthis.subTo(t, i), i
        }functionEt(t){var i =e();returnthis.multiplyTo(t, i), i
        }functionqt(){var t =e();returnthis.squareTo(t), t
        }functionOt(t){var i =e();returnthis.divRemTo(t, i,null), i
        }functionAt(t){var i =e();returnthis.divRemTo(t,null, i), i
        }functionRt(t){var i =e(), r =e();returnthis.divRemTo(t, i, r),newArray(i, r)}functionMt(t){this[this.t]=this.am(0, t -1,this,0,0,this.t),++this.t,this.clamp()}functionPt(t, i){if(0!= t){for(;this.t <= i;)this[this.t++]=0;for(this[i]+= t;this[i]>=this.DV;)this[i]-=this.DV,++i >=this.t &&(this[this.t++]=0),++this[i]}}functionCt(){}functionkt(t){return t
        }functionVt(t, i, r){
            t.multiplyTo(i, r)}functionHt(t, i){
            t.squareTo(i)}functionNt(t){returnthis.exp(t,newCt)}functionLt(t, i, r){var e = Math.min(this.t + t.t, i);for(r.s =0, r.t = e; e >0;) r[--e]=0;var n;for(n = r.t -this.t; e < n;++e) r[e +this.t]=this.am(0, t[e], r, e,0,this.t);for(n = Math.min(t.t, i); e < n;++e)this.am(0, t[e], r, e,0, i - e);
            r.clamp()}functionzt(t, i, r){--i;var e = r.t =this.t + t.t - i;for(r.s =0;--e >=0;) r[e]=0;for(e = Math.max(i -this.t,0); e < t.t;++e) r[this.t + e - i]=this.am(i - e, t[e], r,0,0,this.t + e - i);
            r.clamp(), r.drShiftTo(1, r)}functionjt(t){this.r2 =e(),this.q3 =e(), r.ONE.dlShiftTo(2* t.t,this.r2),this.mu =this.r2.divide(t),this.m = t
        }functionZt(t){if(t.s <0|| t.t >2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var i =e();return t.copyTo(i),this.reduce(i), i
        }function_t(t){return t
        }functionKt(t){for(t.drShiftTo(this.m.t -1,this.r2), t.t >this.m.t +1&&(t.t =this.m.t +1, t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t +1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t +1,this.r2); t.compareTo(this.r2)<0;) t.dAddOffset(1,this.m.t +1);for(t.subTo(this.r2, t); t.compareTo(this.m)>=0;) t.subTo(this.m, t)}functionUt(t, i){
            t.squareTo(i),this.reduce(i)}functionXt(t, i, r){
            t.multiplyTo(i, r),this.reduce(r)}functionGt(t, i){var r, n, o = t.bitLength(), s =l(1);if(o <=0)return s;
            r = o <18?1: o <48?3: o <144?4: o <768?5:6, n = o <8?newq(i): i.isEven()?newjt(i):newk(i);var u =newArray, h =3, a = r -1, f =(1<< r)-1;if(u[1]= n.convert(this), r >1){var c =e();for(n.sqrTo(u[1], c); h <= f;) u[h]=e(), n.mulTo(c, u[h -2], u[h]), h +=2}var p, v, y = t.t -1, m =!0, g =e();for(o =d(t[y])-1; y >=0;){for(o >= a ? p = t[y]>> o - a & f :(p =(t[y]&(1<< o +1)-1)<< a - o, y >0&&(p |= t[y -1]>>this.DB+ o - a)), h = r;0==(1& p);) p >>=1,--h;if((o -= h)<0&&(o +=this.DB,--y), m) u[p].copyTo(s), m =!1;else{for(; h >1;) n.sqrTo(s, g), n.sqrTo(g, s), h -=2;
                    h >0? n.sqrTo(s, g):(v = s, s = g, g = v), n.mulTo(g, u[p], s)}for(; y >=0&&0==(t[y]&1<< o);) n.sqrTo(s, g), v = s, s = g, g = v,--o <0&&(o =this.DB-1,--y)}return n.revert(s)}functionYt(t){var i =this.s <0?this.negate():this.clone(), r = t.s <0? t.negate(): t.clone();if(i.compareTo(r)<0){var e = i;
                i = r, r = e
            }var n = i.getLowestSetBit(), o = r.getLowestSetBit();if(o <0)return i;for(n < o &&(o = n), o >0&&(i.rShiftTo(o, i), r.rShiftTo(o, r)); i.signum()>0;)(n = i.getLowestSetBit())>0&& i.rShiftTo(n, i),(n = r.getLowestSetBit())>0&& r.rShiftTo(n, r), i.compareTo(r)>=0?(i.subTo(r, i), i.rShiftTo(1, i)):(r.subTo(i, r), r.rShiftTo(1, r));return o >0&& r.lShiftTo(o, r), r
        }functionJt(t){if(t <=0)return0;var i =this.DV% t, r =this.s <0? t -1:0;if(this.t >0)if(0== i) r =this[0]% t;elsefor(var e =this.t -1; e >=0;--e) r =(i * r +this[e])% t;return r
        }functionQt(t){var i = t.isEven();if(this.isEven()&& i ||0== t.signum())return r.ZERO;for(var e = t.clone(), n =this.clone(), o =l(1), s =l(0), u =l(0), h =l(1);0!= e.signum();){for(; e.isEven();) e.rShiftTo(1, e), i ?(o.isEven()&& s.isEven()||(o.addTo(this, o), s.subTo(t, s)), o.rShiftTo(1, o)): s.isEven()|| s.subTo(t, s), s.rShiftTo(1, s);for(; n.isEven();) n.rShiftTo(1, n), i ?(u.isEven()&& h.isEven()||(u.addTo(this, u), h.subTo(t, h)), u.rShiftTo(1, u)): h.isEven()|| h.subTo(t, h), h.rShiftTo(1, h);
                e.compareTo(n)>=0?(e.subTo(n, e), i && o.subTo(u, o), s.subTo(h, s)):(n.subTo(e, n), i && u.subTo(o, u), h.subTo(s, h))}return0!= n.compareTo(r.ONE)? r.ZERO: h.compareTo(t)>=0? h.subtract(t): h.signum()<0?(h.addTo(t, h), h.signum()<0? h.add(t): h): h
        }functionWt(t){var i, r =this.abs();if(1== r.t && r[0]<= yi[yi.length -1]){for(i =0; i < yi.length;++i)if(r[0]== yi[i])return!0;return!1}if(r.isEven())return!1;for(i =1; i < yi.length;){for(var e = yi[i], n = i +1; n < yi.length && e < mi;) e *= yi[n++];for(e = r.modInt(e); i < n;)if(e % yi[i++]==0)return!1}return r.millerRabin(t)}function$t(t){var i =this.subtract(r.ONE), n = i.getLowestSetBit();if(n <=0)return!1;var o = i.shiftRight(n);(t = t +1>>1)> yi.length &&(t = yi.length);for(var s =e(), u =0; u < t;++u){
                s.fromInt(yi[Math.floor(Math.random()* yi.length)]);var h = s.modPow(o,this);if(0!= h.compareTo(r.ONE)&&0!= h.compareTo(i)){for(var a =1; a++< n &&0!= h.compareTo(i);)if(h = h.modPowInt(2,this),0== h.compareTo(r.ONE))return!1;if(0!= h.compareTo(i))return!1}}return!0}functionti(t){
            di[Ti++]^=255& t, di[Ti++]^= t >>8&255, di[Ti++]^= t >>16&255, di[Ti++]^= t >>24&255, Ti >= wi &&(Ti -= wi)}functionii(){ti((newDate).getTime())}functionri(){if(null== gi){for(ii(), gi =hi(), gi.init(di), Ti =0; Ti < di.length;++Ti) di[Ti]=0;
                Ti =0}return gi.next()}functionei(t){var i;for(i =0; i < t.length;++i) t[i]=ri()}functionni(){}functionoi(){this.i =0,this.j =0,this.S=newArray}functionsi(t){var i, r, e;for(i =0; i <256;++i)this.S[i]= i;for(r =0, i =0; i <256;++i) r = r +this.S[i]+ t[i % t.length]&255, e =this.S[i],this.S[i]=this.S[r],this.S[r]= e;this.i =0,this.j =0}functionui(){var t;returnthis.i =this.i +1&255,this.j =this.j +this.S[this.i]&255, t =this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]= t,this.S[t +this.S[this.i]&255]}functionhi(){returnnewoi}var ai, fi ="undefined"!=typeof navigator;
        fi &&"Microsoft Internet Explorer"== navigator.appName ?(r.prototype.am = o, ai =30): fi &&"Netscape"!= navigator.appName ?(r.prototype.am = n, ai =26):(r.prototype.am = s, ai =28), r.prototype.DB= ai, r.prototype.DM=(1<< ai)-1, r.prototype.DV=1<< ai;
        r.prototype.FV= Math.pow(2,52), r.prototype.F1=52- ai, r.prototype.F2=2* ai -52;var li, ci, pi ="0123456789abcdefghijklmnopqrstuvwxyz", vi =newArray;for(li ="0".charCodeAt(0), ci =0; ci <=9;++ci) vi[li++]= ci;for(li ="a".charCodeAt(0), ci =10; ci <36;++ci) vi[li++]= ci;for(li ="A".charCodeAt(0), ci =10; ci <36;++ci) vi[li++]= ci;
        q.prototype.convert =O, q.prototype.revert =A, q.prototype.reduce =R, q.prototype.mulTo =M, q.prototype.sqrTo =P, k.prototype.convert =V, k.prototype.revert =H, k.prototype.reduce =N, k.prototype.mulTo = z, k.prototype.sqrTo =L, r.prototype.copyTo = a, r.prototype.fromInt = f, r.prototype.fromString = c, r.prototype.clamp = p, r.prototype.dlShiftTo =F, r.prototype.drShiftTo = b, r.prototype.lShiftTo =B, r.prototype.rShiftTo = w, r.prototype.subTo = x, r.prototype.multiplyTo =D, r.prototype.squareTo =S, r.prototype.divRemTo =I, r.prototype.invDigit =C, r.prototype.isEven = j, r.prototype.exp =Z, r.prototype.toString = v, r.prototype.negate = y, r.prototype.abs = m, r.prototype.compareTo = g, r.prototype.bitLength =T, r.prototype.mod =E, r.prototype.modPowInt = _, r.ZERO=l(0), r.ONE=l(1),Ct.prototype.convert = kt,Ct.prototype.revert = kt,Ct.prototype.mulTo = Vt,Ct.prototype.sqrTo = Ht, jt.prototype.convert = Zt, jt.prototype.revert = _t, jt.prototype.reduce = Kt, jt.prototype.mulTo = Xt, jt.prototype.sqrTo = Ut;var yi =[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],
            mi =(1<<26)/ yi[yi.length -1];
        r.prototype.chunkSize =Y, r.prototype.toRadix =Q, r.prototype.fromRadix =W, r.prototype.fromNumber = $, r.prototype.bitwiseTo = nt, r.prototype.changeBit = bt, r.prototype.addTo = Dt, r.prototype.dMultiply = Mt, r.prototype.dAddOffset = Pt, r.prototype.multiplyLowerTo = Lt, r.prototype.multiplyUpperTo = zt, r.prototype.modInt = Jt, r.prototype.millerRabin = $t, r.prototype.clone =K, r.prototype.intValue =U, r.prototype.byteValue =X, r.prototype.shortValue =G, r.prototype.signum =J, r.prototype.toByteArray = tt, r.prototype.equals = it, r.prototype.min = rt, r.prototype.max = et, r.prototype.and = st, r.prototype.or = ht, r.prototype.xor = ft, r.prototype.andNot = ct, r.prototype.not = pt, r.prototype.shiftLeft = vt, r.prototype.shiftRight = yt, r.prototype.getLowestSetBit = gt, r.prototype.bitCount = Tt, r.prototype.testBit = Ft, r.prototype.setBit = Bt, r.prototype.clearBit = wt, r.prototype.flipBit = xt, r.prototype.add = St, r.prototype.subtract = It, r.prototype.multiply = Et, r.prototype.divide = Ot, r.prototype.remainder = At, r.prototype.divideAndRemainder = Rt, r.prototype.modPow = Gt, r.prototype.modInverse = Qt, r.prototype.pow = Nt, r.prototype.gcd = Yt, r.prototype.isProbablePrime = Wt, r.prototype.square = qt, r.prototype.Barrett = jt;var gi, di, Ti;if(null== di){
            di =newArray, Ti =0;var Fi;if("undefined"!=typeof window && window.crypto)if(window.crypto.getRandomValues){var bi =newUint8Array(32);for(window.crypto.getRandomValues(bi), Fi =0; Fi <32;++Fi) di[Ti++]= bi[Fi]}elseif("Netscape"== navigator.appName && navigator.appVersion <"5"){var Bi = window.crypto.random(32);for(Fi =0; Fi < Bi.length;++Fi) di[Ti++]=255& Bi.charCodeAt(Fi)}for(; Ti < wi;) Fi = Math.floor(65536* Math.random()), di[Ti++]= Fi >>>8, di[Ti++]=255& Fi;
            Ti =0,ii()}
        ni.prototype.nextBytes = ei, oi.prototype.init = si, oi.prototype.next = ui;var wi =256;
        i = t.exports ={default: r,BigInteger: r,SecureRandom: ni}}).call(this)},function(t, i, r){"use strict";functione(t, i){for(var r =[], e =~~(i /8), n = i %8, o =0, s = t.length; o < s; o++) r[o]=(t[(o + e)% s]<< n &255)+(t[(o + e +1)% s]>>>8- n &255);return r
    }functionn(t, i){for(var r =[], e = t.length -1; e >=0; e--) r[e]=255&(t[e]^ i[e]);return r
    }functiono(t, i){for(var r =[], e = t.length -1; e >=0; e--) r[e]= t[e]& i[e]&255;return r
    }functions(t, i){for(var r =[], e = t.length -1; e >=0; e--) r[e]=255&(t[e]| i[e]);return r
    }functionu(t, i){for(var r =[], e =0, n = t.length -1; n >=0; n--){var o = t[n]+ i[n]+ e;
            o >255?(e =1, r[n]=255& o):(e =0, r[n]=255& o)}return r
    }functionh(t){for(var i =[], r = t.length -1; r >=0; r--) i[r]=255&~t[r];return i
    }functiona(t){returnn(n(t,e(t,9)),e(t,17))}functionf(t){returnn(n(t,e(t,15)),e(t,23))}functionl(t, i, r, e){return e >=0&& e <=15?n(n(t, i), r):s(s(o(t, i),o(t, r)),o(i, r))}functionc(t, i, r, e){return e >=0&& e <=15?n(n(t, i), r):s(o(t, i),o(h(t), r))}functionp(t, i){for(var r =[], o =[], s =0; s <16; s++){var h =4* s;
            r.push(i.slice(h, h +4))}for(var p =16; p <68; p++) r.push(n(n(f(n(n(r[p -16], r[p -9]),e(r[p -3],15))),e(r[p -13],7)), r[p -6]));for(var v =0; v <64; v++) o.push(n(r[v], r[v +4]));for(var y =[121,204,69,25], m =[122,135,157,138], g = t.slice(0,4), d = t.slice(4,8),T= t.slice(8,12),F= t.slice(12,16), b = t.slice(16,20),B= t.slice(20,24), w = t.slice(24,28), x = t.slice(28,32),D=void0,S=void0,I=void0,E=void0, q =0; q <64; q++){varO= q >=0&& q <=15? y : m;D=e(u(u(e(g,12), b),e(O, q)),7),S=n(D,e(g,12)),I=u(u(u(l(g, d,T, q),F),S), o[q]),E=u(u(u(c(b,B, w, q), x),D), r[q]),F=T,T=e(d,9), d = g, g =I, x = w, w =e(B,19),B= b, b =a(E)}returnn([].concat(g, d,T,F, b,B, w, x), t)}

    t.exports=function(t){var i =8* t.length, r = i %512;
        r = r >=448?512- r %448-1:448- r -1;for(var e =newArray((r -7)/8), n =0, o = e.length; n < o; n++) e[n]=0;var s =[];
        i = i.toString(2);for(var u =7; u >=0; u--)if(i.length >8){var h = i.length -8;
            s[u]=parseInt(i.substr(h),2), i = i.substr(0, h)}else i.length >0?(s[u]=parseInt(i,2), i =""): s[u]=0;for(var a =[].concat(t,[128], e, s), f = a.length /64, l =[115,128,22,111,73,20,178,185,23,36,66,215,218,138,6,0,169,111,48,188,22,49,56,170,227,141,238,77,176,251,14,78], c =0; c < f; c++){var v =64* c;
            l =p(l, a.slice(v, v +64))}return l
    }},function(t, i, r){"use strict";functione(t){if(Array.isArray(t)){for(var i =0, r =Array(t.length); i < t.length; i++) r[i]= t[i];return r
        }return Array.from(t)}functionn(t, i){var r = arguments.length >2&&void0!== arguments[2]? arguments[2]:1;
        t = m.hexToArray(m.utf8ToHex(t)), i = m.getGlobalCurve().decodePointHex(i);var n = m.generateKeyPairHex(), o =newc(n.privateKey,16), s = n.publicKey;
        s.length >128&&(s = s.substr(s.length -128));var u = i.multiply(o), h = m.hexToArray(m.leftPad(u.getX().toBigInteger().toRadix(16),64)),
            a = m.hexToArray(m.leftPad(u.getY().toBigInteger().toRadix(16),64)),
            f = m.arrayToHex(g([].concat(h, t, a))), l =1, p =0, v =[], y =[].concat(h, a),d=function(){
                v =g([].concat(e(y),[l >>24&255, l >>16&255, l >>8&255,255& l])), l++, p =0};d();for(varT=0,F= t.length;T<F;T++) p === v.length &&d(), t[T]^=255& v[p++];var b = m.arrayToHex(t);return r ===B? s + b + f : s + f + b
    }functiono(t, i){var r = arguments.length >2&&void0!== arguments[2]? arguments[2]:1;
        i =newc(i,16);var n = t.substr(128,64), o = t.substr(192);
        r ===B&&(n = t.substr(t.length -64), o = t.substr(128, t.length -128-64));var s = m.hexToArray(o), u = m.getGlobalCurve().decodePointHex("04"+ t.substr(0,128)), h = u.multiply(i),
            a = m.hexToArray(m.leftPad(h.getX().toBigInteger().toRadix(16),64)),
            f = m.hexToArray(m.leftPad(h.getY().toBigInteger().toRadix(16),64)), l =1, p =0, v =[],
            y =[].concat(a, f),d=function(){
                v =g([].concat(e(y),[l >>24&255, l >>16&255, l >>8&255,255& l])), l++, p =0};d();for(varT=0,F= s.length;T<F;T++) p === v.length &&d(), s[T]^=255& v[p++];return m.arrayToHex(g([].concat(a, s, f)))=== n ? m.arrayToUtf8(s):""}functions(t, i){var r = arguments.length >2&&void0!== arguments[2]? arguments[2]:{}, e = r.pointPool, n = r.der,
            o = r.hash, s = r.publicKey, u = r.userId, l ="string"==typeof t ? m.utf8ToHex(t): m.arrayToHex(t);
        o &&(s = s ||a(i), l =h(l, s, u));var p =newc(i,16), y =newc(l,16), g =null, d =null,T=null;do{do{varF=void0;F= e && e.length ? e.pop():f(), g =F.k, d = y.add(F.x1).mod(b)}while(d.equals(c.ZERO)|| d.add(g).equals(b));T= p.add(c.ONE).modInverse(b).multiply(g.subtract(d.multiply(p))).mod(b)}while(T.equals(c.ZERO));return n ?v(d,T): m.leftPad(d.toString(16),64)+ m.leftPad(T.toString(16),64)}functionu(t, i, r){var e = arguments.length >3&&void0!== arguments[3]? arguments[3]:{}, n = e.der, o = e.hash,
            s = e.userId, u ="string"==typeof t ? m.utf8ToHex(t): m.arrayToHex(t);
        o &&(u =h(u, r, s));var a =void0, f =void0;if(n){var l =y(i);
            a = l.r, f = l.s
        }else a =newc(i.substring(0,64),16), f =newc(i.substring(64),16);var p =F.decodePointHex(r), v =newc(u,16), g = a.add(f).mod(b);if(g.equals(c.ZERO))return!1;var d =T.multiply(f).add(p.multiply(g)),B= v.add(d.getX().toBigInteger()).mod(b);return a.equals(B)}functionh(t, i){var r = arguments.length >2&&void0!== arguments[2]? arguments[2]:"1234567812345678";
        r = m.utf8ToHex(r);var e = m.leftPad(T.curve.a.toBigInteger().toRadix(16),64),
            n = m.leftPad(T.curve.b.toBigInteger().toRadix(16),64),
            o = m.leftPad(T.getX().toBigInteger().toRadix(16),64),
            s = m.leftPad(T.getY().toBigInteger().toRadix(16),64);
        i.length >128&&(i = i.substr(2,128));var u = i.substr(0,64), h = i.substr(64,64), a = m.hexToArray(r + e + n + o + s + u + h), f =4* r.length;
        a.unshift(255& f), a.unshift(f >>8&255);var l =g(a);return m.arrayToHex(g(l.concat(m.hexToArray(t))))}functiona(t){var i =T.multiply(newc(t,16));return"04"+ m.leftPad(i.getX().toBigInteger().toString(16),64)+ m.leftPad(i.getY().toBigInteger().toString(16),64)}functionf(){var t = m.generateKeyPairHex(), i =F.decodePointHex(t.publicKey);return t.k =newc(t.privateKey,16), t.x1 = i.getX().toBigInteger(), t
    }var l =r(0), c = l.BigInteger, p =r(3), v = p.encodeDer, y = p.decodeDer, m =r(4), g =r(1),
        d = m.generateEcparam(),T= d.G,F= d.curve, b = d.n,B=0;
    t.exports ={generateKeyPairHex: m.generateKeyPairHex,doEncrypt: n,doDecrypt: o,doSignature: s,doVerifySignature: u,getPoint: f
    }},function(t, i, r){"use strict";functione(t, i){if(!t)thrownewReferenceError("this hasn't been initialised - super() hasn't been called");return!i ||"object"!=typeof i &&"function"!=typeof i ? t : i
    }functionn(t, i){if("function"!=typeof i &&null!== i)thrownewTypeError("Super expression must either be null or a function, not "+typeof i);
        t.prototype = Object.create(i && i.prototype,{constructor:{value: t,enumerable:!1,writable:!0,configurable:!0}}), i &&(Object.setPrototypeOf ? Object.setPrototypeOf(t, i): t.__proto__ = i)}functiono(t, i){if(!(t instanceofi))thrownewTypeError("Cannot call a class as a function")}functions(t){var i = t.toString(16);if("-"!== i[0]) i.length %2==1? i ="0"+ i : i.match(/^[0-7]/)||(i ="00"+ i);else{
            i = i.substr(1);var r = i.length;
            r %2==1? r +=1: i.match(/^[0-7]/)||(r +=2);for(var e ="", n =0; n < r; n++) e +="f";
            e =newc(e,16), i = e.xor(t).add(c.ONE), i = i.toString(16).replace(/^-/,"")}return i
    }functionu(t, i){return+t[i +2]<8?1:128&+t.substr(i +2,2)}functionh(t, i){var r =u(t, i), e = t.substr(i +2,2* r);return e ?(+e[0]<8?newc(e,16):newc(e.substr(2),16)).intValue():-1}functiona(t, i){return i +2*(u(t, i)+1)}varf=function(){functiont(t, i){for(var r =0; r < i.length; r++){var e = i[r];
                e.enumerable = e.enumerable ||!1, e.configurable =!0,"value"in e &&(e.writable =!0), Object.defineProperty(t, e.key, e)}}returnfunction(i, r, e){return r &&t(i.prototype, r), e &&t(i, e), i
        }}(), l =r(0), c = l.BigInteger,p=function(){functiont(){o(this, t),this.tlv =null,this.t ="00",this.l ="00",this.v =""}returnf(t,[{key:"getEncodedHex",value:function(){returnthis.tlv ||(this.v =this.getValue(),this.l =this.getLength(),this.tlv =this.t +this.l +this.v),this.tlv
            }},{key:"getLength",value:function(){var t =this.v.length /2, i = t.toString(16);return i.length %2==1&&(i ="0"+ i), t <128? i :(128+ i.length /2).toString(16)+ i
            }},{key:"getValue",value:function(){return""}}]), t
    }(),v=function(t){functioni(t){o(this, i);var r =e(this,(i.__proto__ || Object.getPrototypeOf(i)).call(this));return r.t ="02", t &&(r.v =s(t)), r
        }returnn(i, t),f(i,[{key:"getValue",value:function(){returnthis.v
            }}]), i
    }(p),y=function(t){functioni(t){o(this, i);var r =e(this,(i.__proto__ || Object.getPrototypeOf(i)).call(this));return r.t ="30", r.asn1Array = t, r
        }returnn(i, t),f(i,[{key:"getValue",value:function(){returnthis.v =this.asn1Array.map(function(t){return t.getEncodedHex()}).join(""),this.v
            }}]), i
    }(p);
    t.exports ={encodeDer:function(t, i){var r =newv(t), e =newv(i);returnnewy([r, e]).getEncodedHex()},decodeDer:function(t){var i =a(t,0), r =a(t, i), e =h(t, i), n = t.substr(r,2* e), o = r + n.length, s =a(t, o),
                u =h(t, o), f = t.substr(s,2* u);return{r:newc(n,16),s:newc(f,16)}}}},function(t, i, r){"use strict";functione(){return d
    }functionn(){var t =newc("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",16),
            i =newc("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",16),
            r =newc("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",16), e =newy(t, i, r);return{curve: e,G: e.decodePointHex("0432C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"),n:newc("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",16)}}functiono(){var t =newc(F.bitLength(), m).mod(F.subtract(c.ONE)).add(c.ONE), i =u(t.toString(16),64), r =T.multiply(t);return{privateKey: i,publicKey:"04"+u(r.getX().toBigInteger().toString(16),64)+u(r.getY().toBigInteger().toString(16),64)}}functions(t){
        t =unescape(encodeURIComponent(t));for(var i = t.length, r =[], e =0; e < i; e++) r[e >>>2]|=(255& t.charCodeAt(e))<<24- e %4*8;for(var n =[], o =0; o < i; o++){var s = r[o >>>2]>>>24- o %4*8&255;
            n.push((s >>>4).toString(16)), n.push((15& s).toString(16))}return n.join("")}functionu(t, i){return t.length >= i ? t :newArray(i - t.length +1).join("0")+ t
    }functionh(t){return t.map(function(t){return t = t.toString(16),1=== t.length ?"0"+ t : t
        }).join("")}functiona(t){for(var i =[], r =0, e =0; e <2* t.length; e +=2) i[e >>>3]|=parseInt(t[r],10)<<24- e %8*4, r++;try{for(var n =[], o =0; o < t.length; o++){var s = i[o >>>2]>>>24- o %4*8&255;
                n.push(String.fromCharCode(s))}returndecodeURIComponent(escape(n.join("")))}catch(t){thrownewError("Malformed UTF-8 data")}}functionf(t){var i =[], r = t.length;
        r %2!=0&&(t =u(t, r +1)), r = t.length;for(var e =0; e < r; e +=2) i.push(parseInt(t.substr(e,2),16));return i
    }var l =r(0), c = l.BigInteger, p = l.SecureRandom, v =r(5), y = v.ECCurveFp, m =newp, g =n(), d = g.curve,T= g.G,F= g.n;
    t.exports ={getGlobalCurve: e,generateEcparam: n,generateKeyPairHex: o,utf8ToHex: s,leftPad: u,arrayToHex: h,arrayToUtf8: a,hexToArray: f
    }},function(t, i, r){"use strict";functione(t, i){if(!(t instanceofi))thrownewTypeError("Cannot call a class as a function")}varn=function(){functiont(t, i){for(var r =0; r < i.length; r++){var e = i[r];
                e.enumerable = e.enumerable ||!1, e.configurable =!0,"value"in e &&(e.writable =!0), Object.defineProperty(t, e.key, e)}}returnfunction(i, r, e){return r &&t(i.prototype, r), e &&t(i, e), i
        }}(), o =r(0), s = o.BigInteger, u =news("3"),h=function(){functiont(i, r){e(this, t),this.x = r,this.q = i
        }returnn(t,[{key:"equals",value:function(t){return t ===this||this.q.equals(t.q)&&this.x.equals(t.x)}},{key:"toBigInteger",value:function(){returnthis.x
            }},{key:"negate",value:function(){returnnewt(this.q,this.x.negate().mod(this.q))}},{key:"add",value:function(i){returnnewt(this.q,this.x.add(i.toBigInteger()).mod(this.q))}},{key:"subtract",value:function(i){returnnewt(this.q,this.x.subtract(i.toBigInteger()).mod(this.q))}},{key:"multiply",value:function(i){returnnewt(this.q,this.x.multiply(i.toBigInteger()).mod(this.q))}},{key:"divide",value:function(i){returnnewt(this.q,this.x.multiply(i.toBigInteger().modInverse(this.q)).mod(this.q))}},{key:"square",value:function(){returnnewt(this.q,this.x.square().mod(this.q))}}]), t
    }(),a=function(){functiont(i, r, n, o){e(this, t),this.curve = i,this.x = r,this.y = n,this.z =null== o ? s.ONE: o,this.zinv =null}returnn(t,[{key:"getX",value:function(){returnnull===this.zinv &&(this.zinv =this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}},{key:"getY",value:function(){returnnull===this.zinv &&(this.zinv =this.z.modInverse(this.curve.q)),this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}},{key:"equals",value:function(t){return t ===this||(this.isInfinity()? t.isInfinity(): t.isInfinity()?this.isInfinity():!!t.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(s.ZERO)&& t.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(t.z)).mod(this.curve.q).equals(s.ZERO))}},{key:"isInfinity",value:function(){returnnull===this.x &&null===this.y ||this.z.equals(s.ZERO)&&!this.y.toBigInteger().equals(s.ZERO)}},{key:"negate",value:function(){returnnewt(this.curve,this.x,this.y.negate(),this.z)}},{key:"add",value:function(i){if(this.isInfinity())return i;if(i.isInfinity())returnthis;var r =this.x.toBigInteger(), e =this.y.toBigInteger(), n =this.z, o = i.x.toBigInteger(),
                    u = i.y.toBigInteger(), h = i.z, a =this.curve.q, f = r.multiply(h).mod(a),
                    l = o.multiply(n).mod(a), c = f.subtract(l), p = e.multiply(h).mod(a), v = u.multiply(n).mod(a),
                    y = p.subtract(v);if(s.ZERO.equals(c))return s.ZERO.equals(y)?this.twice():this.curve.infinity;var m = f.add(l), g = n.multiply(h).mod(a), d = c.square().mod(a),T= c.multiply(d).mod(a),F= g.multiply(y.square()).subtract(m.multiply(d)).mod(a), b = c.multiply(F).mod(a),B= y.multiply(d.multiply(f).subtract(F)).subtract(p.multiply(T)).mod(a), w =T.multiply(g).mod(a);returnnewt(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(B), w)}},{key:"twice",value:function(){if(this.isInfinity())returnthis;if(!this.y.toBigInteger().signum())returnthis.curve.infinity;var i =this.x.toBigInteger(), r =this.y.toBigInteger(), e =this.z, n =this.curve.q,
                    o =this.curve.a.toBigInteger(), s = i.square().multiply(u).add(o.multiply(e.square())).mod(n),
                    h = r.shiftLeft(1).multiply(e).mod(n), a = r.square().mod(n), f = a.multiply(i).multiply(e).mod(n),
                    l = h.square().mod(n), c = s.square().subtract(f.shiftLeft(3)).mod(n), p = h.multiply(c).mod(n),
                    v = s.multiply(f.shiftLeft(2).subtract(c)).subtract(l.shiftLeft(1).multiply(a)).mod(n),
                    y = h.multiply(l).mod(n);returnnewt(this.curve,this.curve.fromBigInteger(p),this.curve.fromBigInteger(v), y)}},{key:"multiply",value:function(t){if(this.isInfinity())returnthis;if(!t.signum())returnthis.curve.infinity;for(var i = t.multiply(u), r =this.negate(), e =this, n = i.bitLength()-2; n >0; n--){
                    e = e.twice();var o = i.testBit(n);
                    o !== t.testBit(n)&&(e = e.add(o ?this: r))}return e
            }}]), t
    }(),f=function(){functiont(i, r, n){e(this, t),this.q = i,this.a =this.fromBigInteger(r),this.b =this.fromBigInteger(n),this.infinity =newa(this,null,null)}returnn(t,[{key:"equals",value:function(t){return t ===this||this.q.equals(t.q)&&this.a.equals(t.a)&&this.b.equals(t.b)}},{key:"fromBigInteger",value:function(t){returnnewh(this.q, t)}},{key:"decodePointHex",value:function(t){switch(parseInt(t.substr(0,2),16)){case0:returnthis.infinity;case2:case3:returnnull;case4:case6:case7:var i =(t.length -2)/2, r = t.substr(2, i), e = t.substr(i +2, i);returnnewa(this,this.fromBigInteger(news(r,16)),this.fromBigInteger(news(e,16)));default:returnnull}}}]), t
    }();
    t.exports ={ECPointFp: a,ECCurveFp: f}}]);

实现步骤

<script src='sm2.js'></script>
//sm2加密var doEncrypt ='04'+ sm2.doEncrypt(Tools.json2str(params), publicKey,0);
console.log("加密后数据:", doEncrypt );var doDecrypt = sm2.doDecrypt(jsonData.dataHex.substr(2), Global.SM2_PRIVAREKEY,0);
console.log("解密后数据:", doDecrypt);

java

packagecom.kayak.mtl.util;importcn.hutool.core.util.HexUtil;importcn.hutool.crypto.BCUtil;importcn.hutool.crypto.SmUtil;importcn.hutool.crypto.asymmetric.SM2;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importcom.kayak.web.base.exception.KPromptException;importcom.kayak.web.base.system.Global;importorg.apache.commons.lang.StringUtils;importorg.apache.log4j.Logger;importorg.bouncycastle.asn1.gm.GMNamedCurves;importorg.bouncycastle.asn1.x9.X9ECParameters;importorg.bouncycastle.crypto.AsymmetricCipherKeyPair;importorg.bouncycastle.crypto.InvalidCipherTextException;importorg.bouncycastle.crypto.engines.SM2Engine;importorg.bouncycastle.crypto.generators.ECKeyPairGenerator;importorg.bouncycastle.crypto.params.ECDomainParameters;importorg.bouncycastle.crypto.params.ECKeyGenerationParameters;importorg.bouncycastle.crypto.params.ECPrivateKeyParameters;importorg.bouncycastle.crypto.params.ECPublicKeyParameters;importorg.bouncycastle.crypto.signers.PlainDSAEncoding;importorg.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;importorg.bouncycastle.math.ec.ECPoint;importorg.bouncycastle.util.encoders.Hex;importjava.math.BigInteger;importjava.nio.charset.StandardCharsets;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.util.Base64;importjava.util.Map;/**
 * SM2工具类
 */publicclassSM2Utils{privatestaticLogger log =Logger.getLogger(SM2Utils.class);/**
     * 验密验签逻辑
     *
     * @param parameters
     * @return
     * @throws KPromptException
     */publicstaticMapsm2Md5Check(Map parameters)throwsKPromptException{try{// 验密验签// 默认验签失败boolean verify =false;// sm2加签信息String md5 =(String) parameters.get("sign");// sm2加密信息String cipherData =(String) parameters.get("dataHex");// 获取md5盐String md5Slat =Global.getGlobalConf("Global.md5_slat");// 获取时间戳String timestamp =(String) parameters.get("timestamp");// 加密私钥String privateKey =Global.getGlobalConf("Global.PRIVATE_KEY");//判断加签信息是否为空,不为空则验签!if(!StringUtils.isEmpty(md5)&&!StringUtils.isEmpty(cipherData)&&!StringUtils.isEmpty(md5Slat)&&!StringUtils.isEmpty(timestamp)){//校验时间戳(毫秒)long limit =System.currentTimeMillis()-Long.parseLong(timestamp);if(limit >2000){thrownewKPromptException("验签失败,无效的时间戳!");}// 解密  备注:解密后明文数据String requestParam =SM2SecrityUtils.decrypt(privateKey, cipherData);
                log.info("解密后的明文数据:"+ requestParam);//md5验签String chkMd5 =Md5Utils.md5Secret(requestParam, md5Slat);
                log.info("md5验签: "+ chkMd5);
                log.info("md5加签: "+ md5);if(!StringUtils.isEmpty(chkMd5)&&StringUtils.equals(md5, chkMd5)){// 校验通过
                    verify =true;// 解密后将json串转为map替换params参数;
                    parameters = JSON.parseObject(requestParam,Map.class);}// 验签失败if(!verify){thrownewKPromptException("验签失败!");}}}catch(KPromptException e){thrownewKPromptException(e.getMessage());}catch(Exception e){thrownewKPromptException("验密验签流程处理失败!");}return parameters;}/**
     * 加密加签
     *
     * @return 加密加签后结果数据
     */publicstaticMapsm2Md5Sign(Map parameters,Map respMap)throwsKPromptException{// 获取md5盐String md5Slat =Global.getGlobalConf("Global.md5_slat");// 加密公钥String publicKey =Global.getGlobalConf("Global.SM2_PUBLIC_KEY");if(md5Slat.isEmpty()|| publicKey.isEmpty()){thrownewKPromptException("加密加签参数信息获取失败!");}// 请求参数String data =JSONObject.toJSONString(parameters);
        log.info("请求参数:"+ data);// 加签if(!StringUtils.isEmpty(data)){// md5加签String signVal =Md5Utils.md5Secret(data, md5Slat);
            respMap.put("sign", signVal);
            log.info("md5加签:"+ signVal);}String encrypt ="";// 加密if(!StringUtils.isEmpty(publicKey)&&!StringUtils.isEmpty(data)){
            encrypt =SM2SecrityUtils.encrypt(publicKey, data);
            respMap.put("dataHex", encrypt);
            log.info("sm2加密串:"+ encrypt);}// 时间戳
        respMap.put("timestamp",String.valueOf(System.currentTimeMillis()));return respMap;}/**
     * sm2 解密 (前端js实现加密,后台Java实现解密)
     *
     * @param cipherData 加密数据
     * @param privateKey 解密私钥
     * @return 解密后的结果数据
     */publicstaticStringsm2Decrypt(String cipherData,String privateKey)throwsKPromptException{//processBlock得到Base64格式,记得解码byte[] arrayOfBytes =newbyte[0];try{byte[] cipherDataByte =Hex.decode(cipherData);//刚才的私钥Hex,先还原私钥BigInteger privateKeyD =newBigInteger(privateKey,16);X9ECParameters sm2ECParameters =GMNamedCurves.getByName("sm2p256v1");ECDomainParameters domainParameters =newECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECPrivateKeyParameters privateKeyParameters =newECPrivateKeyParameters(privateKeyD, domainParameters);//用私钥解密SM2Engine sm2Engine =newSM2Engine();
            sm2Engine.init(false, privateKeyParameters);try{
                arrayOfBytes =Base64.getDecoder().decode(sm2Engine.processBlock(cipherDataByte,0, cipherDataByte.length));}catch(InvalidCipherTextException e){
                e.printStackTrace();}//得到明文:SM2 Encryption TestString data =newString(arrayOfBytes);
            log.info("解密后明文数据:"+ data);}catch(Exception e){thrownewKPromptException("sm2解密失败!");}returnnewString(arrayOfBytes);}/**
     * sm2 加签
     */publicstaticStringsignSm2Key(String privateKey,String text){//需要加密的明文,得到明文对应的字节数组byte[] dataBytes = text.getBytes();//创建sm2 对象ECPrivateKeyParameters privateKeyParameters =BCUtil.toSm2Params(privateKey);//创建sm2 对象SM2 sm2 =newSM2(privateKeyParameters,null);//这里需要手动设置,sm2 对象的默认值与我们期望的不一致 , 使用明文编码
        sm2.usePlainEncoding();
        sm2.setMode(SM2Engine.Mode.C1C2C3);byte[] sign = sm2.sign(dataBytes,null);
        log.debug("data: "+HexUtil.encodeHexStr(dataBytes));
        log.debug("sign: "+HexUtil.encodeHexStr(sign));returnHexUtil.encodeHexStr(sign);}/**
     * sm2 验签
     *
     * @param publicKeyHex 验签公钥
     * @param data         明文数据
     * @param signHex      加签数据
     * @return 验签结果
     */publicstaticbooleanverify(String publicKeyHex,String data,String signHex)throwsKPromptException{boolean verify =false;try{//这里需要根据公钥的长度进行加工if(publicKeyHex.length()==130){//这里需要去掉开始第一个字节 第一个字节表示标记
                publicKeyHex = publicKeyHex.substring(2);}String xhex = publicKeyHex.substring(0,64);String yhex = publicKeyHex.substring(64,128);ECPublicKeyParameters ecPublicKeyParameters =BCUtil.toSm2Params(xhex, yhex);//创建sm2 对象SM2 sm2 =newSM2(null, ecPublicKeyParameters);//这里需要手动设置,sm2 对象的默认值与我们期望的不一致 , 使用明文编码
            sm2.usePlainEncoding();
            sm2.setMode(SM2Engine.Mode.C1C2C3);// 非标准模式
            verify = sm2.verify(data.getBytes(),HexUtil.decodeHex(signHex));
            log.info("sm2验签结果: "+ verify);}catch(Exception e){thrownewKPromptException("sm2验签失败!");}return verify;}/**
     * SM2加密解密生成公钥私钥 测试方法
     *
     * @return
     * @throws NoSuchAlgorithmException
     */publicvoidsm2Encode()throwsNoSuchAlgorithmException{X9ECParameters sm2ECParameters =GMNamedCurves.getByName("sm2p256v1");ECDomainParameters domainParameters =newECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECKeyPairGenerator keyPairGenerator =newECKeyPairGenerator();
        keyPairGenerator.init(newECKeyGenerationParameters(domainParameters,SecureRandom.getInstance("SHA1PRNG")));AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();//上面的代码都是直接用maven依赖中的包直接import就可以用了//还有一些更底层的写法,可以自己搜索一下,图方便的这个挺好的//私钥,16进制格式,自己保存BigInteger privatekey =((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();String privateKeyHex = privatekey.toString(16);System.out.println("private Key :"+ privateKeyHex);//公钥,16进制格式,发给前端ECPoint ecPoint =((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();String publicKeyHex =Hex.toHexString(ecPoint.getEncoded(false));System.out.println("Public Key :"+ publicKeyHex);}/**
     * sm2 加签验签生成公钥私钥并测试 测试方法
     */publicstaticvoidcreateSm2Key(){//需要加密的明文String text ="{\"api\":\"TG00902\", \"method\":\"post\", \"query_begin_line\":0, \"query_num\":10, \"SYSTEM_MENUNAME\":\"产品信息设置\"}";//创建sm2 对象SM2 sm2 =SmUtil.sm2();//这里会自动生成对应的随机秘钥对 , 注意! 这里一定要强转,才能得到对应有效的秘钥信息byte[] privateKey =BCUtil.encodeECPrivateKey(sm2.getPrivateKey());//这里公钥不压缩  公钥的第一个字节用于表示是否压缩  可以不要byte[] publicKey =((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false);//这里得到的 压缩后的公钥   ((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(true);byte[] publicKeyEc =BCUtil.encodeECPublicKey(sm2.getPublicKey());//打印当前的公私秘钥System.out.println("私钥: "+HexUtil.encodeHexStr(privateKey));System.out.println("公钥: "+HexUtil.encodeHexStr(publicKey));//得到明文对应的字节数组byte[] dateBytes = text.getBytes();System.out.println("数据: "+HexUtil.encodeHexStr(dateBytes));//这里需要手动设置,sm2 对象的默认值与我们期望的不一致
        sm2.setMode(SM2Engine.Mode.C1C2C3);
        sm2.setEncoding(newPlainDSAEncoding());//计算签名byte[] sign = sm2.sign(dateBytes,null);System.out.println("签名: "+HexUtil.encodeHexStr(sign));// 校验  验签boolean verify = sm2.verify(dateBytes, sign);System.out.println(verify);}/**
     * 指定私钥签名测试
     */publicstaticStringsign(String privateKeyHex,String data){//指定的私钥//        String privateKeyHex = "3a6e3fe10746cc790f57fbfb09e99979f18eb28a100b786af007b6f2e214ca42";//需要加密的明文,得到明文对应的字节数组//        byte[] dataBytes = "我是一段测试".getBytes();ECPrivateKeyParameters privateKeyParameters =BCUtil.toSm2Params(privateKeyHex);//创建sm2 对象SM2 sm2 =newSM2(privateKeyParameters,null);//这里需要手动设置,sm2 对象的默认值与我们期望的不一致 , 使用明文编码
        sm2.usePlainEncoding();
        sm2.setMode(SM2Engine.Mode.C1C2C3);byte[] sign = sm2.sign(data.getBytes(),null);System.out.println("data: "+HexUtil.encodeHexStr(data.getBytes(StandardCharsets.UTF_8)));System.out.println("sign: "+HexUtil.encodeHexStr(sign));returnHexUtil.encodeHexStr(sign);}/**
     * 指定私钥签名测试
     */publicstaticStringsignPoint(){//指定的私钥String privateKeyHex ="3a6e3fe10746cc790f57fbfb09e99979f18eb28a100b786af007b6f2e214ca42";//需要加密的明文,得到明文对应的字节数组byte[] dataBytes ="{\"api\":\"TG00902\", \"method\":\"post\", \"query_begin_line\":0, \"query_num\":10, \"SYSTEM_MENUNAME\":\"产品信息设置\"}".getBytes();ECPrivateKeyParameters privateKeyParameters =BCUtil.toSm2Params(privateKeyHex);//创建sm2 对象SM2 sm2 =newSM2(privateKeyParameters,null);//这里需要手动设置,sm2 对象的默认值与我们期望的不一致 , 使用明文编码
        sm2.usePlainEncoding();
        sm2.setMode(SM2Engine.Mode.C1C2C3);byte[] sign = sm2.sign(dataBytes,null);System.out.println("data: "+HexUtil.encodeHexStr(dataBytes));System.out.println("sign: "+HexUtil.encodeHexStr(sign));returnHexUtil.encodeHexStr(sign);}/**
     * 指定私钥签名测试
     */publicstaticbooleanverify(){//指定的公钥String publicKeyHex ="0441ac04936f79acae69acad19129fb63c7e7fddde4ef63a6a3d0d6f76789b3b852fa5fefd2865ae815ab1857a8a25ba359a76b1786214eef630bdb8f534ed72d9";//需要加密的明文,得到明文对应的字节数组byte[] dataBytes ="{\"api\":\"TG00902\", \"method\":\"post\", \"query_begin_line\":0, \"query_num\":10, \"SYSTEM_MENUNAME\":\"产品信息设置\"}".getBytes();//签名值String signHex ="3770fd555d468a8db2ff642a32be1af56131a243128c9605e72fe6d4076bff5bdd68d580549b1ce0a373851771204f03ebfe3fef62c447c93d3ad9adb1b20e65";//这里需要根据公钥的长度进行加工if(publicKeyHex.length()==130){//这里需要去掉开始第一个字节 第一个字节表示标记
            publicKeyHex = publicKeyHex.substring(2);}String xhex = publicKeyHex.substring(0,64);String yhex = publicKeyHex.substring(64,128);ECPublicKeyParameters ecPublicKeyParameters =BCUtil.toSm2Params(xhex, yhex);//创建sm2 对象SM2 sm2 =newSM2(null, ecPublicKeyParameters);//这里需要手动设置,sm2 对象的默认值与我们期望的不一致 , 使用明文编码
        sm2.usePlainEncoding();
        sm2.setMode(SM2Engine.Mode.C1C2C3);boolean verify = sm2.verify(dataBytes,HexUtil.decodeHex(signHex));
        log.info("数据: "+HexUtil.encodeHexStr(dataBytes));
        log.info("验签结果: "+ verify);return verify;}publicstaticvoidmain(String[] args)throwsKPromptException{//        String publicKey = "041e1d82205d07b46767cbefe79039b3252a32744fe4f14284d76c3d32a0fea28dbf9dcfa489271a85811bd4ddadd77486e3a6a371749dc4a7e3bb3d0f53f02c82"   ;//        String content = "{\"api\":\"TG00902\", \"method\":\"post\", \"query_begin_line\":0, \"query_num\":10, \"SYSTEM_MENUNAME\":\"产品信息设置\"}";//        String sign = "d8b0b5d965a45d30de5eb1cdd6ba0132a0cc4e2dbf41b97e9083210222c8cdc4987dd0c5ac71cf86121a4e4f2bfb80c0a50bde5e2abd5d8214492a7bb27a1390";//        boolean verifySign = verify(publicKey, Hex.toHexString(content.getBytes()), sign);//        System.out.println(verifySign);//        createSm2Key();//        signPoint();////        verify();//        String publicKey = "0441ac04936f79acae69acad19129fb63c7e7fddde4ef63a6a3d0d6f76789b3b852fa5fefd2865ae815ab1857a8a25ba359a76b1786214eef630bdb8f534ed72d9";//        String privateKey = "3a6e3fe10746cc790f57fbfb09e99979f18eb28a100b786af007b6f2e214ca42";//        String content = "{\"api\":\"TG00902\", \"method\":\"post\", \"query_begin_line\":0, \"query_num\":10, \"SYSTEM_MENUNAME\":\"产品信息设置\"}";//        String publicKey = "0441ac04936f79acae69acad19129fb63c7e7fddde4ef63a6a3d0d6f76789b3b852fa5fefd2865ae815ab1857a8a25ba359a76b1786214eef630bdb8f534ed72d9";//        String privateKey =  "3a6e3fe10746cc790f57fbfb09e99979f18eb28a100b786af007b6f2e214ca42";//        String content = "{\"api\":\"TG00927\", \"method\":\"post\"}";////////        String sign = signSm2Key(privateKey, content);//        log.info("sign:>>" + sign);//        Boolean verify = verify(publicKey, content, sign);//        System.out.println(verify);}}
packagecom.kayak.mtl.util;importcom.kayak.web.base.exception.KPromptException;importorg.bouncycastle.asn1.gm.GMNamedCurves;importorg.bouncycastle.asn1.x9.X9ECParameters;importorg.bouncycastle.crypto.InvalidCipherTextException;importorg.bouncycastle.crypto.engines.SM2Engine;importorg.bouncycastle.crypto.params.ECDomainParameters;importorg.bouncycastle.crypto.params.ECPrivateKeyParameters;importorg.bouncycastle.crypto.params.ECPublicKeyParameters;importorg.bouncycastle.crypto.params.ParametersWithRandom;importorg.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;importorg.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.jce.spec.ECParameterSpec;importorg.bouncycastle.jce.spec.ECPrivateKeySpec;importorg.bouncycastle.jce.spec.ECPublicKeySpec;importorg.bouncycastle.util.encoders.Hex;importjava.math.BigInteger;importjava.security.*;importjava.security.spec.ECGenParameterSpec;importjava.util.Base64;/**
 * @ClassName SM2Utils
 * @Description SM2算法工具类 Java写法
 * @Author sx
 * @Date 2021/9/24 16:50
 * @Version 1.0
 */publicclassSM2SecrityUtils{/**
     * @return KeyPair
     * @Description 生成秘钥对
     * @Author msx
     */publicstaticKeyPaircreateECKeyPair(){//使用标准名称创建EC参数生成的参数规范finalECGenParameterSpec sm2Spec =newECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器finalKeyPairGenerator kpg;try{
            kpg =KeyPairGenerator.getInstance("EC",newBouncyCastleProvider());// 使用SM2算法域参数集初始化密钥生成器(默认使用以最高优先级安装的提供者的 SecureRandom 的实现作为随机源)// kpg.initialize(sm2Spec);// 使用SM2的算法域参数集和指定的随机源初始化密钥生成器
            kpg.initialize(sm2Spec,newSecureRandom());// 通过密钥生成器生成密钥对return kpg.generateKeyPair();}catch(Exception e){
            e.printStackTrace();returnnull;}}/**
     * @param publicKeyHex SM2十六进制公钥
     * @param data         明文数据
     * @return String
     * @Description 公钥加密
     * @Author msx
     */publicstaticStringencrypt(String publicKeyHex,String data){returnencrypt(getECPublicKeyByPublicKeyHex(publicKeyHex), data,0);}publicstaticStringencrypt02(String publicKeyHex,String data){returnencrypt02(getECPublicKeyByPublicKeyHex(publicKeyHex), data,0);}/**
     * @param publicKey SM2公钥
     * @param data      明文数据
     * @param modeType  加密模式
     * @return String
     * @Description 公钥加密
     * @Author msx
     */publicstaticStringencrypt(BCECPublicKey publicKey,String data,int modeType){//加密模式SM2Engine.Mode mode =SM2Engine.Mode.C1C3C2;if(modeType !=1){
            mode =SM2Engine.Mode.C1C2C3;}//通过公钥对象获取公钥的基本域参数。ECParameterSpec ecParameterSpec = publicKey.getParameters();ECDomainParameters ecDomainParameters =newECDomainParameters(ecParameterSpec.getCurve(),
                ecParameterSpec.getG(), ecParameterSpec.getN());//通过公钥值和公钥基本参数创建公钥参数对象ECPublicKeyParameters ecPublicKeyParameters =newECPublicKeyParameters(publicKey.getQ(), ecDomainParameters);//根据加密模式实例化SM2公钥加密引擎SM2Engine sm2Engine =newSM2Engine(mode);//初始化加密引擎
        sm2Engine.init(true,newParametersWithRandom(ecPublicKeyParameters,newSecureRandom()));byte[] arrayOfBytes =null;try{//将明文字符串转换为指定编码的字节串byte[] in = data.getBytes("utf-8");//通过加密引擎对字节数串行加密
            arrayOfBytes = sm2Engine.processBlock(in,0, in.length);}catch(Exception e){System.out.println("SM2加密时出现异常:"+ e.getMessage());
            e.printStackTrace();}//将加密后的字节串转换为十六进制字符串returnHex.toHexString(arrayOfBytes);}/**
     * @param publicKey SM2公钥
     * @param data      明文数据
     * @param modeType  加密模式
     * @return String
     * @Description 公钥加密
     * @Author msx
     */publicstaticStringencrypt02(BCECPublicKey publicKey,String data,int modeType){//加密模式SM2Engine.Mode mode =SM2Engine.Mode.C1C3C2;if(modeType !=1){
            mode =SM2Engine.Mode.C1C2C3;}//通过公钥对象获取公钥的基本域参数。ECParameterSpec ecParameterSpec = publicKey.getParameters();ECDomainParameters ecDomainParameters =newECDomainParameters(ecParameterSpec.getCurve(),
                ecParameterSpec.getG(), ecParameterSpec.getN());//通过公钥值和公钥基本参数创建公钥参数对象ECPublicKeyParameters ecPublicKeyParameters =newECPublicKeyParameters(publicKey.getQ(), ecDomainParameters);//根据加密模式实例化SM2公钥加密引擎SM2Engine sm2Engine =newSM2Engine(mode);//初始化加密引擎
        sm2Engine.init(true,newParametersWithRandom(ecPublicKeyParameters,newSecureRandom()));byte[] arrayOfBytes =null;try{//将明文字符串转换为指定编码的字节串byte[] in = data.getBytes("utf-8");//通过加密引擎对字节数串行加密
            arrayOfBytes = sm2Engine.processBlock(in,0, in.length);}catch(Exception e){System.out.println("SM2加密时出现异常:"+ e.getMessage());
            e.printStackTrace();}//将加密后的字节串转换为十六进制字符串returnHex.toHexString(arrayOfBytes);}/**
     * @param privateKeyHex SM2十六进制私钥
     * @param cipherData    密文数据
     * @return String
     * @Description 私钥解密
     * @Author msx
     */publicstaticStringdecrypt(String privateKeyHex,String cipherData)throwsKPromptException{returndecrypt(getBCECPrivateKeyByPrivateKeyHex(privateKeyHex), cipherData,0);//        return sm2Decrypt(cipherData,getBCECPrivateKeyByPrivateKeyHex(privateKeyHex),0);//        return sm2Decrypt02(cipherData, privateKeyHex);}publicstaticStringdecrypt02(String privateKeyHex,String cipherData){returndecrypt02(getBCECPrivateKeyByPrivateKeyHex(privateKeyHex), cipherData,0);}/**
     * @param privateKey SM私钥
     * @param cipherData 密文数据
     * @param modeType   解密模式
     * @return
     * @Description 私钥解密
     * @Author msx
     */publicstaticStringdecrypt(BCECPrivateKey privateKey,String cipherData,int modeType){//解密模式SM2Engine.Mode mode =SM2Engine.Mode.C1C3C2;if(modeType !=1)
            mode =SM2Engine.Mode.C1C2C3;//将十六进制字符串密文转换为字节数组(需要与加密一致,加密是:加密后的字节数组转换为了十六进制字符串)byte[] cipherDataByte =Hex.decode(cipherData);//通过私钥对象获取私钥的基本域参数。ECParameterSpec ecParameterSpec = privateKey.getParameters();ECDomainParameters ecDomainParameters =newECDomainParameters(ecParameterSpec.getCurve(),
                ecParameterSpec.getG(), ecParameterSpec.getN());//通过私钥值和私钥钥基本参数创建私钥参数对象ECPrivateKeyParameters ecPrivateKeyParameters =newECPrivateKeyParameters(privateKey.getD(),
                ecDomainParameters);//通过解密模式创建解密引擎并初始化SM2Engine sm2Engine =newSM2Engine(mode);
        sm2Engine.init(false, ecPrivateKeyParameters);String result =null;try{//通过解密引擎对密文字节串进行解密byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte,0, cipherDataByte.length);//将解密后的字节串转换为utf8字符编码的字符串(需要与明文加密时字符串转换成字节串所指定的字符编码保持一致)
            result =newString(arrayOfBytes,"utf-8");}catch(Exception e){System.out.println("SM2解密时出现异常"+ e.getMessage());}return result;}/**
     * @param privateKey SM私钥
     * @param cipherData 密文数据
     * @param modeType   解密模式
     * @return
     * @Description 私钥解密
     * @Author msx
     */publicstaticStringdecrypt02(BCECPrivateKey privateKey,String cipherData,int modeType){//解密模式SM2Engine.Mode mode =SM2Engine.Mode.C1C3C2;if(modeType !=1)
            mode =SM2Engine.Mode.C1C2C3;//将十六进制字符串密文转换为字节数组(需要与加密一致,加密是:加密后的字节数组转换为了十六进制字符串)byte[] cipherDataByte =Hex.decode(cipherData);//通过私钥对象获取私钥的基本域参数。ECParameterSpec ecParameterSpec = privateKey.getParameters();ECDomainParameters ecDomainParameters =newECDomainParameters(ecParameterSpec.getCurve(),
                ecParameterSpec.getG(), ecParameterSpec.getN());//通过私钥值和私钥钥基本参数创建私钥参数对象ECPrivateKeyParameters ecPrivateKeyParameters =newECPrivateKeyParameters(privateKey.getD(),
                ecDomainParameters);//通过解密模式创建解密引擎并初始化SM2Engine sm2Engine =newSM2Engine(mode);
        sm2Engine.init(false, ecPrivateKeyParameters);String result =null;try{//通过解密引擎对密文字节串进行解密byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte,0, cipherDataByte.length);//将解密后的字节串转换为utf8字符编码的字符串(需要与明文加密时字符串转换成字节串所指定的字符编码保持一致)
            result =newString(arrayOfBytes,"utf-8");}catch(Exception e){System.out.println("SM2解密时出现异常"+ e.getMessage());}return result;}//椭圆曲线ECParameters ASN.1 结构privatestaticX9ECParameters x9ECParameters =GMNamedCurves.getByName("sm2p256v1");//椭圆曲线公钥或私钥的基本域参数。privatestaticECParameterSpec ecDomainParameters =newECParameterSpec(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());/**
     * @param pubKeyHex 64字节十六进制公钥字符串(如果公钥字符串为65字节首个字节为0x04:表示该公钥为非压缩格式,操作时需要删除)
     * @return BCECPublicKey SM2公钥对象
     * @Description 公钥字符串转换为 BCECPublicKey 公钥对象
     * @Author msx
     */publicstaticBCECPublicKeygetECPublicKeyByPublicKeyHex(String pubKeyHex){//截取64字节有效的SM2公钥(如果公钥首个字节为0x04)if(pubKeyHex.length()>128){
            pubKeyHex = pubKeyHex.substring(pubKeyHex.length()-128);}//将公钥拆分为x,y分量(各32字节)String stringX = pubKeyHex.substring(0,64);String stringY = pubKeyHex.substring(stringX.length());//将公钥x、y分量转换为BigInteger类型BigInteger x =newBigInteger(stringX,16);BigInteger y =newBigInteger(stringY,16);//通过公钥x、y分量创建椭圆曲线公钥规范ECPublicKeySpec ecPublicKeySpec =newECPublicKeySpec(x9ECParameters.getCurve().createPoint(x, y), ecDomainParameters);//通过椭圆曲线公钥规范,创建出椭圆曲线公钥对象(可用于SM2加密及验签)returnnewBCECPublicKey("EC", ecPublicKeySpec,BouncyCastleProvider.CONFIGURATION);}publicstaticStringsm2Decrypt(String cipherData,BCECPrivateKey privateKey,int modeType)throwsKPromptException{byte[] arrayOfBytes =newbyte[0];try{//解密模式SM2Engine.Mode mode =SM2Engine.Mode.C1C3C2;if(modeType !=1)
                mode =SM2Engine.Mode.C1C2C3;//将十六进制字符串密文转换为字节数组(需要与加密一致,加密是:加密后的字节数组转换为了十六进制字符串)byte[] cipherDataByte =Hex.decode(cipherData);//通过私钥对象获取私钥的基本域参数。ECParameterSpec sm2ECParameters = privateKey.getParameters();ECDomainParameters domainParameters =newECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECPrivateKeyParameters privateKeyParameters =newECPrivateKeyParameters(privateKey.getD(), domainParameters);//用私钥解密SM2Engine sm2Engine =newSM2Engine(mode);
            sm2Engine.init(false, privateKeyParameters);try{
                arrayOfBytes = sm2Engine.processBlock(cipherDataByte,0, cipherDataByte.length);}catch(InvalidCipherTextException e){
                e.printStackTrace();}//得到明文:SM2 Encryption TestString data =newString(arrayOfBytes);System.out.println("解密后明文数据:"+ data);}catch(Exception e){thrownewKPromptException("sm2解密失败!");}returnnewString(arrayOfBytes);}publicstaticStringsm2Decrypt02(String cipherData,String privateKey)throwsKPromptException{byte[] arrayOfBytes =newbyte[0];try{byte[] cipherDataByte =Hex.decode(cipherData);//刚才的私钥Hex,先还原私钥BigInteger privateKeyD =newBigInteger(privateKey,16);X9ECParameters sm2ECParameters =GMNamedCurves.getByName("sm2p256v1");ECDomainParameters domainParameters =newECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECPrivateKeyParameters privateKeyParameters =newECPrivateKeyParameters(privateKeyD, domainParameters);//用私钥解密SM2Engine sm2Engine =newSM2Engine();
            sm2Engine.init(false, privateKeyParameters);try{
                arrayOfBytes = sm2Engine.processBlock(cipherDataByte,0, cipherDataByte.length);}catch(InvalidCipherTextException e){
                e.printStackTrace();}//得到明文:SM2 Encryption TestString data =newString(arrayOfBytes);System.out.println("解密后明文数据:"+ data);}catch(Exception e){thrownewKPromptException("sm2解密失败!");}returnnewString(arrayOfBytes);}/**
     * @param privateKeyHex 32字节十六进制私钥字符串
     * @return BCECPrivateKey SM2私钥对象
     * @Description 私钥字符串转换为 BCECPrivateKey 私钥对象
     * @Author msx
     */publicstaticBCECPrivateKeygetBCECPrivateKeyByPrivateKeyHex(String privateKeyHex){//将十六进制私钥字符串转换为BigInteger对象BigInteger d =newBigInteger(privateKeyHex,16);//通过私钥和私钥域参数集创建椭圆曲线私钥规范ECPrivateKeySpec ecPrivateKeySpec =newECPrivateKeySpec(d, ecDomainParameters);//通过椭圆曲线私钥规范,创建出椭圆曲线私钥对象(可用于SM2解密和签名)returnnewBCECPrivateKey("EC", ecPrivateKeySpec,BouncyCastleProvider.CONFIGURATION);}publicstaticvoidmain(String[] args)throwsKPromptException{String publicKeyHex =null;String privateKeyHex =null;KeyPair keyPair =createECKeyPair();PublicKey publicKey = keyPair.getPublic();if(publicKey instanceofBCECPublicKey){//获取65字节非压缩缩的十六进制公钥串(0x04)
            publicKeyHex =Hex.toHexString(((BCECPublicKey) publicKey).getQ().getEncoded(false));System.out.println("---->SM2公钥:"+ publicKeyHex);}PrivateKey privateKey = keyPair.getPrivate();if(privateKey instanceofBCECPrivateKey){//获取32字节十六进制私钥串
            privateKeyHex =((BCECPrivateKey) privateKey).getD().toString(16);System.out.println("---->SM2私钥:"+ privateKeyHex);}/**
         * 公钥加密
         */String data ="=========待加密数据=========";//将十六进制公钥串转换为 BCECPublicKey 公钥对象String encryptData =encrypt(publicKeyHex, data);System.out.println("---->加密结果:"+ encryptData);/**
         * 私钥解密
         *///将十六进制私钥串转换为 BCECPrivateKey 私钥对象
        data =decrypt(privateKeyHex, encryptData);System.out.println("---->解密结果:"+ data);}//    public static void main(String[] args) throws KPromptException {        "{\"api\":\"TG00927\", \"method\":\"post\"}"//        String privateKey = "c64b2ea15d0dac21c0433e754e88e0183485ffb70a2316cddafc7beda489d94c";//        String cipherData = "04f18d28df17c61ffb8e2cd8f1e7e81390c2047528bbd65436faf005655ade727f958c29b035b4b8b2da32eec5cd65ab74f1f28c90c58d37901b7d72cb098488ab3fa8e661c64ae3e91367a4b706ae61ee715083ad52e6f4dbf21a56116044e0341041e44923a44d1f239987f2253a60b9c4ab4ff43590002c9557f07f00b3133d2715c434090ddc5e87b374cf839a0a97eb1a4bfc00214a2bced9854a6ce187bba46d3529ba08e66ae19434be9281428ace4bcf9aad4cf6839bc826d04d0731b293450b387c4e08da3685747a4e7a90767dd85340783979b79c3ac54d5366ec4026faa88580248ab16bed6e57e31e0d21d3524d3e15be";////        System.out.println("cicps: " + cipherData);////        String decrypt = decrypt02(privateKey, cipherData);        String decrypt = SM2Utils.sm2Decrypt(cipherData,privateKey);//        System.out.println(decrypt);//    }}
packagecom.kayak.mtl.util;importcom.kayak.web.base.exception.KPromptException;importorg.apache.commons.codec.digest.DigestUtils;importorg.olap4j.impl.Base64;importorg.springframework.stereotype.Component;importjava.util.Map;/**
 * MD5工具类
 */publicclassMd5Utils{/**
     * md5加密算法
     * @param str 加密串
     * @return 加密后字符串
     */publicstaticStringmd5(String str){returnDigestUtils.md5Hex(str);}/**
     * 第一次加密,前端传过来的加密
     * @param str
     * @param salt
     * @return
     */publicstaticStringmd5Secret(String str,String salt)throwsKPromptException{String encodeBytes ="";try{//base64编码
            encodeBytes =Base64.encodeBytes(md5(str + salt).getBytes());}catch(Exception e){thrownewKPromptException("验签失败,请校验验签方式是否正确!");}return encodeBytes;}publicstaticvoidmain(String[] args)throwsKPromptException{String data ="{\"method\":\"POST\",\"loginname\":\"admin\",\"passwd\":\"EFD9D1B8BFB00E8E3647990F7D74D1D8\",\"api\":\"TG00001\",\"ipaddr\":\"192.168.43.68\",\"macaddr\":\"00:28:F8:71:E9:A9\",\"timestamp\":1679908543750,\"target\":\"CUST\"}";String publicKey ="04843255d137f6be11efa85c90a977eb5d42d1a27c1c5945a359f440dad805c112559cef72690a85569ef037bee5e2fb778d58cce0fa7301f091a5c79f91ccc5a4";String encrypt =SM2SecrityUtils.encrypt(publicKey, data);System.out.println("encrypt: "+ encrypt);

        encrypt ="04c4c49c0ede6604bb150cee186266263424d669f878df0863d4c561b399d30aa1eb510070292f402e779b9918e92ec66a891d605c6941c7083cc7360bd9687d8bf5021eeafb79b28225b437e90fea413d711c16ca0407b75085813d3ab579fd826d3b6fdd5730393e93c82efad2577c8851c9a7b399fa9b03d647d373761b2eb5844823c8c1bf079a4bdb98163cf4f942972b7c212f5df3f4bb7e08fc3d1a70db21aaaea045acc494b4c2b79b40430e2a1b7127bdfc7395fbf03a65444369e3fd055e1f3af16be578309e596452a731fa85022139462723f8048799b790f7b2f8878a123ded980154c31f642d59b4240826e537ff7bcbe5e1836255842dd1fee1482815fa58b1b01b1a26b55f9a3c0d18113ddaa0da4286cca78b287f0443593d99bd";//        String param = "0468ce2f7b9a75ff6fcdd5578a21d900b259c87493cc0217d4b3a507444d715c016e4f84b727749c5d74f09636b0d135c9360aa3b0955ddb2a51637ff16face3bbbd36b30f7d3138b1b83aea6834f99dc5bdfe1fae34540a828ee975e731faf244f8e5bc537fe3db457debf2aaaa8ea7515ef3275c1a0d413ced8f6741b3dcd794cca8c6d8adac0c8da8beebaa7ceec80aae8aee31fbb6b7425d1e4e95005cb4b88be4a396224e7b2705b40592e6771c247997cb4d929d03e19bbcee3b77d20830c35f461a308be8bb056200e3618d142d112ef32d1790eb2adbb3c1101f4e378108c98cb0a30add552850666ef69ac673842d7c7f92456dab8d5f3bcf83ef4f3047da564fc158ccd04de7130dfaf3a162dbd48121e0038285e8b0032f762d3a59a8b5";String lsa =Md5Utils.md5Secret(encrypt,"wmp092");System.out.println(">>>>>>>"+ lsa);//        String admin = md5Secret("04c817645a53ecb73edfbd5dbd7e64686a23b51cd485ee8465793883086a47c6bdfbb07b54958a960ae73232c23a2f3a549132f810e3157b50e97893dccd62f9f6a674bb1d66b7b11eb1972f62acaaa103ec90c4da436f225da4be2c2aa4c87434fd5c0bbc22363e643bc9464e5bce9965f912dc2f9896c8206e0221d59ca83a53b4bf707d181e981de8788eacf7b1c2fe19fdee692dd3fbec02cd93ed61788afad61d7290da66046f367ca04ac99578f9bee74c704fa97d2eace3db420b799c33fe8227b8642a83aaa2ab4c2cca71a09867b61015f0d05728fe61fafd186126be2747ee7a612143579e8439bca338056eab7de81e79a593a08a884a77462c1ce235a5ba052eaa118d28bdcd8e29a03be1fe09b57efe7d9c8f86156c2e16cb6a9f1efc", "wmp092");//        System.out.println("encode: " + admin);//        String password = new String(Base64.decode(admin));//        System.out.println(password.toUpperCase());}}

本文转载自: https://blog.csdn.net/weixin_38717886/article/details/129820971
版权归原作者 人生在勤,不索何获 所有, 如有侵权,请联系我们删除。

“javascript实现SM2加密解密”的评论:

还没有评论