思路转移解决:C++ Crypto加密的程序在.net中解密

本文介绍了一种解决跨语言RC4加密问题的方法。起初尝试使用C#实现RC4算法来解密C++加密的数据,但未能成功。最终通过将C++的解密部分封装为DLL,并从C#中调用该DLL,成功实现了不同语言间的加密数据互操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原先使用C++使用Crypto使用RC4加密算法进行数据加密。原先在Delphi中使用但是最近使用asp.net编写一个BS结构的程序来访问经过C++ Crypto加密的数据。走了很多弯路。

原先的想法:

使用C#来实现RC4,在网上查找了许多的代码,如:

public class RC4Crypto

{

        private const int N = 256;
       
        private byte[] GetKey(string password)
        {
            byte[] keypass= HexConverter.StrToHexBytes(password);
            int i, j, k;
            byte tempbyte;

            byte[] sbox = new byte[N];
            for (i = 0; i < N; i++)
            {
                sbox[i] = Convert.ToByte(i);
            }
            j = 0;
            k = keypass.Length;
            for (i = 0; i < N; i++)
            {
                j = (j + sbox[i] + keypass[i % k]) % N;

                tempbyte = sbox[i];
                sbox[i] = sbox[j];
                sbox[j] = tempbyte;
            }

            keypass= null;

            return sbox;
        }

       //注意下面的代码的问题。
        public byte[] Decrypt(byte[] enary, string password)
        {
            if (enary == null) return null;

            byte[] output = new byte[enary.Length];
            int i = 0, j = 0;
            byte tempbyte, tempbyte2;

            byte[] sbox = GetKey(password);

            for (int offset = 0; offset < enary.Length; offset++)
            {
                i = (i + 1) % N;
                j = (j + sbox[i]) % N;

                tempbyte = sbox[i];
                sbox[i] = sbox[j];
                sbox[j] = tempbyte;

                tempbyte = enary[offset];
                tempbyte2 = sbox[(sbox[i] + sbox[j]) % N];

                output[offset] = Convert.ToByte((Int32)tempbyte ^ (Int32)tempbyte2);
            }

            return output;
        }

}

使用如上的代码解密C++ Crypto加密的数据流还是失败。

经过网上查找找到了思路:

整理C++写的代码解密部分封装成dll形式然后C#来调用。这是最佳的方案。经过试验OK!

C#中的引用dll的代码

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace NetworkGrain.Crypto
{
    public class RC4Crypto
    {
        [DllImport("Encrypt.dll",CharSet=CharSet.Unicode)]
        public static extern int DecryptData(ref byte dataAry, ref UInt32 dwArySize);
    }
}

在C++中的dll代码

extern "C" __declspec(dllexport) long __stdcall DecryptData(LPBYTE lpDataBuff, LPDWORD lpBuffSize)
{
    return g_Encrypt.DecryptData(lpDataBuff, lpBuffSize);
}

syncrypto可以用来将一个文件夹里面所有文件同步到另外一个加密的文件夹中, 一般来说,可以这样使用: syncrypto                         syncrypto 文件夹A  <---------------------> 加密文件夹B <-------------------> 文件夹C  机器X              (可以放在不安全的地方,例如云存储                机器Y 加密文件夹B中的文件都是加密过的,所以可以把它放在不怎么安全的地方(例如云盘,公共硬盘等) 明文文件和加密文件是一一对应的关系,所以每次同步只会添加(删除/修改)那些需要的文件,这样 很适合那些基于文件系统的同步工具,例如云盘、rsync等。 同步过程是双向的,所以,文件不仅仅是从明文文件夹同步到加密文件夹,同样也会从加密文件夹同步到 明文文件夹,syncrypto会根据算法选择最新的。 如果有冲突的话,syncrypto会将明文文件重命名(加上单词conflict),然后将密文文件同步过来 syncrypto是不会删除文件的,如果同步过程中需要删除或者覆盖文件,syncrypto会将文件移动 到废纸篓里面。密文文件夹的废纸篓在_syncrypto/trash下,明文文件夹的废纸篓在 .syncrypto/trash下。密文文件夹废纸篓里面的文件一样是加密过的。 主要 Feature : 双向加密同步 加密文件与明文文件是一一对应的关系 灵活的同步规则配置(方便将某些不必要同步的文件排除) 同时支持 Python2,Python3, Windows, Linux, OS X 比较全面的测试用例覆盖 标签:syncrypto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值