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

原先使用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);
}

你可能感兴趣的:(C++,.net,加密,解密,byte,output)