星驰编程网

免费编程资源分享平台_编程教程_代码示例_开发技术文章

Java加密与解密之对称加密DES_jwt对称加密

DES算法与DESede算法统称DES系列算法,DES算法是对称加密算法中的典型算法。
由于DES的密钥长度的不满足,才衍生出了DESede算法,对应中文“三重DES”。

对称加密会有 工作模式和填充方式两个概念

工作模式:ECB,CBC,CFB,OFB,CTR等

填充方式:NoPadding,PKCS5Padding,PKCS7Padding等

对于这两个概念大家可以在网上自行查阅。

DES算法密钥比较短,只有56位相对其它对称加密来说是不是特别的安全。由于DES算法具有半公开性质,被怀疑存在美国国家安全局安置的后门,受到各大密码学机构的强烈质疑。

Java的CMD小程序实现AES加密和解密

我写的代码:


import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;

public class AesCmdTool {

    private static final String AES = "AES";
    private static final String SHA1PRNG = "SHA1PRNG";
    public static final String PRE_KEY = "DES@";

    /**
     * 将二进制转换成16进制
     */
    public static String parseByte2HexStr(byte[] buf) {
        StringBuilder sb = new StringBuilder();
        String hex = null;
        for (byte each : buf) {
            hex = Integer.toHexString(each & 0xFF);
            if (hex.length() == 1) {
                sb.append("0");
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 将16进制转换为二进制
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr == null) {
            return null;
        }

        int hexStrLen = hexStr.length();
        if (hexStrLen < 1) {
            return null;
        }

        int iLen = hexStrLen / 2;

        byte[] result = new byte[iLen];
        for (int i = 0; i < iLen; ++i) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    public static String encode(String secret, String strPwd) {
        byte[] encryptResult = encrypt(secret, strPwd);
        if (encryptResult == null) {
            return "";
        }
        return parseByte2HexStr(encryptResult);
    }


    public static String decode(String secret, String strPwd) {
        // 解密
        byte[] decryptFrom = parseHexStr2Byte(secret);
        byte[] decryptResult = decrypt(decryptFrom, strPwd);
        if (decryptResult == null) {
            return "";
        }
        return new String(decryptResult);
    }


    /**
     * 加密
     *
     * @param content  需要加密的内容
     * @param password 加密密码
     */
    private static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator keyGen = KeyGenerator.getInstance(AES);
            SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG);
            secureRandom.setSeed(password.getBytes());
            keyGen.init(128, secureRandom);
            SecretKey secretKey = keyGen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
            Cipher cipher = Cipher.getInstance(AES);
            byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return cipher.doFinal(byteContent);
        } catch (Exception e) {
            return null;
        }
    }

    private static byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator keyGen = KeyGenerator.getInstance(AES);
            //防止linux下 随机生成key
            SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG);
            secureRandom.setSeed(password.getBytes());
            keyGen.init(128, secureRandom);
            SecretKey secretKey = keyGen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
            Cipher cipher = Cipher.getInstance(AES);
            cipher.init(Cipher.DECRYPT_MODE, key);
            return cipher.doFinal(content);
        } catch (Exception e) {
            return null;
        }
    }

    public static String textDecodeForPreText(String data, String password) {
        if (data == null) {
            return "";
        }

        if (data.startsWith(PRE_KEY)) {
            return decode(data.substring(PRE_KEY.length()), password);
        }

        return data;
    }

    public static void main(String[] args) {

        String one = "看代码网";
        String pwd = "workForLife";
        String enText = encode(one,pwd);
        String deText = decode(enText,pwd);
        System.out.println("en:"+enText);
        System.out.println("de:"+deText);
    }
}

非对称加密——一文看懂RSA_非对称加密dsa

非对称加密----RSA的使用

"非对称加密也叫公钥密码: 使用公钥加密, 使用私钥解密"

在对称密码中,由于加密和解密的密钥是相同的,因此必须向接收者配送密钥。用于解密的密钥必须被配送给接收者,这一问题称为密钥配送问题。如果使用非对称加密也可以称为公钥密码,则无需向接收者配送用于解密的密钥,这样就解决了密钥配送问题。可以说非对称加密是密码学历史上最伟大的发明。

<< 1 >>
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言