Java RC4加密算法

一、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

– 求知若饥,虚心若愚。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DS:经典算法OJ题(1)

创作不易&#xff0c;友友们给个三连呗&#xff01;&#xff01; 本文为经典算法OJ题练习&#xff0c;大部分题型都有多种思路&#xff0c;每种思路的解法博主都试过了&#xff08;去网站那里验证&#xff09;是正确的&#xff0c;大家可以参考&#xff01;&#xff01; 一、移…

数据写入HBase(scala)

package sourceimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject ffff {def main(args: Array[String]): Unit {//hbase连接配置val conf …

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…

Linux的优先级说明

一、背景 在工作中&#xff0c;不少同学对nice&#xff0c;priority&#xff0c;schedue策略&#xff0c;实时优先级&#xff0c;普通进程优先级的概念混淆&#xff0c;导致最后的代码可能引入bug&#xff0c;本文将统一进行说明&#xff0c;部分内容参考网络大佬的文章 &…

有趣的css - 第一个字符串自动生成文字图标

在设计 app 界面的时候&#xff0c;要展示一部分最新的资讯入口&#xff0c;然后出了一张下面的 UI 稿。 UI稿截图如下&#xff1a; 列表设计比较简单&#xff0c;就是列表前面的圆形图标这块&#xff0c;我个人觉得还是有点意思的。 一般的话&#xff0c;大概率都是用js限制…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

OJ_糖果分享游戏

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前&#xff0c;糖果数量…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据&#xff08;data.csv&#xff09; points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y …

【hcie-cloud】【23】容器编排【k8s】【Kubernetes常用工作负载、Kubernetes调度器简介、Helm简介、缩略词】【下】

文章目录 单机容器面临的问题、Kubernetes介绍与安装、Kubernetes对象的基本操作、Kubernetes YAML文件编写基础Kubernetes常用工作负载Kubernetes常用工作负载简介创建一个无状态nginx集群无状态工作负载Deployment说明无状态工作负载Deployment常见操作创建一个有状态的MySQL…

单链表实现通讯录(增删查改)

前言 之前写了很多次通讯录&#xff0c;一次比一次复杂&#xff0c;从静态到动态&#xff0c;再到文件操作&#xff0c;再到顺序表&#xff0c;今天要好好复习一下单链表&#xff0c;于是乎干脆用单链表再写一遍。 首先我们之前已经用单链表写过他的增删查改了&#xff0c;于…

1.28回溯(中等)

目录 1.格雷编码 2. 复原 IP 地址 3. 火柴拼正方形 1.格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相…

备战蓝桥杯----贪心算法(二进制)

已经差不多掌握了贪心的基本思想&#xff0c;让我们看几道比较趣的题吧&#xff01; 先来个比较有意思的题热热身&#xff1a; 法1.我们可以先把l,r化成二进制的形式。 然后分俩种情况&#xff1a; &#xff08;1&#xff09;若他们位数不一样并且位数高的全为1&#xff0c;…

在Shopee菲律宾站点进行选品时的策略

随着电子商务的快速发展&#xff0c;越来越多的卖家开始将目光投向了海外市场。作为东南亚地区最大的电商平台之一&#xff0c;Shopee菲律宾站点吸引了众多卖家的关注。然而&#xff0c;在这个竞争激烈的市场上&#xff0c;卖家需要制定一系列的策略&#xff0c;才能在选品中脱…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

基于saltstack开发自动化开通主机防火墙策略工具

一、前言 企业安全防护策略中会要求操作系统开启防火墙&#xff0c;开启iptables防火墙后&#xff0c;对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器&#xff0c;手工登录操作下还能接受。但在实际大型IT架构中&#xff0c;可能涉及到的服…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法&#xff08;三&#xff09; 目录 JavaScript基础语法&#xff08;三&#xff09;数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…

后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 1…

合合信息技术能力

体验中心网址&#xff1a; https://www.textin.com/TextIn体验中心 - 在线免费体验中心https://www.textin.com/ 合合技术团队CSDN&#xff1a; 合合技术团队的博客_CSDN博客-基于深度学习的文本检测与识别技术白皮书,【通用文本信息抽取技术白皮书】,【技术应用】领域博主 …