Java RC4加密算法

news2024/11/19 16:35:30

一、RC4加密算法

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。

百度百科 - RC4:https://baike.baidu.com/item/RC4/3454548?fr=ge_ala

二、Rc4Utils工具类

1、方式一

下面 Rc4Utils 提供了针对文本内容、字节数组内容的加解密实现。使用加密算法实现。

import org.apache.commons.codec.binary.Base64;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Rc4Utils {

    /**
     * 对文本内容进行加密.
     *
     * @param plainText 待加密明文内容.
     * @param rc4Key    RC4密钥.
     * @return 加密的密文.
     */
    public static String encodeText(String plainText, String rc4Key) {
        byte[] plainBytes = plainText.getBytes(StandardCharsets.UTF_8);
        byte[] cipherBytes = rc4EnOrDecode(plainBytes, rc4Key);
        return Base64.encodeBase64String(cipherBytes);
    }

    /**
     * 对文本密文进行解密.
     *
     * @param cipherText 待解密密文.
     * @param rc4Key     RC4密钥.
     * @return 解密的明文.
     */
    public static String decodeText(String cipherText, String rc4Key) {
        byte[] cipherBytes = Base64.decodeBase64(cipherText);
        byte[] plainBytes = rc4EnOrDecode(cipherBytes, rc4Key);
        return new String(plainBytes, StandardCharsets.UTF_8);
    }

    /**
     * 对字节数组内容进行加密.
     *
     * @param plainBytes 待加密明文内容.
     * @param rc4Key     RC4密钥.
     * @return 加密的密文.
     */
    public static byte[] encodeBytes(byte[] plainBytes, String rc4Key) {
        byte[] cipherBytes = rc4EnOrDecode(plainBytes, rc4Key);
        return cipherBytes;
    }

    /**
     * 对字节数组密文进行解密.
     *
     * @param cipherBytes 待解密密文.
     * @param rc4Key      RC4密钥.
     * @return 解密的明文.
     */
    public static byte[] decodeBytes(byte[] cipherBytes, String rc4Key) {
        byte[] plainBytes = rc4EnOrDecode(cipherBytes, rc4Key);
        return plainBytes;
    }

    /**
     * 初始化RC4密钥.
     *
     * @param rc4Key RC4密钥.
     * @return 初始化后的密钥.
     * @throws Exception 可能的异常.
     */
    private static byte[] rc4InitKey(String rc4Key) {
        byte[] keyBytes = null;
        byte[] keyState = null;
        int indexFirst = 0;
        int indexSecond = 0;
        // 变量初始化.
        keyBytes = rc4Key.getBytes(StandardCharsets.UTF_8);
        keyState = new byte[256];
        for (int i = 0; i < 256; i++) {
            keyState[i] = (byte) i;
        }
        // 进行初始化.
        if (keyBytes == null || keyBytes.length == 0) {
            return null;
        }
        for (int i = 0; i < 256; i++) {
            indexSecond = ((keyBytes[indexFirst] & 0xff) + (keyState[i] & 0xff) + indexSecond) & 0xff;
            byte tmp = keyState[i];
            keyState[i] = keyState[indexSecond];
            keyState[indexSecond] = tmp;
            indexFirst = (indexFirst + 1) % keyBytes.length;
        }
        return keyState;
    }

    /**
     * RC4算法进行加解密.
     *
     * @param bytes  待处理内容.
     * @param rc4Key RC4密钥.
     * @return 处理后结果内容.
     */
    public static byte[] rc4EnOrDecode(byte[] bytes, String rc4Key) {
        int x = 0;
        int y = 0;
        byte key[] = rc4InitKey(rc4Key);
        int xorIndex;
        byte[] result = new byte[bytes.length];
        // 数据加密.
        for (int i = 0; i < bytes.length; i++) {
            x = (x + 1) & 0xff;
            y = ((key[x] & 0xff) + y) & 0xff;
            byte tmp = key[x];
            key[x] = key[y];
            key[y] = tmp;
            xorIndex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xff;
            result[i] = (byte) (bytes[i] ^ key[xorIndex]);
        }
        return result;
    }

    public static void main(String[] args) throws Exception {
        //String rc4Key = "1234567890";
        String rc4Key = "78077e1be9204c21ac03cda1e6ea7a01";
        String plainText = "This is 一段明文内容 123 !";
        String cipherText = null;

        // 文本加解密测试.
        System.out.println("----------------------- 文本加解密测试 -------------------------");
        System.out.println("明文:" + plainText);
        cipherText = Rc4Utils.encodeText(plainText, rc4Key);
        System.out.println("密文:" + cipherText);
        plainText = Rc4Utils.decodeText(cipherText, rc4Key);
        System.out.println("解密明文:" + plainText);
        System.out.println();

        System.out.println("----------------------- 字节数组加解密测试 -------------------------");
        byte[] plainBytes = plainText.getBytes("UTF-8");
        byte[] cipherBytes = null;
        System.out.println("明文:" + Arrays.toString(plainBytes));
        cipherBytes = Rc4Utils.encodeBytes(plainBytes, rc4Key);
        System.out.println("密文:" + Arrays.toString(cipherBytes));
        plainBytes = Rc4Utils.decodeBytes(cipherBytes, rc4Key);
        System.out.println("解密明文:" + Arrays.toString(plainBytes));
        System.out.println();
    }

}

