DES加密算法详解+java源码

先说客套话:数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。

 

基本流程如下图所示

初始换位称为IP变换

逆初始变换称为IP逆变换

 

 

首先我们要把64位的密钥变换成16个48位的子密钥,如下图

其中64位压缩成56位称为PC1变换,56位压缩成48位称为PC2变换

循环左移的位数用数组表示

public static Integer MOVE_TIMES[] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };

 

 

接下来就是最主要的循环加密了

最后对R与subKey的F变换做详细解释:

R(32)位扩展成R‘(48)称为E变换。

由R’与子密钥K异或运算获得的值称为R‘’(48)

将R‘’(48)分为8块,每块6位,分别是:a0a1a2a3a4a5,按顺序进行S盒变换

S盒共有8个盒子,每个盒子为4*16的二维数组,对第j个盒子的查询方式为s[j][x][y],其中x为a0a5组合成十进制数,y为a1a2a3a4组合成十进制数

S盒变换结束后得到32位数,再进行32位换位变换,称为P变换,从而完成所有F变换

 

现在贴上Java Web的Structs2+Ajax版本的DES详细加密代码,注释应该算详细,不懂可以留言问,或者联系QQ:770415878

显示structs的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>


    <package name="default" namespace="/" extends="struts-default">


        
        
        <!-- ***************** DES详细 ************************** -->
        <!-- 获取子密钥 -->
        <action name="GetSubKey" class="CipherCode.DesAction" method="GetSubKey">
        </action>
        <!-- Next变换 -->
        <action name="Next" class="CipherCode.DesAction" method="Next">
        </action>
        <!-- Ip变换 -->
        <action name="GetIpTrans" class="CipherCode.DesAction" method="GetIpTrans">
        </action>
        <!-- Ip逆变换 -->
        <action name="GetIp1Trans" class="CipherCode.DesAction" method="GetIp1Trans">
        </action>
        <!-- 自动生成密钥 -->
        <action name="GetKey" class="CipherCode.DesAction" method="GetKey">
        </action>

    </package>

</struts>
structs.xml

接着是action的java类

