最近項目要上加密,找了des模塊試試手,寫了一個小demo。shell
encrypt(Text) -> crypto:start(), encrypt_chunk("12345678", list_to_binary(Text)). encrypt_chunk(PassWord, BinTex) when byte_size(BinTex) >= 8 -> {Chunk, Rest} = split_binary(BinTex, 8), << (crypto:block_encrypt(des_ecb, PassWord, Chunk))/binary, (encrypt_chunk(PassWord, Rest))/binary >>; encrypt_chunk(PassWord, <<>>) -> crypto:block_encrypt(des_ecb, PassWord, <<0:64>>); encrypt_chunk(PassWord, BinTex) -> PadSize = (8 - byte_size(BinTex)) * 8, PadBin = <<BinTex/binary, 0:PadSize>>, crypto:block_encrypt(des_ecb, PassWord, PadBin). decrypt(BinTex) -> binary_to_list(decrypt("12345678", BinTex)). decrypt(PassWord, BinTex) when byte_size(BinTex) >= 8 -> {Chunk, Rest} = split_binary(BinTex, 8), case Rest of <<>> -> Result = crypto:block_decrypt(des_ecb, PassWord, Chunk), delete_pading(Result); _ -> << (crypto:block_decrypt(des_ecb, PassWord, Chunk))/binary ,(decrypt(PassWord, Rest))/binary >> end; decrypt(PassWord, BinTex) -> Result = crypto:block_decrypt(des_ecb, PassWord, BinTex), delete_pading(Result). delete_pading(<<0:64>>) -> <<>>; delete_pading(<<A, 0:56>>) -> <<A>>; delete_pading(<<A, B, 0:48>>) -> <<A, B>>; delete_pading(<<A, B, C, 0:40>>) -> <<A, B, C>>; delete_pading(<<A, B, C, D, 0:32>>) -> <<A, B, C, D>>; delete_pading(<<A, B, C, D, E, 0:24>>) -> <<A, B, C, D, E>>; delete_pading(<<A, B, C, D, E, F, 0:16>>) -> <<A, B, C, D, E, F>>; delete_pading(<<A, B, C, D, E, F, G, 0:8>>) -> <<A, B, C, D, E, F, G>>; delete_pading(Binary) -> Binary.
代碼可用,你們能夠再優化一下。優化