package Ġit . bar usu . pay men . util Ċ Ċ import Ġorg . apache . commons . codec . binary . Base 6 4 Ċ import Ġorg . bouncycastle . j ce . provider . Bo unc y Castle Provider Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . security .* Ċ import Ġjava . security . cert . Certificate Ċ import Ġjava . security . cert . Certificate Factory Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . security . spec . Algorithm Parameter Spec Ċ import Ġjava . security . spec . KeySpec Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . SecretKey Factory Ċ Ċ class ĠSecurity Utils Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ PROVIDER Ġ= ĠBo unc y Castle Provider . PROVIDER _ NAME ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMD 5 Ġ= Ġ" MD 5 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHA 1 Ġ= Ġ" SHA 1 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHA 1 _ WITH _ RSA Ġ= Ġ" SHA 1 with RSA " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHA 1 PR NG Ġ= Ġ" SHA 1 PR NG " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHA 2 5 6 Ġ= Ġ" SHA - 2 5 6 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSHA 5 1 2 Ġ= Ġ" SHA - 5 1 2 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRSA Ġ= Ġ" RSA " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRSA _ E CB _ PKCS 1 P ADDING Ġ= Ġ" RSA / E CB / PKCS 1 P ADDING " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD SA Ġ= Ġ" D SA " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAES Ġ= Ġ" AES " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDES Ġ= Ġ" DES " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDE SE DE Ġ= Ġ" DE Se de " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP BE _ WITH _ SHA 2 5 6 _ AND _ 2 5 6 BIT AES _ CBC _ BC Ġ= Ġ" P BE With SHA 2 5 6 And 2 5 6 Bit AES - CBC - BC " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSM 2 Ġ= Ġ" SM 2 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSM 3 Ġ= Ġ" SM 3 " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠX 5 0 9 Ġ= Ġ" X . 5 0 9 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPKCS 1 2 Ġ= Ġ" PKCS 1 2 " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEN CRYPT _ BLOCK _ KEY _ SIZE Ġ= Ġ 1 1 7 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDE CRYPT _ BLOCK _ KEY _ SIZE Ġ= Ġ 1 2 8 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity . add Provider ( Bo unc y Castle Provider ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġdigest ( algorithm : ĠString , Ġdata : ĠByteArray , Ġsalt : ĠByteArray ? Ġ= Ġnull ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠMessage Digest . getInstance ( algorithm , ĠDEFAULT _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( salt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigest . update ( salt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigest . update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdigest . digest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetKey Store ( type : ĠString , Ġcontent : ĠString , Ġpassword : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠKey Store Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( type . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Base 6 4 . is Base 6 4 ( content )) Ġ{ Ġ" The Ġcontent Ġof Ġkey Ġmust Ġbe Ġencoded Ġas Ġbase 6 4 ." Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . getInstance ( type ) Ġelse ĠKey Store . getInstance ( type , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . load ( ByteArray InputStream ( Base 6 4 . decode Base 6 4 ( content )), Ġpassword . toCharArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Store ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget PrivateKey ( type : ĠString , Ġcontent : ĠString , Ġpassword : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠPrivate Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( type . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Base 6 4 . is Base 6 4 ( content )) Ġ{ Ġ" The Ġcontent Ġof Ġprivate Ġkey Ġmust Ġbe Ġencoded Ġas Ġbase 6 4 ." Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( password . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Factory Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Factory . getInstance ( type ) Ġelse ĠKey Factory . getInstance ( type , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Factory . generate Private ( PKCS 8 Encoded KeySpec ( Base 6 4 . decode Base 6 4 ( content ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠgetKey Store ( type , Ġcontent , Ġpassword , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Aliases Ġ= Ġkey Store . aliases () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠprivateKey : ĠPrivate Key ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( key Aliases . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Alias : ĠString Ġ= Ġkey Aliases . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Store . is Key Entry ( key Alias )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey Ġ= Ġkey Store . getKey ( key Alias , Ġpassword . toCharArray ()) Ġas ĠPrivate Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( privateKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Key Exception (" No Ġaval iable Ġprivate Ġkey Ġwas Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠprivateKey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Certificate ( type : ĠString , Ġcontent : ĠString , Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠCertificate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcertificate Factory Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCertificate Factory . getInstance ( type ) Ġelse ĠCertificate Factory . getInstance ( type , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcertificate Factory . generate Certificate ( ByteArray InputStream ( Base 6 4 . decode Base 6 4 ( content ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġget Ġcertificate Ġfrom Ġkeystore . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠSecurity Utils . getKey Store ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Certificate ( key Store : ĠKey Store ): ĠX 5 0 9 Certificate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Aliases Ġ= Ġkey Store . aliases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key Aliases . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Error Ġgenerating ĠX 5 0 9 Certificate Ġfrom Ġthe Ġprivate Ġkey !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Alias Ġ= Ġkey Aliases . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Store . get Certificate ( key Alias ) Ġas ĠX 5 0 9 Certificate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget PublicKey ( type : ĠString , Ġcontent : ĠString , Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠPublicKey Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( type . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Base 6 4 . is Base 6 4 ( content )) Ġ{ Ġ" The Ġcontent Ġof Ġpublic Ġkey Ġmust Ġbe Ġencoded Ġas Ġbase 6 4 ." Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( X 5 0 9 Ġ== Ġtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Certificate ( type , Ġcontent , Ġprovider ). publicKey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Factory Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Factory . getInstance ( type ) Ġelse ĠKey Factory . getInstance ( type , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Factory . generate Public ( X 5 0 9 Encoded KeySpec ( Base 6 4 . decode Base 6 4 ( content ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate Salt ( algorithm : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠByteArray ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSecure Random . getInstance ( algorithm ). next Bytes ( salt ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsalt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget SecretKey ( algorithm : ĠString , Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠSecret Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( provider . isNull OrEmpty ()) ĠKey Generator . getInstance ( algorithm ). generate Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠKey Generator . getInstance ( algorithm , Ġprovider ). generate Key () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget SecretKey ( algorithm : ĠString , Ġspec : ĠKey Spec , Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠSecret Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( provider . isNull OrEmpty ()) ĠSecret Key Factory . getInstance ( algorithm ). generate Secret ( spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSecret Key Factory . getInstance ( algorithm , Ġprovider ). generate Secret ( spec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġsign ( algorithm : ĠString , ĠprivateKey : ĠPrivate Key , Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . getInstance ( algorithm ) Ġelse ĠSignature . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . init Sign ( privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsignature . sign () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġverify ( algorithm : ĠString , ĠpublicKey : ĠPublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , Ġsign ByteArray : ĠByteArray , Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . getInstance ( algorithm ) Ġelse ĠSignature . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . init Verify ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . update ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsignature . verify ( sign ByteArray ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġencrypt ( algorithm : ĠString , Ġkey : ĠKey , Ġdata : ĠByteArray , Ġspec : ĠAlgorithm Parameter Spec ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( algorithm ) Ġelse ĠCipher . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spec Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey , Ġspec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcipher . do Final ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġblock Encrypt ( algorithm : ĠString , Ġkey : ĠKey , Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypt Block Key Size : ĠInt Ġ= ĠEN CRYPT _ BLOCK _ KEY _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( algorithm ) Ġelse ĠCipher . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġif Ġ( i Ġ+ Ġencrypt Block Key Size Ġ> Ġdata . size ) Ġdata . size Ġelse Ġi Ġ+ Ġencrypt Block Key Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal ByteArray Ġ= Ġcipher . do Final ( data . copyOf Range ( i , Ġj )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= ĠByteArray ( result . size Ġ+ Ġfinal ByteArray . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . copy Into ( new Array , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ByteArray . copy Into ( new Array , Ġresult . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnew Array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġencrypt Block Key Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġdecrypt ( algorithm : ĠString , Ġkey : ĠKey , Ġdata : ĠByteArray , Ġspec : ĠAlgorithm Parameter Spec ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( algorithm ) Ġelse ĠCipher . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spec Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey , Ġspec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcipher . do Final ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġblock Decrypt ( algorithm : ĠString , Ġkey : ĠKey , Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Block Key Size : ĠInt Ġ= ĠDE CRYPT _ BLOCK _ KEY _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString ? Ġ= ĠDEFAULT _ PROVIDER ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġif Ġ( provider . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . getInstance ( algorithm ) Ġelse ĠCipher . getInstance ( algorithm , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj Ġ= Ġif Ġ( i Ġ+ Ġdecrypt Block Key Size Ġ> Ġdata . size ) Ġdata . size Ġelse Ġi Ġ+ Ġdecrypt Block Key Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal ByteArray Ġ= Ġcipher . do Final ( data . copyOf Range ( i , Ġj )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= ĠByteArray ( result . size Ġ+ Ġfinal ByteArray . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . copy Into ( new Array , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal ByteArray . copy Into ( new Array , Ġresult . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnew Array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġdecrypt Block Key Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} Ċ }