开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4202|回复: 6
收起左侧

符合Java特性的RC4加密算法

[复制链接]
发表于 2017-2-10 11:00:11 | 显示全部楼层 |阅读模式   湖北省襄阳市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
稍稍使用了一下精易模块(进制_十六到十 等)。
起源:最近在分析基于E4A编写的安卓程序,于是就看到了E4A的rc4实现类,正好那个程序调用了这个加密,提取出加密代码作为java程序编译运行,加密结果跟易语言真的是……说天差地远应该也没什么问题。
所以说,这个加密是翻译java代码来的,不是真正自己写的。
(PS:这次翻译又进一步体会到易语言的索引“从1开始”给我带来的巨大不便……)
这个算法应该是和E4A的“RC4加密”“RC4解密”没有什么差别的,应该可以用在易语言程序和E4A程序的互相通讯上作为加密手段使用。
最后,关于子程序内部参数/变量名称混乱无逻辑,主要是因为JEB反编译出来的Java代码也是没有参数/变量名的,属于自动生成的名称(argX为参数,vX为变量)。
算法区:
  
子程序名返回值类型公开备 注
字节数组到字节集字节集 
参数名类 型参考可空数组备 注
arg字节型
变量名类 型静态数组备 注
i整数型 
temp字节集 
计次循环首 (取数组成员数 (arg), i)
temp = temp + 到字节集 (arg [i])
计次循环尾 ()
返回 (temp)
子程序名返回值类型公开备 注
字节集到字节数组  
参数名类 型参考可空数组备 注
arg字节集
re字节型
变量名类 型静态数组备 注
i整数型 
temp字节型0
计次循环首 (取字节集长度 (arg), i)
加入成员 (temp, 取字节集数据 (arg, 1, i))
计次循环尾 ()
re = temp
子程序名返回值类型公开备 注
字符数组到文本文本型 
参数名类 型参考可空数组备 注
arg文本型
变量名类 型静态数组备 注
i整数型 
temp文本型 
计次循环首 (取数组成员数 (arg), i)
temp = temp + arg [i]
计次循环尾 ()
返回 (temp)
子程序名返回值类型公开备 注
uniteBytes字节型 
参数名类 型参考可空数组备 注
arg8字节型
arg9字节型
' private static byte uniteBytes(byte arg8, byte arg9) {
' return ((byte)((((char)((((char)Byte.decode("0x" + new String(new byte[]{arg8})).byteValue())) << 4))) ^ (((char)
' Byte.decode("0x" + new String(new byte[]{arg9})).byteValue()))));
' }
返回 (到字节 (位异或 (左移 (进制_十六到十 (字符 (arg8)), 4), 进制_十六到十 (字符 (arg9)))))
子程序名返回值类型公开备 注
HexString2Bytes字节集 
参数名类 型参考可空数组备 注
arg7文本型
变量名类 型静态数组备 注
v2字节型0
v3整数型 
v4字节型0
v1整数型 
' private static byte[] HexString2Bytes(String arg7) {
' byte[] v2;
' try {
' int v3 = arg7.length();
' v2 = new byte[v3 / 2];
' byte[] v4 = arg7.getBytes("GBK");
' int v1;
' for(v1 = 0; v1 < v3 / 2; ++v1) {
' v2[v1] = test.uniteBytes(v4[v1 * 2], v4[v1 * 2 + 1]);
' }
' }
' catch(Exception v0) {
' v0.printStackTrace();
' v2 = new byte[0];
' }
v3 = 取文本长度 (arg7)
重定义数组 (v2, 假, v3 ÷ 2)
字节集到字节数组 (到字节集 (arg7), v4)
判断循环首 (v1 < v3 ÷ 2)
v2 [v1 + 1]uniteBytes (v4 [v1 × 2 + 1], v4 [v1 × 2 + 2])
v1 = v1 + 1
判断循环尾 ()
返回 (字节数组到字节集 (v2))
' return v2;
' }
子程序名返回值类型公开备 注
initKey字节集 
参数名类 型参考可空数组备 注
arg11文本型
变量名类 型静态数组备 注
v7字节集 
v10整数型 
v0字节型0
v5字节型256
v2整数型 
v3整数型 
v4整数型 
v6字节型 
' private static byte[] initKey(String arg11) {
' byte[] v7 = null;
' int v10 = 256;
' try {
' byte[] v0 = arg11.getBytes("GBK");
' byte[] v5 = new byte[256];
' int v2;
' for(v2 = 0; v2 < v10; ++v2) {
' v5[v2] = ((byte)v2);
' }
v10 = 256
字节集到字节数组 (到字节集 (arg11), v0)
判断循环首 (v2 < v10)
v5 [v2 + 1]到字节 (v2)
v2 = v2 + 1
判断循环尾 ()
' int v3 = 0;
' int v4 = 0;
' if(v0 != null && v0.length != 0) {
' v2 = 0;
' }
' else {
' return v7;
' }
判断 (取数组成员数 (v0) ≠ 0)
v2 = 0
返回 (v7)
' while(v2 < v10) {
' v4 = (v0[v3] & 255) + (v5[v2] & 255) + v4 & 255;
' byte v6 = v5[v2];
' v5[v2] = v5[v4];
' v5[v4] = v6;
' v3 = (v3 + 1) % v0.length;
' ++v2;
' }
判断循环首 (v2 < v10)
v4 = 位与 (位与 (v0 [v3 + 1], 255)位与 (v5 [v2 + 1], 255) + v4, 255)
v6 = v5 [v2 + 1]
v5 [v2 + 1] = v5 [v4 + 1]
v5 [v4 + 1] = v6
v3 (v3 + 1)取数组成员数 (v0)
v2 = v2 + 1
判断循环尾 ()
' return v5;
' }
' catch(Exception v1) {
' v1.printStackTrace();
' return v7;
' }
' }
返回 (字节数组到字节集 (v5))
子程序名返回值类型公开备 注
RC4Base字节集 
参数名类 型参考可空数组备 注
arg9字节集
arg10文本型
变量名类 型静态数组备 注
v4整数型 
v6整数型 
v1字节型0
v2字节型0
v0整数型 
v3字节型 
' private static byte[] RC4Base(byte[] arg9, String arg10) {
' int v4 = 0;
' int v6 = 0;
' byte[] v1 = 加密操作.initKey(arg10);
' byte[] v2 = new byte[arg9.length];
' int v0;
' for(v0 = 0; v0 < arg9.length; ++v0) {
' v4 = v4 + 1 & 255;
' v6 = (v1[v4] & 255) + v6 & 255;
' byte v3 = v1[v4];
' v1[v4] = v1[v6];
' v1[v6] = v3;
' v2[v0] = ((byte)(arg9[v0] ^ v1[(v1[v4] & 255) + (v1[v6] & 255) & 255]));
' }
' return v2;
' }
字节集到字节数组 (initKey (arg10), v1)
重定义数组 (v2, 假, 取字节集长度 (arg9))
判断循环首 (v0 < 取字节集长度 (arg9))
v4 = 位与 (v4 + 1, 255)
v6 = 位与 (位与 (v1 [v4 + 1], 255) + v6, 255)
v3 = v1 [v4 + 1]
v1 [v4 + 1] = v1 [v6 + 1]
v1 [v6 + 1] = v3
v2 [v0 + 1]到字节 (位异或 (取字节集数据 (arg9, 1, v0 + 1), v1 [位与 (位与 (v1 [v4 + 1], 255)位与 (v1 [v6 + 1], 255), 255) + 1]))
v0 = v0 + 1
判断循环尾 ()
返回 (字节数组到字节集 (v2))
子程序名返回值类型公开备 注
RC4_Encode文本型 
参数名类 型参考可空数组备 注
arg10文本型原文
arg11文本型密钥
变量名类 型静态数组备 注
v9文本型 
v0字节型0
v3文本型0
v5整数型 
v8文本型0
v4整数型 
v7整数型 
v1整数型 
v6整数型 
' @SimpleFunction public static String RC4加密(String arg10, String arg11) {
' String v9;
' if(arg10 != null && arg11 != null) {
' try {
' byte[] v0 = 加密操作.RC4Base(arg10.getBytes("GBK"), arg11);
' char[] v3 = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
' int v5 = v0.length;
' char[] v8 = new char[v5 * 2];
' int v4 = 0;
' int v7 = 0;
' while(v4 < v5) {
' int v1 = v0[v4];
' int v6 = v7 + 1;
' v8[v7] = v3[v1 >>> 4 & 15];
' v7 = v6 + 1;
' v8[v6] = v3[v1 & 15];
' ++v4;
' }
字节集到字节数组 (RC4Base (到字节集 (arg10), arg11), v0)
v3 = { “0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “A”, “B”, “C”, “D”, “E”, “F” }
v5 = 取数组成员数 (v0)
重定义数组 (v8, 假, v5 × 2)
判断循环首 (v4 < v5)
v1 = v0 [v4 + 1]
v6 = v7 + 1
v8 [v7 + 1] = v3 [位与 (右移 (v1, 4), 15) + 1]
v7 = v6 + 1
v8 [v6 + 1] = v3 [位与 (v1, 15) + 1]
v4 = v4 + 1
判断循环尾 ()
' v9 = new String(v8);
' }
' catch(Exception v2) {
' v2.printStackTrace();
' v9 = "";
' }
' }
' else {
' v9 = "";
' }
v9 = 字符数组到文本 (v8)
返回 (v9)
' return v9;
' }
子程序名返回值类型公开备 注
RC4_Decode文本型 
参数名类 型参考可空数组备 注
arg4文本型密文
arg5文本型密钥
变量名类 型静态数组备 注
v1文本型 
' public static String RC4解密(String arg4, String arg5) {
' String v1;
' if(arg4 != null && arg5 != null) {
' try {
' v1 = new String(test.RC4Base(test.HexString2Bytes(arg4), arg5), "GBK");
' }
' catch(Exception v0) {
' v0.printStackTrace();
' v1 = "";
' }
' }
' else {
' v1 = "";
' }
v1 = 到文本 (RC4Base (HexString2Bytes (arg4), arg5))
返回 (v1)
' return v1;
' }


