• 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截图没有上传,小伙伴可以试下~

  • 相关阅读:
    数据结构第2章 线性表
    电磁阀二位三通
    DSP芯片的基本结构和特征
    4. 输出文字
    NOP 指令作用[转]
    C语言内存分配calloc,malloc,realloc的区别
    多文件共享全局变量和函数[原创]
    练习1——四则运算
    作业3——阅读《构建之法》15章
    作业二——结对 四则运算
  • 原文地址:https://www.cnblogs.com/unqiang/p/7817992.html
Copyright © 2020-2023  润新知