您的位置:首页 > 编程语言 > C语言/C++

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

2012-10-12 15:34 579 查看
原先使用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
;

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