package CipherCode;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DesAction extends ActionSupport {

    /**
     * 产生子密钥
     * 
     * @return
     */
    public String GetSubKey() {

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        String key = request.getParameter("key");

        try {

            key = DesDetail.HexToTwo(key);
            Map<String, Object> resultMap = DesDetail.DesMakeSubKeys(key);

            JSONObject json = JSONObject.fromObject(resultMap);

            // 设置编码
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 写入到前台
            response.getWriter().write(json.toString());
            System.out.println(json);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * IP变换
     * 
     * @return
     */
    public String GetIpTrans() {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        Map<String, Object> resultMap = new HashMap<String, Object>();

        String plainText = request.getParameter("plainText");
        try {
            String str = DesDetail.HexToTwo(plainText);
            str = DesDetail.DesIpTransform(str);
            str = DesDetail.TwoToHex(str);
            String l0 = "";
            String r0 = "";
            for (int i = 0; i < 8; i++) {
                l0 = l0 + str.charAt(i);
            }
            for (int i = 8; i < 16; i++) {
                r0 = r0 + str.charAt(i);
            }
            resultMap.put("l0", l0);
            resultMap.put("r0", r0);

            JSONObject json = JSONObject.fromObject(resultMap);

            // 设置编码
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 写入到前台
            response.getWriter().write(json.toString());
            System.out.println(json);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * NEXT变换
     * 
     * @return
     */
    public String Next() {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        Map<String, Object> resultMap = new HashMap<String, Object>();

        String subKey = request.getParameter("subKey");
        String l = request.getParameter("l");
        String r = request.getParameter("r");

        try {
            resultMap.put("l", r);
            l = DesDetail.HexToTwo(l);
            r = DesDetail.HexToTwo(r);
            subKey = DesDetail.HexToTwo(subKey);
            r = DesDetail.Xor32(l, DesDetail.DesFTransform(r, subKey));
            r = DesDetail.TwoToHex(r);
            resultMap.put("r", r);

            JSONObject json = JSONObject.fromObject(resultMap);

            // 设置编码
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 写入到前台
            response.getWriter().write(json.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * IP逆变换
     * 
     * @return
     */
    public String GetIp1Trans() {

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        Map<String, Object> resultMap = new HashMap<String, Object>();

        String r = request.getParameter("r");
        String l = request.getParameter("l");

        try {
            String cipherText = r + l;
            cipherText = DesDetail.HexToTwo(cipherText);
            cipherText = DesDetail.DesIp1Transform(cipherText);
            cipherText = DesDetail.TwoToHex(cipherText);
            resultMap.put("cipherText", cipherText);

            JSONObject json = JSONObject.fromObject(resultMap);

            // 设置编码
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 写入到前台
            response.getWriter().write(json.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 自动获取密钥
     * 
     * @return
     */
    public String GetKey() {

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        
        Map<String, Object> resultMap = new HashMap<String, Object>();

        try {

            String buf = new String("0123456789abcdef");
            Random temp = new Random();
            String key = new String("");
            for (int i = 0; i < 16; i++) {
                int k = temp.nextInt(16);
                char kk = buf.charAt(k);
                key = key + String.valueOf(kk);
            }
            resultMap.put("key", key);
            
            JSONObject json = JSONObject.fromObject(resultMap);

            // 设置编码
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 写入到前台
            response.getWriter().write(json.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

}
DesAction

最后是实现各种DES变换的java类,包括有所有变换的变换表

package CipherCode;

import java.util.HashMap;

public abstract class DesDetail {

    /* 初始置换表IP 64个 */
    public static Integer IP_Table[] = { 57, 49, 41, 33, 25, 17, 9, 1, 59, 51,
            43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47,
            39, 31, 23, 15, 7, 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34,
            26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30,
            22, 14, 6 };

    /* 逆初始置换表IP^-1 64个 */
    public static Integer IP_1_Table[] = { 39, 7, 47, 15, 55, 23, 63, 31, 38,
            6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4,
            44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42,
            10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25, 32, 0, 40, 8, 48,
            16, 56, 24 };

    /* 扩充置换表E 48个 */
    public static Integer E_Table[] = { 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7,
            8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20,
            19, 20, 21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31,
            0 };

    /* 置换函数P 32个 */
    public static Integer P_Table[] = { 15, 6, 19, 20, 28, 11, 27, 16, 0, 14,
            22, 25, 4, 17, 30, 9, 1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5,
            21, 10, 3, 24 };

    /* S盒 8*4*16 */
    public static Integer S[][][] = /* S1 */
    {
            { { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
                    { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
                    { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
                    { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } },
            /* S2 */
            { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
                    { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
                    { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
                    { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } },
            /* S3 */
            { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
                    { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
                    { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
                    { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } },
            /* S4 */
            { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
                    { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
                    { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
                    { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } },
            /* S5 */
            { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
                    { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
                    { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
                    { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } },
            /* S6 */
            { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
                    { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
                    { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
                    { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } },
            /* S7 */
            { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
                    { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
                    { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
                    { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } },
            /* S8 */
            { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
                    { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
                    { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
                    { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } } };

    /* 置换选择1 56个 */
    public static Integer PC_1[] = { 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41,
            33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
            62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60,
            52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 };

    /* 置换选择2 48个 */
    public static Integer PC_2[] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
            22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54,
            29, 39, 50, 44, 32, 46, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28,
            31 };

    /* 对左移次数的规定 16 */
    public static Integer MOVE_TIMES[] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,
            2, 2, 2, 1 };

    /* 16进制转换 */
    public static String Hex[] = { "0000", "0001", "0010", "0011", "0100",
            "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100",
            "1101", "1110", "1111" };

    /*
     * 产生子密钥64,16*48
     */
    public static HashMap<String, Object> DesMakeSubKeys(String key) {

        HashMap<String, Object> subKey = new HashMap<String, Object>();

        key = DesPc1Transform(key);/* PC1置换 */
        for (Integer i = 0; i < 16; i++) {/* 16轮跌代,产生16个子密钥 */
            key = DesRol(key, MOVE_TIMES[i]);/* 循环左移 */
            String str = "subKey" + i.toString();
            subKey.put(str, TwoToHex(DesPc2Transform(key)));/* PC2置换,产生子密钥 */
        }
        return subKey;
    }

    /*
     * PC1变换
     */
    public static String DesPc1Transform(String key) {
        String temp = "";
        for (int i = 0; i < 56; i++) {
            temp = temp + key.charAt(PC_1[i]);
        }
        return temp;
    }

    /*
     * PC2变换
     */
    public static String DesPc2Transform(String key) {
        String temp = "";
        for (int i = 0; i < 48; i++) {
            temp = temp + key.charAt(PC_2[i]);
        }
        return temp;
    }

    /*
     * 循环左移
     */
    public static String DesRol(String key, Integer time) {
        String temp = "";
        for (int i = 0; i < 28; i++) {
            if (i < 28 - time) {
                temp = temp + key.charAt(i + time);
            } else {
                temp = temp + key.charAt(time + i - 27);
            }
        }
        for (int i = 28; i < 56; i++) {
            if (i < 56 - time) {
                temp = temp + key.charAt(i + time);
            } else {
                temp = temp + key.charAt(time + i - 28);
            }
        }
        return temp;
    }

    /*
     * public static String HexToTwo(String key) { String temp = ""; for (int i
     * = 0; i < 16; i++) { temp = temp + Hex[key.charAt(i)-'0']; } return temp;
     * }
     */
    /*
     * 16进制转2进制
     */
    public static String HexToTwo(String hexString) {
        if (hexString == null || hexString.length() % 2 != 0)
            return null;
        String bString = "", tmp;
        for (int i = 0; i < hexString.length(); i++) {
            tmp = "0000"
                    + Integer.toBinaryString(Integer.parseInt(
                            hexString.substring(i, i + 1), 16));
            bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
    }

    /*
     * 2进制转16进制
     */
    public static String TwoToHex(String bString) {
        if (bString == null || bString.equals("") || bString.length() % 8 != 0)
            return null;
        StringBuffer tmp = new StringBuffer();
        int iTmp = 0;
        for (int i = 0; i < bString.length(); i += 4) {
            iTmp = 0;
            for (int j = 0; j < 4; j++) {
                iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
            }
            tmp.append(Integer.toHexString(iTmp));
        }
        return tmp.toString();
    }

    /*
     * 2进制转10进制
     */
    public static Integer TwoToInteger(String bString) {
        Integer temp = 0;
        if (bString.equals("00") || bString.equals("0000"))
            temp = 0;
        else if (bString.equals("01") || bString.equals("0001"))
            temp = 1;
        else if (bString.equals("10") || bString.equals("0010"))
            temp = 2;
        else if (bString.equals("11") || bString.equals("0011"))
            temp = 3;
        else if (bString.equals("0100"))
            temp = 4;
        else if (bString.equals("0101"))
            temp = 5;
        else if (bString.equals("0110"))
            temp = 6;
        else if (bString.equals("0111"))
            temp = 7;
        else if (bString.equals("1000"))
            temp = 8;
        else if (bString.equals("1001"))
            temp = 9;
        else if (bString.equals("1010"))
            temp = 10;
        else if (bString.equals("1011"))
            temp = 11;
        else if (bString.equals("1100"))
            temp = 12;
        else if (bString.equals("1101"))
            temp = 13;
        else if (bString.equals("1110"))
            temp = 14;
        else if (bString.equals("1111"))
            temp = 15;
        return temp;
    }

    /*
     * IP变换
     */
    public static String DesIpTransform(String key) {
        String temp = "";
        for (int i = 0; i < 64; i++) {
            temp = temp + key.charAt(IP_Table[i]);
        }
        return temp;
    }
    /*
     * IP逆变换
     */
    public static String DesIp1Transform(String key) {
        String temp = "";
        for (int i = 0; i < 64; i++) {
            temp = temp + key.charAt(IP_1_Table[i]);
        }
        return temp;
    }

    /*
     * E变换
     */
    public static String DesETransform(String key) {
        String temp = "";
        for (int i = 0; i < 48; i++) {
            temp = temp + key.charAt(E_Table[i]);
        }
        return temp;
    }

    /*
     * F变换
     */
    public static String DesFTransform(String r, String subKey) {
        String temp = "";
        r = DesETransform(r);// 将r进行E变换
        String key = Xor48(r, subKey);
        for (int i = 0; i < 48; i++) {
            if (i % 6 == 0) {
                String k1 = "" + key.charAt(i);
                k1 = k1 + key.charAt(i + 5);
                String k2 = "";
                for (int j = 1; j < 5; j++) {
                    k2 = k2 + key.charAt(i + j);
                }
                temp = temp + Hex[S[i / 6][TwoToInteger(k1)][TwoToInteger(k2)]];
            }
        }
        temp = DesPTransform(temp);

        return temp;
    }

    /*
     * P变换
     */
    public static String DesPTransform(String key) {
        String temp = "";
        for (int i = 0; i < 32; i++) {
            temp = temp + key.charAt(P_Table[i]);
        }
        return temp;
    }

    /*
     * 48位异或运算
     */
    public static String Xor48(String key1, String key2) {
        String temp = "";
        for (int i = 0; i < 48; i++) {
            if (key1.charAt(i) == key2.charAt(i)) {
                temp = temp + "0";
            } else {
                temp = temp + "1";
            }
        }
        return temp;
    }

    /*
     * 32位异或运算
     */
    public static String Xor32(String key1, String key2) {
        String temp = "";
        for (int i = 0; i < 32; i++) {
            if (key1.charAt(i) == key2.charAt(i)) {
                temp = temp + "0";
            } else {
                temp = temp + "1";
            }
        }
        return temp;
    }

}
DesDetail

 

转载于:https://www.cnblogs.com/Free-rein/archive/2013/06/06/3123063.html

STC15单片机双串口通信实战:串口2配置与多设备交互 本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。 阅读详情

相关推荐

GXHT40温湿度传感器:I2C通信与CRC校验实战解析

本文详细解析GXHT40温湿度传感器的I2C通信协议与CRC校验机制,涵盖硬件连接、时序控制、数据读取及加热功能应用。通过实战案例分享优化技巧与异常处理,帮助开发者提升嵌入式系统中传感器数据的准确性与可靠性。

rgv234567的博客 242

信息安全密码学:DES算法的核心 E盒、S盒、P盒

加密密钥等于脱密密钥,或者由一个可以轻易的计算出另一个的密码体制,称为单密钥密码体制,亦或称为对称密码体制或传统密码体制。其最具代表意义的当然属于DES密码体制了。 1、DES的设计背景 1973年5月 NBS(美国国家标准局)发布通告,征集一种加密算法 1974年8月 收到了IBM公司提交的算法 1976年11月 被推荐为联邦标准 1977年1月 发布 2、DES加密算法 迭代型分组算法  分组长度/密钥长度:64bit有效密钥长度:56bit(8bit奇偶校验位)迭代圈数:16圈圈密钥长度:48.

qq_44131896的Vlog 3万+

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 608

编写程序,利用Java实现DES算法

目录1.使用说明2.运行分析3.总体设计3.1类及函数3.2结构说明4.详细设计5.源码 1.使用说明 本程序使用eclipse Java编写。使用该程序可利用eclipse打开源代码文件夹,然后运行MainBody.java即可根据默认的明文和密钥输出加密、解密结果。 2.运行分析 为了得出更真实的运行时间,这里的明文和密钥均为8字节(实际加密解密中多于或者少于8字节都是无关的,明文、密文多了会进行分组,密钥多了会裁切,明文、密文、密钥少于会自动补),经过多次统计平均运行时间,了解到加解密所需时间分别是3

qq_43794633的博客 2465

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 418

Camera | 瑞芯微rk3568平台MIPI-CSI驱动:从设备树到V4L2框架的完整链路解析

本文深入解析瑞芯微rk3568平台MIPI-CSI驱动的完整链路,从设备树配置到V4L2框架集成。详细介绍了rk3568的MIPI-CSI驱动架构、设备树关键节点布局、驱动初始化流程及数据流路径,帮助开发者快速掌握摄像头控制器的调试与优化技巧,实现稳定的视频采集系统。

weixin_28703489的博客 290

DES加密算法源码(java版)

public class DES {    // 声明常量字节数组    private static final int[] IP = {            58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54,            46, 38, 30, 22, 14, 6, 64, 56, 48, 40

565

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

浅析加密算法五【DES密码】

文章目录一、简介二、原理2.1 明文加密流程2.2 密钥生成流程2.3 初始置换IP2.4 F轮变换2.4.1 拓展置换2.4.2 异或运算2.4.3 S盒子压缩2.4.4 P盒子置换2.5 初始逆变换三、算法特点四、安全隐患五、代码实现 一、简介 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法, 197719771977 年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需

小谢的博客 3524

华为OD机试双机位C卷-组装新的数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【组装新的数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 组装新的数组。

qq_45776114的博客 1145

Android软键盘系统深度解析:架构、原理与实现

Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、

保持专注,保持热爱 115

基于java类库的DES加密算法源码

import java.security.*; import java.text.SimpleDateFormat; import java.util.Date; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.cryp...

灵魂漫步的博客 927

BLDC&PMSM电机控制器硬件设计工程(八)72V 10kW电机控制器原理图工程及库文件

电机控制器基本需求:接口类型;MCU平台;通信接口;供电;信号采集;信号输出;功率;EMC或者认证需求。

小幽余生不加糖 373

des算法java_DES加密算法详解+java源码

packageCipherCode;importjava.util.HashMap;public abstract classDesDetail {/*初始置换表IP 64个*/public static Integer IP_Table[] = { 57, 49, 41, 33, 25, 17, 9, 1, 59, 51,43, 35, 27, 19, 11, 3, 61, 53, 45, 37...

weixin_35628777的博客 293

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java des加密源码_最简单的DES加密算法实现(源码分享)

Base64.javapackage com.mstf.des;import java.io.UnsupportedEncodingException;/*** base64编码/解码* @author ceet**/public class Base64 {public static String encode(String data) {return new String(encode(dat...

weixin_39604350的博客 318

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

DES加密算法源码(java版)

原文:http://blog.youkuaiyun.com/zyg158/article/details/1667535 public class DES {     // 声明常量字节数组     private static final int[] IP = {             58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 2

wangshfa的专栏 887

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java实现DES对称加密算法(附Android下3DES的JNI源码)

Java实现DES对称加密算法     Sun公司在Java Platform Standard Ed.6中引入了javax.crypto软件包,javax.crypto软件包为加密操作提供类和接口。在此包中定义的加密操作包括加密、密钥生成和密钥协商,以及消息验证码(Message Authentication Code,MAC)生成。 加密支持包括对称密码、非对称密码、块密码和流密码。此包还支

WTBEE的专栏 5715

java des加密_Des学习笔记

0x00拿到一份JAVA源码和密码密文后,翻看了密码加密的源码,将代码发在某技术群后,某大佬说像DES加密。首先贴出某CMS的JAVA加密代码: public static String EncodePasswd(String strPasswd) { String strEncodePasswd = ""; new String(); new St...

weixin_39842937的博客 119

DES加密算法java实现(核心算法+源代码)

原文地址:http://www.the5fire.com/DES%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95java%E5%AE%9E%E7%8E%B0%EF%BC%88%E6%A0%B8%E5%BF%83%E7%AE%97%E6%B3%95+%E6%BA%90%E4%BB%A3%E7%A0%81%EF%BC%89.html#comments 其实有了前一篇文章《

zxsted的专栏 1399

用java实现DES加密操作

这里只给出java源码,具体的DES编码原理可以参照武汉大学编写的《密码学引论》一书。注意,程序中对加密后的明文即密文按照Base64进行编码,这样可以防止密文出现乱码的现象。 import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import javax.crypto.*; import javax.crypto.spec....

qq_38883271的博客 1625

基于des双重加密算法的安全web电子邮件系统的设计与实现(论文+源码)_java_285

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。干货主要有:①1000+CTF历届题库(主流和经典的应该都有了)②CTF技术文档(最全中文版)③项目源码(四五十个有趣且经典的练手项目及源码)

Karka_的博客 1075

Java加密解密介绍

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

2401_84092574的博客 1081
上一篇: Java代码获取属性文件(.properties)中的value值
badao7116
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值