开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 1657|回复: 7
收起左侧

[C/C++] 精易模块RC4加解密翻译成c++代码

[复制链接]
结帖率:0% (0/1)
发表于 2021-1-2 15:22:54 | 显示全部楼层 |阅读模式   上海市上海市
30精币
  
子程序名返回值类型公开备 注
校验_取rc4字节集 RC4校验,与易的输出形式一样,可能和其它校验程序输出形式不一样,可自行进行相应调整。
参数名类 型参考可空数组备 注
原文字节集需要加、解密的字节集
密码文本型输入相应的密码
变量名类 型静态数组备 注
m字节型256
i整数型 
j整数型 
key字节集 
密码长度整数型 
原文长度整数型 
结果字节集 
x整数型 
k字节型256
temp字节型 
原文长度 = 取字节集长度 (原文)
如果真 (原文长度 < 1)
返回 ({  })
密码长度 = 取文本长度 (密码)
结果 = 取空白字节集 (原文长度)
计次循环首 (256, i)
m [i] = i - 1
计次循环尾 ()
如果真 (密码长度 > 0)
key = 到字节集 (密码)
j = 1
计次循环首 (256, i)
k [i] = key [j]
j = j + 1
如果真 (j > 密码长度)
j = 1

计次循环尾 ()
j = 0
计次循环首 (256, i)
j = 位与 (j + m [i] + k [i], 255)
temp = m [i]
m [i] = m [j + 1]
m [j + 1] = temp
计次循环尾 ()
i = 0
j = 0
计次循环首 (原文长度, x)
i = 位与 (i + 1, 255)
j = 位与 (j + m [i + 1], 255)
temp = m [i + 1]
m [i + 1] = m [j + 1]
m [j + 1] = temp
结果 [x]位异或 (原文 [x], m [位与 (m [i + 1] + m [j + 1], 255) + 1])
计次循环尾 ()
返回 (结果)

自己翻译了一个小时,各种错误,麻烦各位大佬翻译成c++的代码,加解密结果要跟易语言调用的一样



回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:98% (55/56)

签到天数: 4 天

发表于 2021-1-2 15:39:41 | 显示全部楼层   湖南省娄底市
这个百d应该有
回复

使用道具 举报

结帖率:100% (1/1)
发表于 2021-1-2 16:30:17 | 显示全部楼层   山东省潍坊市
#include <iostream>
#include <string.h>
using namespace std;

//char -> 16
void char_2_Hex(char* Char, char* Hex)
{
    int length = strlen(Char);
    for (size_t i = 0; i < length; i++)
    {
        int tmp = int(Char[i]);
        if(Char[i] < 0)
        tmp = (-1) * Char[i] + 128;
        int high = tmp / 16;
        int low = tmp % 16;
        char HIHG;
        char LOW;

        if(high >= 10)
            HIHG = char(high - 10 + 65);
        else
            HIHG = char(high + 48);

        if(low >= 10)
            LOW = char(low - 10 + 65);
        else
            LOW = char(low + 48);

        Hex[2*i] = HIHG;
        Hex[2*i+1] = LOW;
    }
}

//16 -> char
void Hex_2_char(char*Hex, char* Char)
{
    int length = strlen(Hex) / 2;
    for (size_t i = 0; i < length; i++)
    {
        int high;
        int low;
        if(int(Hex[2*i])>=65)
            high = int(Hex[2*i] - 65 + 10);
        else
            high = int(Hex[2*i]- 48);
   
        if(int(Hex[2*i+1])>=65)
            low = int(Hex[2*i+1] - 65 + 10);
        else
            low = int(Hex[2*i+1] - 48);

        Char[i] = char(high*16 + low);
    }
}



char* RC4(char* C,char* key)
{
int S[256];
int T[256];

int  count = 0;
count = strlen(key);

for(int i = 0; i < 256; i++)
{
     S[i] = i;
     int tmp = i % count;
     T[i] = key[tmp];
}

int j = 0;

for(int  i = 0; i < 256; i++)
{
     j = (j + S[i] + T[i]) % 256;
     int tmp;
     tmp = S[j];
     S[j] = S[i];
     S[i] = tmp;
}

int length = 0;
length = strlen(C);

int i,j;
i=0,j=0;

for(int p = 0; p < length; p++)
{

    i = (i + 1) % 256;
    j = (j + S[i]) % 256;
    int tmp;
    tmp = S[j];
    S[j] = S[i];
    S[i] = tmp;
   
    int k = S[(S[i] + S[j]) % 256];
    C[p]=C[p]^k;
}

return C;
}


