package Ġeu . pret ix . pret ix scan . utils ĊĊ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Per manently Invalid ated Exception Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . security . keystore . User Not Authenticated Exception Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security . Invalid Algorithm Parameter Exception Ċ import Ġjava . security . Invalid Key Exception Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . KeyStore Exception Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġjava . security . NoSuch Provider Exception Ċ import Ġjava . security . Un recover able Key Exception Ċ import Ġjava . security . cert . Certificate Exception Ċ Ċ import Ġjavax . crypto . Bad Padding Exception Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Illegal BlockSize Exception Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . NoSuch Padding Exception Ċ import Ġjavax . crypto . SecretKey Ċ Ċ object ĠKe yst ore Helper Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠSE C URE _ KEY _ NAME Ġ= Ġ" prefs _ encryption _ key " ĊĠĠĠ Ġprivate Ġval ĠAND ROID _ KEY _ STORE Ġ= Ġ" Android KeyStore " ĊĊĠĠĠ Ġ// ĠWorks Ġsince Ġandroid ĠM , Ġfor Ġprevious Ġversions Ġthis Ġwill Ġsimply Ġreturn Ġthe Ġplain Ġvalue Ġun alter ed ĊĠĠĠ Ġfun Ġsecure Value ( value : ĠString , Ġencrypt : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value . length Ġ> Ġ 0 Ġ&& Ġandroid . os . Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance ( ANDROID _ KEY _ STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . load ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġkey : ĠSecret Key ? Ġ= Ġkey Store . getKey ( SECURE _ KEY _ NAME , Ġnull ) Ġas ĠSecret Key ? ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Generator Ġ= ĠKey Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ AES , ĠAND ROID _ KEY _ STORE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Generator . init ( Key Gen Parameter Spec . Builder ( SECURE _ KEY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ E CB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ PKCS 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Random ized Encryption Required ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Generator . generate Key () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey Store . getKey ( SECURE _ KEY _ NAME , Ġnull ) Ġas ĠSecret Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ ĠIt 's Ġquite Ġok Ġto Ġuse ĠE CB Ġhere , Ġbecause : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠ Ġ- Ġthe Ġ" plaintext " Ġwill Ġmost Ġlikely Ġfit Ġinto Ġone Ġor Ġtwo Ġencryption Ġblocks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠ Ġ- Ġthe Ġ" plaintext " Ġonly Ġcontains Ġpseudo - random Ġprint able Ġcharacters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠ Ġ- Ġwe Ġdon 't Ġwant Ġto Ġstore Ġan Ġadditional ĠIV ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" GetInstance ") Ġval Ġcipher Ġ= ĠCipher . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ AES Ġ+ Ġ"/" Ġ+ ĠKey Properties . BLOCK _ MODE _ E CB Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠKey Properties . ENCRYPT ION _ P ADDING _ PKCS 7 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encrypt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcipher . do Final ( value !!. toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ToString ( bytes , ĠBase 6 4 . NO _ WRAP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠBase 6 4 . decode ( value , ĠBase 6 4 . NO _ WRAP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( cipher . do Final ( bytes ), ĠCharset . forName (" UTF - 8 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUser Not Authenticated Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Ke yst ore Helper ", Ġ" User Not Authenticated Exception : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠKey Per manently Invalid ated Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Ke yst ore Helper ", Ġ" Key Per manently Invalid ated Exception : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBad Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal BlockSize Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠKey Store Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCertificate Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn recover able Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Provider Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Algorithm Parameter Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} Ċ }