package Ġcom . s let ical boy . learning . encryption Ċ Ċ import Ġcom . s let ical boy . util . Operation Utils Ċ import Ġcom . s let ical boy . util . Unicode Utils . string 2 char Ċ import Ġorg . bouncycastle . util . en coders . Hex Ċ Ċ class ĠSM 3 Digest Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¼ĵ åĨ² åĮº ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġx Buf Ġ= ĠByteArray ( BUFFER _ LENGTH ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¼ĵ åĨ² åĮº åģı ç§» éĩı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġx Buf Off Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪĿå§ĭ åĲĳ éĩı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠV Ġ= ĠSM 3 . iv . clone () ĊĠĠĠ Ġprivate Ġvar Ġcnt Block Ġ= Ġ 0 ĊĊĠĠĠ Ġconstructor () ĊĠĠĠ Ġconstructor ( t : ĠSM 3 Digest ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( t !!. x Buf , Ġ 0 , Ġx Buf , Ġ 0 , Ġt . x Buf . size ) ĊĠĠĠĠĠĠĠ Ġx Buf Off Ġ= Ġt . x Buf Off ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( t . V , Ġ 0 , ĠV , Ġ 0 , Ġt . V . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSM 3 ç»ĵæŀľ è¾ĵåĩº ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġout ĠĠĠ Ġ ä¿ĿåŃĺ SM 3 ç»ĵæŀĦ çļĦ ç¼ĵ åĨ² åĮº ĊĠĠĠĠ Ġ* Ġ@ param Ġout Off Ġ ç¼ĵ åĨ² åĮº åģı ç§» éĩı ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdo Final ( out : ĠByteArray ?, Ġout Off : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġdo Final () ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( tmp , Ġ 0 , Ġout , Ġ 0 , Ġtmp . size ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBYTE _ LENGTH ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġx Buf Off Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcnt Block Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠV Ġ= ĠSM 3 . iv . clone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺİ æĸĩ è¾ĵåħ¥ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġin ĠĠĠ Ġ æĺİ æĸĩ è¾ĵåħ¥ ç¼ĵ åĨ² åĮº ĊĠĠĠĠ Ġ* Ġ@ param Ġin Off Ġ ç¼ĵ åĨ² åĮº åģı ç§» éĩı ĊĠĠĠĠ Ġ* Ġ@ param Ġlen ĠĠ Ġ æĺİ æĸĩ éķ¿åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate (` in `: ĠByteArray ?, Ġin Off : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpart Len Ġ= ĠBUFFER _ LENGTH Ġ- Ġx Buf Off ĊĠĠĠĠĠĠĠ Ġvar Ġinput Len Ġ= Ġlen ĊĠĠĠĠĠĠĠ Ġvar Ġd Pos Ġ= Ġin Off ĊĠĠĠĠĠĠĠ Ġif Ġ( part Len Ġ< Ġinput Len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy (` in ` !! , Ġd Pos , Ġx Buf , Ġx Buf Off , Ġpart Len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Len Ġ-= Ġpart Len ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Pos Ġ+= Ġpart Len ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( input Len Ġ> ĠBUFFER _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy (` in `, Ġd Pos , Ġx Buf , Ġ 0 , ĠBUFFER _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Len Ġ-= ĠBUFFER _ LENGTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Pos Ġ+= ĠBUFFER _ LENGTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy (` in ` !! , Ġd Pos , Ġx Buf , Ġx Buf Off , Ġinput Len ) ĊĠĠĠĠĠĠĠ Ġx Buf Off Ġ+= Ġinput Len ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Update () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠB Ġ= ĠByteArray ( BLOCK _ LENGTH ) ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< ĠBUFFER _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( x Buf , Ġi , ĠB , Ġ 0 , ĠB . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Hash ( B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= ĠBLOCK _ LENGTH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġx Buf Off Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Hash ( B : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠSM 3 . CF ( V , ĠB ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( tmp , Ġ 0 , ĠV , Ġ 0 , ĠV . size ) ĊĠĠĠĠĠĠĠ Ġcnt Block ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Final (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠB Ġ= ĠByteArray ( BLOCK _ LENGTH ) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( x Buf Off ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( x Buf , Ġ 0 , Ġbuffer , Ġ 0 , Ġbuffer . size ) ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠSM 3 . padding ( buffer , Ġcnt Block ) ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġtmp . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( tmp , Ġi , ĠB , Ġ 0 , ĠB . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Hash ( B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= ĠBLOCK _ LENGTH ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠV ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate (` in `: ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġbyte ArrayOf (` in `) ĊĠĠĠĠĠĠĠ Ġupdate ( buffer , Ġ 0 , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Digest Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBYTE _ LENGTH ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĉ public Ġstatic Ġvoid Ġmain ( String [] Ġargs ) ĊĠĠĠ Ġ// ĉ { ĊĠĠĠ Ġ// ĉ ĉ byte [] Ġmd Ġ= Ġnew Ġbyte [ 3 2 ]; ĊĠĠĠ Ġ// ĉ ĉ byte [] Ġmsg 1 Ġ= Ġ" er er fe i is god ". getBytes (); ĊĠĠĠ Ġ// ĉ ĉ SM 3 Digest Ġsm 3 Ġ= Ġnew ĠSM 3 Digest (); ĊĠĠĠ Ġ// ĉ ĉ sm 3 . update ( msg 1 , Ġ 0 , Ġmsg 1 . length ); ĊĠĠĠ Ġ// ĉ ĉ sm 3 . do Final ( md , Ġ 0 ); ĊĠĠĠ Ġ// ĉ ĉ String Ġs Ġ= Ġnew ĠString ( Hex . encode ( md )); ĊĠĠĠ Ġ// ĉ ĉ System . out . println ( s . toUpperCase ()); ĊĠĠĠ Ġ// ĉ } ĊĠĠĠ Ġfun ĠgetKey ( input Str : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġmsg 1 Ġ= Ġinput Str . toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġsm 3 Ġ= ĠSM 3 Digest () ĊĠĠĠĠĠĠĠ Ġsm 3 . update ( msg 1 , Ġ 0 , Ġmsg 1 . size ) ĊĠĠĠĠĠĠĠ Ġsm 3 . do Final ( md , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠString ( Hex . encode ( md )) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġstring 2 char ( input Str ) ĊĠĠĠĠĠĠĠ Ġval Ġfinal Str Ġ= ĠOperation Utils . convert Key ( s , Ġc ) ĊĠĠĠĠĠĠĠ Ġvar Ġh aha Str Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġfinal Str . toCharArray () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġarr . size Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteger 1 Ġ= Ġarr [ i ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteger 2 Ġ= Ġarr [ arr . size Ġ- Ġ 1 Ġ- Ġi ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteger Ġ= Ġ( integer 1 Ġ+ Ġinteger 2 ) Ġ% Ġ 9 5 Ġ+ Ġ 3 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġinteger . to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh aha Str Ġ+= Ġch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" integer 1 :$ integer 1 Ġinteger 2 :$ integer 2 Ġinteger :$ integer ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" s :" Ġ+ Ġs Ġ+ Ġ" Ġ Ġs . length :" Ġ+ Ġs . length ) ĊĠĠĠĠĠĠĠ Ġprintln (" h aha Str :" Ġ+ Ġh aha Str Ġ+ Ġ" Ġ Ġh aha Str . length :" Ġ+ Ġh aha Str . length ) ĊĠĠĠĠĠĠĠ Ġreturn Ġh aha Str . substring ( 4 , Ġ 2 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSM 3 åĢ¼çļĦ éķ¿åº¦ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBYTE _ LENGTH Ġ= Ġ 3 2 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSM 3 åĪĨ ç»Ħ éķ¿åº¦ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBLOCK _ LENGTH Ġ= Ġ 6 4 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ç¼ĵ åĨ² åĮº éķ¿åº¦ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBUFFER _ LENGTH Ġ= ĠBLOCK _ LENGTH Ġ* Ġ 1 ĊĠĠĠ Ġ} Ċ }