在这里插入图片描述

2、方式2

下面 Rc4Utils2 提供了针对文本内容的加解密实现。使用 Java封装好的类实现。

import lombok.extern.slf4j.Slf4j;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

@Slf4j
public class Rc4Utils2 {

    /**
     * 对文本内容进行加密.
     *
     * @param plainText 待加密明文内容.
     * @param rc4Key    RC4密钥.
     * @return 加密的密文.
     */
    public static String encodeText(String plainText, String rc4Key) {
        String result = "";
        try {
            Cipher cipher = Cipher.getInstance("RC4");
            SecretKeySpec key = new SecretKeySpec(rc4Key.getBytes(StandardCharsets.UTF_8), "RC4");
            cipher.init(Cipher.DECRYPT_MODE, key);

            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            result = Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Throwable e) {
            log.error(" 加密 encodeText方法异常,e={}", e);
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 对文本密文进行解密.
     *
     * @param cipherText 待解密密文.
     * @param rc4Key     RC4密钥.
     * @return 解密的明文.
     */
    public static String decodeText(String cipherText, String rc4Key) {
        String result = "";
        try {
            Cipher cipher = Cipher.getInstance("RC4");
            SecretKeySpec key = new SecretKeySpec(rc4Key.getBytes(StandardCharsets.UTF_8), "RC4");
            cipher.init(Cipher.DECRYPT_MODE, key);

            byte[] bytesA = Base64.getDecoder().decode(cipherText.getBytes(StandardCharsets.UTF_8));
            result = new String(cipher.update(bytesA), StandardCharsets.UTF_8);
        } catch (Throwable e) {
            log.error(" 解密 decodeText方法异常,e={}", e);
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        /**
         * rc4Key有长度限制
         * java.security.InvalidKeyException: Illegal key size or default parameters
         */
        //String rc4Key = "78077e1be9204c21ac03cda1e6ea7a01";
        String rc4Key = "1234567890";
        String plainText = "This is 一段明文内容 123 !";
        String cipherText = null;

        // 文本加解密测试.
        System.out.println("----------------------- 文本加解密测试 -------------------------");
        System.out.println("明文:" + plainText);
        cipherText = Rc4Utils2.encodeText(plainText, rc4Key);
        System.out.println("密文:" + cipherText);
        plainText = Rc4Utils2.decodeText(cipherText, rc4Key);
        System.out.println("解密明文:" + plainText);
        System.out.println();
    }

}

在这里插入图片描述

参考文章:

  • RC4 加密算法:https://blog.51cto.com/u_15301988/3089450

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭秘1688商品详情API接口:一探阿里巴巴的亿级商品数据宝藏

一、概述 1688商品详情API接口是阿里巴巴提供的一套应用程序接口&#xff0c;允许第三方开发者获取1688平台上的商品详情信息。通过使用这个接口&#xff0c;开发者可以获取到商品的详细属性、规格参数、价格等信息&#xff0c;从而进行深度分析和挖掘&#xff0c;进一步优化和…

selenium元素定位---元素点击交互异常解决方法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 1、异常原因 在编写ui自动化时&#xff0c;执行报错元素无法点击&#xff1a;ElementClickIn…

基础算法之Huffman编码

// Type your code here, or load an example. #include<iostream> #include<string> #include<queue> #include <unordered_map> #include <vector>using namespace std;//树节点结构 struct Node {char ch;int freq;Node *left;Node *right;No…

【数据结构】(一)从绪论到各种线性表

目录 一、绪论Introduction 1、数据结构 2、逻辑结构&#xff08;数据元素之间的相互关系&#xff09; 3、物理结构&#xff08;数据逻辑结构在计算机中的存储形式&#xff09; 4、数据类型&#xff08;一组性质相同的值的集合及定义在此集合上的一些操作的总称&#xff09…

幻兽帕鲁服务器多少钱?2024年Palworld游戏主机费用

幻兽帕鲁服务器多少钱&#xff1f;价格便宜&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;4核32G配置113元1个月、339元3个月&#xff1b;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。阿腾云atengyun.com分享阿里云和腾讯云palwor…

Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例 题目438&#xff1a;找到字符串中所有字母异位词 说明&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字…

Java基础—面向对象OOP—18三大特性:封装、继承与多态

由于本身理解还不是很到位&#xff0c;所以写的很绕&#xff0c;后续待补充优化 1、封装&#xff08;底层&#xff09;&#xff1a;该露的露&#xff0c;该藏的藏 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉低耦合&#xff1a;仅暴露少量的方…

休息日的思考与额外题——链表

文章目录 前言链表知识点 一、 92. 反转链表 II二、21. 合并两个有序链表总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷题班&#xff0c;训练…

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法SAO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; SAO-CNN-BiLSTM-Attention雪消融优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 雪消融优化器( SAO) 是受自然界中雪的升华和融化行为的启发&#xff0c;开发了一种…

Linux true/false区分

bash的数值代表和其它代表相反&#xff1a;0表示true&#xff1b;非0代表false。 #!/bin/sh PIDFILE"pid"# truenginx进程运行 falsenginx进程未运行 checkRunning(){# -f true表示普通文件if [ -f "$PIDFILE" ]; then# -z 字符串长度为0trueif [ -z &qu…

shell脚本——条件语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…

IP关联是什么?有什么后果?如何防止电商账号因IP关联被封?

在跨境电商的世界里&#xff0c;IP关联给多账号运营的商家带来了挑战。比如&#xff0c;亚马逊IP关联规则的执行对于那些经营多个店铺的卖家来说可能是一个不小的障碍。IP关联的影响不只是限于亚马逊&#xff0c;其他平台如Instagram、Facebook也有类似的机制&#xff0c;在之前…

Note-归一化层和前向源码

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 目录 简介BN层计算过程参数说明验证问题:bn层前面的cov不需要bia的原因 LN层计算过程参数说明验证问题:transfomer用LN而不是BN的原因 简介 深度学习中常见的归一化层包括批量归一化&#xff08;Batch Norma…

应急响应-流量分析

在应急响应中&#xff0c;有时需要用到流量分析工具&#xff0c;。当需要看到内部流量的具体情况时&#xff0c;就需要我们对网络通信进行抓包&#xff0c;并对数据包进行过滤分析&#xff0c;最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…

Redis面试(二)

1.Redis集群了解吗 前面说到了主从同步存在高可用和分布式问题&#xff0c;哨兵机制解决了高可用问题&#xff0c;而集群就是终极方案&#xff0c;一举解决高可用 和分布式问题。 1.数据分区&#xff1a;数据分区或称数据分片是集群最核心的功能&#xff0c;集群将数据分散到…

【人工智能】鲁滨逊归结原理-Python实现

一、实验目的 了解鲁滨逊归结算法原理&#xff0c;利用Python编写程序&#xff0c;实现鲁滨逊归结算法。 二、实验原理 鲁滨逊归结原理又称为消解原理&#xff0c;是鲁滨逊提出的一种证明子句集不可满足性&#xff0c;从而实现定理证明的一种理论及方法。它是机器定理证明的基…

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

任务修复实例(1)

实例1 任务名&#xff1a;增强防御&#xff08;quest_template.id 8490&#xff09; 涉及的两个数据表分别为 smart_script 和 creature_summon_groups smart_script Reactstate 取值参考源码 UnitDefines.h 的 ReactStates 定义&#xff0c;其中&#xff1a;0为被动&#…

第18章_JDK8-17新特性(下)(新语法结构,API的变化,其它结构变化,小结与展望)

文章目录 第18章_JDK8-17新特性&#xff08;下&#xff09;6. 新语法结构6.1 Java的REPL工具&#xff1a; jShell命令6.2 异常处理之try-catch资源关闭6.3 局部变量类型推断6.4 instanceof的模式匹配6.5 switch表达式6.6 文本块6.7 Record6.8 密封类 7. API的变化7.1 Optional类…

[docker] Docker镜像的创建以及Dockerfile的使用

一、Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 1.1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web centos:7 /bin/bash …