int main()
{

    char A[1000] = "aaaaaaaaaaa;
    cout << "C =" << A <<endl;
    char key[256] = "abcde";
    cout << "key = " << key <<endl;
    size_t  count = 0;
    count = strlen(A);


    char* B = RC4(A,key);
   
    char* M = new char[2*count];
   
    char_2_Hex(B,M);
   
    cout<<"M = " << M<<endl;

    char* C = RC4(B,key);
   
        cout <<"C' =  "<<C<<endl;

        system("pause");
    return 0;
}
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2021-1-3 08:43:45 | 显示全部楼层   上海市上海市
crush3517 发表于 2021-1-2 16:30
#include
#include
using namespace std;

你这源码不就是百d到的么,加密出来的不一样的,源码还有问题的,j重定义了,a没加双引号
回复

使用道具 举报

发表于 2021-5-14 14:36:47 | 显示全部楼层   福建省厦门市
int rc4(const char* key, int keyLen, const char* data, int dataLen, char* out)
{
        if (dataLen <= 0)
                return 0;

        uint8_t m[256] = {0};
        uint8_t k[256] = { 0 };
        for (int i = 0; i < 256;i++)
        {
                m[i]  = i;
        }

        int j = 0;
        for (int i = 0; i < 256;i++)
        {
                if (j >= keyLen)
                {
                        j = 0;
                }
                k[i] = key[j];
                j++;
               
        }
               
        j = 0;
        for (int i = 0; i < 256;i++)
        {
                j = (j + m[i] + k[i])% 256;
                int temp = m[i];
                m[i] = m[j];
                m[j] = temp;
        }
       
        int i = 0;
        j = 0;
        for (int x = 0; x < dataLen;x++)
        {
                i = (i + 1) % 256;
                j = (j + m[i]) % 256;
                int temp = m[i];
                m[i] = m[j];
                m[j] = temp;
                int t = (m[i] + m[j] % 256) % 256;
                out[x] = data[x] ^ m[t];
        }
               
               
        return 1;
}
回复

使用道具 举报

发表于 2021-5-14 14:38:52 | 显示全部楼层   福建省厦门市
.版本 2
.支持库 dp1

.程序集 窗口程序集1

.子程序 _按钮1_被单击
.局部变量 原字节集, 字节集
.局部变量 加密字节集, 字节集

原字节集 = 到字节集 (“原文本”)













