热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

19cryptojsRC4加密的具体处理

前言这里主要是关于RC4加密的相关调研之所以调研这个是因为之前
前言

这里主要是关于 RC4 加密的相关调研

之所以调研这个是因为之前存在一个问题, 调用 java 相关 api 进行 RC4 加密的结果 和调用 crypto-js 的结果不一样, 作为出发点开始

然后调用的 API 基于 hutool-5.4.0

然后 一部分基于 crypto-js 来进行分析 

测试用例

这里是一个简单的 java 的测试用例, 有使用 RC4 进行加解密

RC4 是一种对称加密, 算法也是对称的

package com.hx.test02;import cn.hutool.crypto.symmetric.RC4;
import io.netty.buffer.ByteBufUtil;public class Test21Rc4Encode {// Test21Rc4Encodepublic static void main(String[] args) {String key = "11111";RC4 crypto = new RC4(key);byte[] srcBytes = "xxx".getBytes();byte[] encodedBytes = crypto.crypt(srcBytes);byte[] doubleEncodedBytes = crypto.crypt(encodedBytes);System.out.println(ByteBufUtil.hexDump(srcBytes));System.out.println(ByteBufUtil.hexDump(encodedBytes));System.out.println(ByteBufUtil.hexDump(doubleEncodedBytes));int x = 0;}}

RC4加密方式

传入的 msg 为原始字节序列  

依次遍历原始字节序列 sourceByte, 从 box序列 中获取一个影响参数 argByte 来进行 异或 计算得到 targetByte

然后 原始字节序列 所有的字节处理完成之后 即为加密处理之后的字节序列

加解密方式是一样的是利用了如下特性 ((sourceByte ^ argByte) ^ argByte) = sourceByte

在多次 crypt 计算的过程中, 初始化 box序列 相同, i, j 计算方式相同, 在多次 crypt 计算的过程中, 第 i 个字节, 对应的 argByte 是相同的

对于 RC4 算法, 其实 box 序列是怎么样的已经不重要了, 只是一些 argByte 的 影响因素 而已

稍微看一下 box 序列的初始化

虽然这个 box 序列不太重要, 但是可以稍微深入的了解一下它的实现

大致的实现就是 box 初始化为 256 长度的字节序列, 然后按照索引进行初始化

然后 下面的初始化就是 进行一个遍历 box 序列 然后进行一个和传入 key 序列相关的一个 数据交换操作

得到一个 “乱序” 的 box 序列


crypto-js 版本的 RC4

初始化 box 序列的地方, 当然 在不同的上下文可能 定义不一样, 这里是按照 上面的 RC4 加密的过程来进行判断的

测试用例如下

box 序列的初始化

这里也是 按照索引初始化, 然后按照遍历 box序列的 每一个字节 换换换

然后 循环每一个输入字节进行 异或操作

至于 pick 到的 n() 具体数字是什么不重要, 只要保证多次执行 输入序列的第i个字节 拿到的 argByte 是一样的即可

函数 n() 是 pick 四个字节的 argByte, 然后封装成 32 位的整数

this._i, this._j 保存的是上下文, 这里的算法细节 和 hutool-all 中的实现一致

可以发现的是当输入的 key 相同的情况下, 每次 上下文的 box 序列不相同, 这个又是怎么影响到的呢   

_doReset 中 box 序列有一个 e 的影响因素, 这个是外部传入的

这个 e 来自于根据 key 计算的一个 r

这里根据 key 生成 序列的时候, 传入的 i 为 null, 设置为 random() 影响到了 计算的结果 r 

从而继续向下传递 影响到了 _doReset 中的计算



crypto-js 版本的 RC4 的 ToString 的实现

转换的时候加了固定的 2 * 4 个字节, 添加了 t.words[表示 salt] 最后添加的才是 RC4 加密之后的结果

这里合计 2 * 4 + 2 * 4 + 3 = 19 字节, 然后进行 Base64 加密

t.words 来自于自于根据 key 计算的一个 r 的地方

同样和这个 随机因子有关系, 因此 他会变化



crypto-js 版本的 RC4解密 

将加密之后的文本 base64 解密, 然后校验前八个字节 "Salted__" 

然后 接着 八个字节作为 salt, 在 execute 中来作为影响 box 序列计算的 salt 

然后 后面的流程就和 加密一样了, 计算 box 序列, 然后 按字节异或 获取解密之后的文本 

另外还有一个 java版本 实现的 crypto-js 解密, 实现思路 貌似不同 

如何使用Java从CryptoJS解密加密的AES-256字符串?



推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
薛佩璇-_585
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有