【Java】Java实现简单异或加密

Java实现简单异或加密

零、需求

在做一个简单的Web项目,需要把账号密码以Cookie的形式存储到浏览器中记住,不能直接明文,故需要一种简单的加密方式,想到了异或加密。

壹、实现


    /**
     * 异或操作
     * @param rawData 要异或的字节数组
     * @param number 运算数
     * @return 异或运算后的字节数组
     */
    public static byte[] Xor(byte[] rawData, int number) {
        byte[] encodeData = new byte[rawData.length];
        for (int i = 0; i < rawData.length; i++) //遍历字符数组
        {
            encodeData[i] = (byte) (rawData[i] ^ number); //对每个数组元素进行异或运算
        }
        return encodeData;
    }

    /**
     * 异或加密
     * @param rawStr 原文
     * @param key 密钥
     * @return 密文
     */
    public static String EncodeByXor(String rawStr, String key) {
        // 通过字符串拿到密钥
        int number = 1;
        for (int i = 0; i < key.length(); i++) {
            number *= key.charAt(i);
        }

        // 转成字节数组
        byte[] rawData = rawStr.getBytes(StandardCharsets.UTF_8);
        byte[] encodeData = Xor(rawData, number);

        // 把字节数组转成某种格式的字符串,方便传输(格式可以自定义,好解析就行)
        StringBuilder encodeStr = new StringBuilder();
        for (byte b : encodeData) {
            encodeStr.append(b).append("x");
        }

        return encodeStr.toString();
    }

    /**
     * 异或解密
     * @param encodeStr 密文
     * @param key 密钥
     * @return 原文
     */
    public static String DecodeByXor(String encodeStr, String key) {
        // 通过字符串拿到密钥
        int number = 1;
        for (int i = 0; i < key.length(); i++) {
            number *= key.charAt(i);
        }

        // 解析EncodeByXor方法中的字节数组格式,找到加密后的字节数组
        String[] strings = encodeStr.substring(0,encodeStr.length()-1).split("x");
        byte[] rawData = new byte[strings.length];
        for (int i = 0; i < strings.length; i++) {
            rawData[i] = Byte.parseByte(strings[i]);
        }

        // 异或一下
        byte[] encodeData = Xor(rawData, number);

        // 重新编码成原始字符串
        return new String(encodeData,StandardCharsets.UTF_8);
    }


    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        String enStr = EncodeByXor("异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。","这个是一个秘钥");
        System.out.println("加密后:");
        System.out.println(enStr);

        String deStr = DecodeByXor(enStr,"这个是一个秘钥");
        System.out.println("解密后:");
        System.out.println(deStr);
    }

测试结果:

加密后:
-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-90x-126x-26x-98x-100x-27x-112x-116x-26x-105x-74x-25x-97x-91x-23x-127x-109x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-17x-68x-116x-27x-120x-103x-27x-81x-71x-26x-81x-108x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-27x-113x-81x-28x-69x-91x-26x-114x-88x-25x-82x-105x-27x-121x-70x-27x-81x-122x-23x-110x-91x-17x-68x-116x-27x-101x-96x-26x-83x-92x-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-82x-119x-27x-123x-88x-26x-128x-89x-24x-66x-125x-28x-67x-114x-17x-68x-116x-28x-72x-128x-24x-120x-84x-27x-113x-86x-25x-108x-88x-28x-70x-114x-25x-82x-128x-27x-115x-107x-25x-102x-124x-27x-118x-96x-27x-81x-122x-29x-128x-126x
解密后:
异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。

贰、总结

异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。

叁、参考文档

https://www.jb51.net/article/67809.htm

posted @ 2023-02-14 14:41  清风来叙  阅读(493)  评论(0编辑  收藏  举报