加密字节集 = 加密数据 (原字节集, “诚信第一”, #RC4算法)
编辑框1.内容 = “加密数据 加密字节集:” + 字节集到文本 (加密字节集) + #换行符
加密字节集 = 数据操作_加密数据 (原字节集, “诚信第一”, 2)
编辑框1.内容 = 编辑框1.内容 + “数据操作_加密数据 加密字节集:” + 字节集到文本 (加密字节集)

原字节集 = 解密数据 (加密字节集, “诚信第一”, #RC4算法)
编辑框1.内容 = 编辑框1.内容 + “解密数据 原字节集:” + 字节集到文本 (原字节集)
原字节集 = 加密数据 (加密字节集, “诚信第一”, #RC4算法)  ' 其实加密和解密算法相同,再加密一次即还原
输出调试文本 (“ 加密数据 原字节集:” + 字节集到文本 (原字节集))
' 本源码来自易语言资源网(www.eyuyan.la)
原字节集 = 数据操作_解密数据 (加密字节集, “诚信第一”, 2)
编辑框1.内容 = 编辑框1.内容 + “数据操作_解密数据 原字节集:” + 字节集到文本 (原字节集)
原字节集 = 数据操作_加密数据 (加密字节集, “诚信第一”, 2)  ' 其实加密和解密算法相同,再加密一次即还原
编辑框1.内容 = 编辑框1.内容 + “数据操作_加密数据 原字节集:” + 字节集到文本 (原字节集)

.子程序 数据操作_加密数据, 字节集, , 其实加密和解密算法相同,再加密一次即还原
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.参数 加密算法, 整数型, 可空
.局部变量 返回字节集, 字节集

.如果真 (是否为空 (加密算法))
    加密算法 = 1
.如果真结束
.判断开始 (加密算法 = 1)
    ' 本源码来自易语言资源网(www.eyuyan.la)
.判断 (加密算法 = 2)
    返回字节集 = RC4 (字节集数据, 密码文本)
.默认

.判断结束
返回 (返回字节集)

.子程序 数据操作_解密数据, 字节集, , 其实加密和解密算法相同,再加密一次即还原
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.参数 加密算法, 整数型, 可空
.局部变量 返回字节集, 字节集

.如果真 (是否为空 (加密算法))
    加密算法 = 1
.如果真结束
.判断开始 (加密算法 = 1)
    ' 本源码来自易语言资源网(www.eyuyan.la)
.判断 (加密算法 = 2)
    返回字节集 = RC4 (字节集数据, 密码文本)
.默认

.判断结束
返回 (返回字节集)

.子程序 RC4, 字节集
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.局部变量 S, 字节型, , "256"
.局部变量 K, 字节型, , "256"
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 temp, 字节型, , , 交换字节用
.局部变量 Y, 整数型
.局部变量 Outp, 字节集
.局部变量 x, 整数型
.局部变量 t, 整数型
.局部变量 密码长度, 整数型

.计次循环首 (256, i)
    S = i - 1
.计次循环尾 ()
j = 1
密码长度 = 取文本长度 (密码文本)
.计次循环首 (256, i)
    .如果真 (j > 密码长度)
        j = 1  ' 重复取
    .如果真结束
    K = 取代码 (取文本中间 (密码文本, j, 1), 1)
    j = j + 1
    ' 本源码来自易语言资源网(www.eyuyan.la)
.计次循环尾 ()
j = 0
.计次循环首 (256, i)
    j = (j + S + K ) % 256
    temp = S   ' 交换字节
    S = S [j + 1]
    S [j + 1] = temp
.计次循环尾 ()
i = 0
j = 0
.计次循环首 (取字节集长度 (字节集数据), x)
    i = (i + 1) % 256
    j = (j + S [i + 1]) % 256
    temp = S [i + 1]  ' 交换字节
    S [i + 1] = S [j + 1]
    S [j + 1] = temp
    t = (S [i + 1] + S [j + 1] % 256) % 256
    Y = S [t + 1]  ' 注意要+1
    ' 本源码来自易语言资源网(www.eyuyan.la)
    Outp = Outp + 到字节集 (到字节 (位异或 (字节集数据 [x], Y)))
.计次循环尾 ()
返回 (Outp)

.子程序 字节集到文本, 文本型
.参数 字节集, 字节集
.局部变量 n, 整数型
.局部变量 文本, 文本型
.局部变量 单字节, 字节集
.局部变量 长度, 整数型

长度 = 取字节集长度 (字节集)
.计次循环首 (长度, n)
    单字节 = 取字节集中间 (字节集, n, 1)
    文本 = 文本 + 到文本 (取字节集数据 (单字节, #字节型, ))
    .如果真 (n < 长度)
        文本 = 文本 + “,”  ' 没有到最后一个都加逗号
    .如果真结束
    ' 本源码来自易语言资源网(www.eyuyan.la)
.计次循环尾 ()
返回 (“{ ” + 文本 + “ }”)

回复

使用道具 举报

发表于 2021-5-14 14:39:22 | 显示全部楼层   福建省厦门市
.版本 2
.支持库 dp1

.程序集 窗口程序集1

.子程序 _按钮1_被单击
.局部变量 原字节集, 字节集
.局部变量 加密字节集, 字节集

原字节集 = 到字节集 (“原文本”)













加密字节集 = 加密数据 (原字节集, “诚信第一”, #RC4算法)
编辑框1.内容 = “加密数据 加密字节集:” + 字节集到文本 (加密字节集) + #换行符
加密字节集 = 数据操作_加密数据 (原字节集, “诚信第一”, 2)
编辑框1.内容 = 编辑框1.内容 + “数据操作_加密数据 加密字节集:” + 字节集到文本 (加密字节集)

原字节集 = 解密数据 (加密字节集, “诚信第一”, #RC4算法)
编辑框1.内容 = 编辑框1.内容 + “解密数据 原字节集:” + 字节集到文本 (原字节集)
原字节集 = 加密数据 (加密字节集, “诚信第一”, #RC4算法)  ' 其实加密和解密算法相同,再加密一次即还原
输出调试文本 (“ 加密数据 原字节集:” + 字节集到文本 (原字节集))
' 本源码来自易语言资源网(www.eyuyan.la)
原字节集 = 数据操作_解密数据 (加密字节集, “诚信第一”, 2)
编辑框1.内容 = 编辑框1.内容 + “数据操作_解密数据 原字节集:” + 字节集到文本 (原字节集)
原字节集 = 数据操作_加密数据 (加密字节集, “诚信第一”, 2)  ' 其实加密和解密算法相同,再加密一次即还原
编辑框1.内容 = 编辑框1.内容 + “数据操作_加密数据 原字节集:” + 字节集到文本 (原字节集)

.子程序 数据操作_加密数据, 字节集, , 其实加密和解密算法相同,再加密一次即还原
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.参数 加密算法, 整数型, 可空
.局部变量 返回字节集, 字节集

.如果真 (是否为空 (加密算法))
    加密算法 = 1
.如果真结束
.判断开始 (加密算法 = 1)
    ' 本源码来自易语言资源网(www.eyuyan.la)
.判断 (加密算法 = 2)
    返回字节集 = RC4 (字节集数据, 密码文本)
.默认

.判断结束
返回 (返回字节集)

.子程序 数据操作_解密数据, 字节集, , 其实加密和解密算法相同,再加密一次即还原
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.参数 加密算法, 整数型, 可空
.局部变量 返回字节集, 字节集

.如果真 (是否为空 (加密算法))
    加密算法 = 1
.如果真结束
.判断开始 (加密算法 = 1)
    ' 本源码来自易语言资源网(www.eyuyan.la)
.判断 (加密算法 = 2)
    返回字节集 = RC4 (字节集数据, 密码文本)
.默认

.判断结束
返回 (返回字节集)

.子程序 RC4, 字节集
.参数 字节集数据, 字节集
.参数 密码文本, 文本型
.局部变量 S, 字节型, , "256"
.局部变量 K, 字节型, , "256"
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 temp, 字节型, , , 交换字节用
.局部变量 Y, 整数型
.局部变量 Outp, 字节集
.局部变量 x, 整数型
.局部变量 t, 整数型
.局部变量 密码长度, 整数型

.计次循环首 (256, i)
    S = i - 1
.计次循环尾 ()
j = 1
密码长度 = 取文本长度 (密码文本)
.计次循环首 (256, i)
    .如果真 (j > 密码长度)
        j = 1  ' 重复取
    .如果真结束
    K = 取代码 (取文本中间 (密码文本, j, 1), 1)
    j = j + 1
    ' 本源码来自易语言资源网(www.eyuyan.la)
.计次循环尾 ()
j = 0
.计次循环首 (256, i)
    j = (j + S + K ) % 256
    temp = S   ' 交换字节
    S = S [j + 1]
    S [j + 1] = temp
.计次循环尾 ()
i = 0
j = 0
.计次循环首 (取字节集长度 (字节集数据), x)
    i = (i + 1) % 256
    j = (j + S [i + 1]) % 256
    temp = S [i + 1]  ' 交换字节
    S [i + 1] = S [j + 1]
    S [j + 1] = temp
    t = (S [i + 1] + S [j + 1] % 256) % 256
    Y = S [t + 1]  ' 注意要+1
    ' 本源码来自易语言资源网(www.eyuyan.la)
    Outp = Outp + 到字节集 (到字节 (位异或 (字节集数据 [x], Y)))
.计次循环尾 ()
返回 (Outp)

.子程序 字节集到文本, 文本型
.参数 字节集, 字节集
.局部变量 n, 整数型
.局部变量 文本, 文本型
.局部变量 单字节, 字节集
.局部变量 长度, 整数型

长度 = 取字节集长度 (字节集)
.计次循环首 (长度, n)
    单字节 = 取字节集中间 (字节集, n, 1)
    文本 = 文本 + 到文本 (取字节集数据 (单字节, #字节型, ))
    .如果真 (n < 长度)
        文本 = 文本 + “,”  ' 没有到最后一个都加逗号
    .如果真结束
    ' 本源码来自易语言资源网(www.eyuyan.la)
.计次循环尾 ()
返回 (“{ ” + 文本 + “ }”)

回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 4 天

发表于 5 小时前 | 显示全部楼层   山东省青岛市
【动态加密】易语言与c/c++通用的动态加解密 ,纯源码 https://bbs.125.la/forum.php?mod=viewthread&tid=14840450
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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