思路转移解决: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);
}
原先的想法:
使用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);
}
相关文章推荐
- 某壳对.Net程序加密的原理及解密探讨五(元数据还原以及IL解码的改进)
- MaxtoCode对.Net程序加密的原理及解密探讨二
- MaxtoCode对.Net程序加密的原理及解密探讨一
- 关于解决RSA非对称加密时,将密文存入数据库取出后,再对密文解密的时候抛出javax.crypto.BadPaddingException: Data must start with zero
- MaxtoCode对.Net程序加密的原理及解密探讨三(实例解密)
- 某壳对.Net程序加密的原理及解密探讨一
- Java与.Net环境下RSA加密解密交互不成功的问题解决
- MaxtoCode对.Net程序加密的原理及解密探讨
- 某壳对.Net程序加密的原理及解密探讨二
- Maxtocode对.Net程序加密的原理及解密探讨二
- Maxtocode对.Net程序加密的原理及解密探讨四(翻译IL字节码)
- Maxtocode对.Net程序加密的原理及解密探讨五(元数据还原以及IL解码的改进)
- C++/Qt中一个简单的加密解密程序
- OD学习笔记10:一个VB程序的加密和解密思路
- 某壳对.Net程序加密的原理及解密探讨四(翻译IL字节码)
- MaxtoCode对.Net程序加密的原理及解密探讨一
- RSA 加密解密 关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
- 一个简单的C++加密,解密文件程序
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- MaxtoCode对.Net程序加密的原理及解密探讨一