异或混合加密算法

/**
 * @description: 异或混合加密算法
 */
public class MixEncAndDec {
 
    /**
     * 混合加密
     *
     * @param plaintext
     * @param ciphertext
     * @return int
     */
    private static int mixedEncrypt(byte[] plaintext, byte[] ciphertext) {
        int plaintext_size = plaintext.length;
        int finalLen = plaintext_size * 2;
        Random random = new Random();
        for (int i = 0; i < plaintext_size; i += 4) {
            Integer number = random.nextInt(900000) + 100000;
            long rdm = Long.valueOf(System.currentTimeMillis() + number);
            if (i >= plaintext_size || i + 4 >= plaintext_size) {
                for (int j = 0; j < plaintext_size - i; j++) {
                    ciphertext[i + j] = (byte) ((rdm >> ((3 - j) * 8)) & 0xff);
                }
            }
            ciphertext[i + 0] = (byte) ((rdm >> 24) & 0xff);
            ciphertext[i + 1] = (byte) ((rdm >> 16) & 0xff);
            ciphertext[i + 2] = (byte) ((rdm >> 8) & 0xff);
            ciphertext[i + 3] = (byte) ((rdm) & 0xff);
        }
        for (int i = finalLen - plaintext_size, j = 0; i < finalLen; ++i, ++j) {
            ciphertext[i] = (byte) (plaintext[j] ^ ciphertext[j]);
        }
        return 0;
    }
 
    /**
     * 混合解密
     *
     * @param ciphertext
     * @param plaintext
     * @return int
     */
    private static int mixedDecrypt(byte[] ciphertext, byte[] plaintext) {
        int plaintext_size = plaintext.length;
        for (int i = 0; i < plaintext_size; i++) {
            plaintext[i] = (byte) (ciphertext[(plaintext_size * 2) - plaintext_size + i] ^ ciphertext[i]);
        }
        return 0;
    }
 
    /**
     * 正向扰动
     *
     * @return int
     */
    static int reoder(byte[] src, byte[] dst) {
        int i, len = src.length;
        int m = 0;
        int n = len - 1;
        for (i = 0; i < len; i++) {
            if (i % 3 == 0) {
                dst[m++] = src[i];
            } else {
                dst[n--] = src[i];
            }
        }
        return 0;
    }
 
    /**
     * 反向扰动
     *
     * @param src
     * @param dst
     * @return int
     */
    static int recover(byte[] src, byte[] dst) {
        int i, len = src.length;
        int m = 0;
        int n = len - 1;
        for (i = 0; i < len; i++) {
            if (i % 3 == 0) {
                dst[i] = src[m++];
            } else {
                dst[i] = src[n--];
            }
        }
        return 0;
    }
 
    public static void main(String[] args) {
        //加密
        byte[] str = "OPEN AI LAB".getBytes();
        int enclen = str.length * 2;
        byte[] enc = new byte[enclen];
        mixedEncrypt(str, enc);
        byte[] finalEnc = new byte[enclen];
        reoder(enc, finalEnc);
        //解密
        byte[] plainEnc = new byte[finalEnc.length];
        recover(finalEnc, plainEnc);
        byte[] plaintext = new byte[plainEnc.length / 2];
        mixedDecrypt(plainEnc, plaintext);
        System.out.println(new String(plaintext));
    }
}
转载为:翔哥的《https://blog.csdn.net/qq_19734597/category_7757646.html》
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值