忽略了所有try-catch结构和部分非空(!=null)判断,可能比较随意,也没什么大问题,自己优化吧。
预告:目前正在翻译论坛的易代码插件(dz内部名称ecode)……

评分

参与人数 1好评 +1 收起 理由
问心o + 1 易语言的是标准RC4

查看全部评分


结帖率:83% (5/6)

签到天数: 6 天

发表于 2017-2-10 11:16:04 | 显示全部楼层   浙江省金华市
支持。。。。。虽然没有看是什么。。。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2017-2-10 12:28:41 | 显示全部楼层   广东省东莞市
看不懂  ······
回复 支持 反对

使用道具 举报

发表于 2017-2-10 15:00:31 | 显示全部楼层   浙江省温州市
最近在分析基于E4A编写的安卓程序,于是就看到了E4A的rc4实现类,正好那个程序调用了这个加密,提取出加密代码作为java程序编译运行,加密结果跟易语言真的是……说天差地远应该也没什么问题。
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
发表于 2017-2-11 20:43:50 | 显示全部楼层   山东省临沂市
看看咯
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2017-3-3 11:10:16 | 显示全部楼层   四川省宜宾市
先下下来研究
回复 支持 反对

使用道具 举报

结帖率:96% (369/383)

签到天数: 1 天

发表于 2020-11-22 18:11:31 | 显示全部楼层   福建省福州市
RC4加密时效率太慢了,500KB的文本要加密个3分钟。。能否更快一些。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表