package Ġblock C iph ers Ċ Ċ import Ġutils .* Ċ import Ġjavax . crypto . SecretKey Ċ Ċ class ĠP bc Cipher ( private Ġval Ġlength : ĠInt ): ĠGeneric Cipher Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġiv : ĠByteArray Ġ= Ġgenerate Iv ( length . div ( BITS _ IN _ BYTE )). iv ĊĠĠĠ Ġprivate Ġval Ġe cb Cipher : ĠE cb Cipher Ġ= ĠE cb Cipher ( length ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Key ( length : ĠInt ): ĠSecret Key Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Aes Key ( length ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġencrypt ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . validate Alphabet () ĊĠĠĠĠĠĠĠ Ġvar Ġiv : ĠByteArray Ġ= Ġiv ĊĠĠĠĠĠĠĠ Ġval Ġblocks : ĠList < ByteArray > Ġ= Ġtext . divide Into Blocks ( length ) ĊĠĠĠĠĠĠĠ Ġval Ġful filled Blocks Ġ= Ġblocks . map Indexed Ġ{ Ġindex , Ġbytes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġblocks . size Ġ- Ġ 1 ) Ġbytes . ful fill Block () Ġelse Ġbytes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġful filled Blocks . join ToString Ġ{ Ġblock Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Encrypted Block Ġ= Ġblock . xor ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv Ġ= Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe cb Cipher . encrypt ( iv Encrypted Block ) ĊĠĠĠĠĠĠĠ Ġ}. replace (", Ġ", Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecrypt ( encrypted Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblocks : ĠList < String > Ġ= Ġencrypted Text . chunk ed ( BLOCK _ SIZE _ IN _ BITS ) ĊĠĠĠĠĠĠĠ Ġvar Ġiv : ĠByteArray Ġ= Ġiv ĊĠĠĠĠĠĠĠ Ġreturn Ġblocks . join ToString Ġ{ Ġbinary String Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Binary Block Ġ= Ġe cb Cipher . decrypt With Iv ( binary String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv De crypted Block Ġ= Ġdecrypted Binary Block . xor ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv Ġ= Ġiv De crypted Block ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( iv De crypted Block . remove Padding From Block ()) ĊĠĠĠĠĠĠĠ Ġ}. replace (", Ġ", Ġ"") ĊĠĠĠ Ġ} Ċ }