java和erlang之间的DES加解密

   app登录,登录的密码要用DES加密,服务器是用erlang,客户端要同时支持多平台(Android、iOS)。首先,Java端的DES加密的实现方式,

少说废话了,直接上代码,如下:

public class DES {
    private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };

    public static String encryptDES(String encryptString, String encryptKey)
            throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
        return Base64.encode(encryptedData);
    }
}
View Code
上述代码用到了一个Base64的编码类,其代码的实现方式如下:
public class Base64 {
    private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            .toCharArray();

    /**
     * data[]进行编码
     * 
     * @param data
     * @return
*/
    public static String encode(byte[] data) {
        int start = 0;
        int len = data.length;
        StringBuffer buf = new StringBuffer(data.length * 3 / 2);

        int end = len - 3;
        int i = start;
        int n = 0;

        while (i <= end) {
            int d = ((((int) data[i]) & 0x0ff) << 16)
                    | ((((int) data[i + 1]) & 0x0ff) << 8)
                    | (((int) data[i + 2]) & 0x0ff);

            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append(legalChars[(d >> 6) & 63]);
            buf.append(legalChars[d & 63]);

            i += 3;

            if (n++ >= 14) {
                n = 0;
                buf.append(" ");
            }
        }

        if (i == start + len - 2) {
            int d = ((((int) data[i]) & 0x0ff) << 16)
                    | ((((int) data[i + 1]) & 255) << 8);

            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append(legalChars[(d >> 6) & 63]);
            buf.append("=");
        } else if (i == start + len - 1) {
            int d = (((int) data[i]) & 0x0ff) << 16;

            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append("==");
        }

        return buf.toString();
    }
}
View Code
 注意下:这里用的des加密,cbc模式,填充方式是:PKCS5Padding,还需注意下key和Ivev

然后,服务器由erlang解密,注意上述的加密模式,填充方式,以及key和Ivev的值需要保持一样。

代码如下:

-module(des).

-define(DES_KEY, des_key).
-define(CHARSET, charset).

-export([encrypto_des_cbc/1,decrypto_des_cbc/1,
         encrypto_des_cbc/3,decrypto_des_cbc/3]).

encrypto_des_cbc(PlainText) ->
    Key = "xxxxxxxx",
    Charset = utf8,
    encrypto_des_cbc(PlainText, Key, Charset).

decrypto_des_cbc(Ciphertext) ->
    Key = "xxxxxxxx",
    Charset = utf8,
    decrypto_des_cbc(Ciphertext, Key, Charset).


%% des 加密
encrypto_des_cbc(PlainText, Key, Charset) ->
    Key2 = unicode:characters_to_list(Key, Charset),
    Ivec = <<1,2,3,4,5,6,7,8>>,

    %% 按DES规则,补位
    N = 8 - (byte_size(list_to_binary(PlainText)) rem 8),
    PlainText2 = lists:append(PlainText, get_padding(N)),
    %% 加密
    Ciphertext = crypto:block_encrypt(des_cbc, Key2, Ivec, PlainText2),
    {ok, Ciphertext}.


%% des 解密
decrypto_des_cbc(Ciphertext, Key, Charset) ->

    Key2 = unicode:characters_to_list(Key, Charset),
    Ivec = <<1,2,3,4,5,6,7,8>>,
    case is_list(Ciphertext) of
        true ->
            CipherBin = list_to_binary(Ciphertext);
        false ->
            CipherBin = Ciphertext
    end,
    
    PlainAndPadding = crypto:block_decrypt(des_cbc,Key2,Ivec,CipherBin),
    <<PosLen/integer>> = binary_part(PlainAndPadding,{size(PlainAndPadding),-1}),
    Len = byte_size(PlainAndPadding) - PosLen,
    <<PlainText:Len/binary, _:PosLen/binary>> = PlainAndPadding,
    {ok, PlainText}.
    

get_padding(N) ->
    case N of
        0 ->
            get_padding2(8,8,[]);
        Num ->
            get_padding2(Num,Num,[])
    end.
    
get_padding2(N, Val, PaddingList) when N > 0 ->
    get_padding2(N-1, Val, [Val] ++ PaddingList);
get_padding2(N, _Val,PaddingList) when N == 0 ->
    PaddingList.
View Code
这样,server端就可以解密了.

注意:java的des加密的最后有个base64的转码,server的解密,首先需要base64:decode,然后再是des的解密 decode.

这里可扩展AES加解密和对应模式等等.

 这个的加解密的执行的shell截图没有上传,小伙伴可以试下~

原文地址:https://www.cnblogs.com/unqiang/p/7817992.html