需要咨询关于将 Java 代码 sipnet 转换为 c#
Need consult about convert a Java code sipnet to c#
我有以下 Java 代码:
static final String KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] bArr = null;
Key key = new SecretKeySpec(KEY_STRING.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(2, key);
bArr = cipher.doFinal(encrypt);
return bArr;
}
我想将它翻译成 c#。这是我的工作:
const string KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
cryptoProvider.Key = key;
using (MemoryStream mm = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(mm,
cryptoProvider.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encrypt, 0, encrypt.Length);
}
return mm.ToArray();
}
}
但它不会给出与 Java 代码相同的结果。
我不知道 Java。但是根据我的搜索,我想我可能有以下错误:
key
可能不一样,因为 KEY_STRING.getBytes()
取决于应用程序(或系统?)字符集。
- 转换后的算法可能和原来的不一样
我也收到错误 The specificed key is not valid size
.
我正在进行逐步转换,所以我没有样本输入和输出数据,抱歉。你能建议错误在哪里以及如何解决吗?
您已经找到了您的解决方案,它是 getBytes()
/ GetBytes()
调用。您需要明确指定要使用的字节编码,并确保 C# 和 Java 使用相同的字节编码。使用系统默认值通常是跨平台编写的错误。选择一种编码:ASCII、UTF-8 或其他编码,并明确指定它在两边都相同。
经过数小时的搜索和阅读,我找到了解决方案。 Java 中的默认密码模式是 ECB,而在 C# 中是 CBC。下面是工作代码:
const string KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);
DESCryptoServiceProvider cp = new DESCryptoServiceProvider();
cp.Mode = CipherMode.ECB;
cp.Key = bytes;
ICryptoTransform i = cp.CreateDecryptor();
return i.TransformFinalBlock(encrypt, 0, encrypt.Length);
}
我有以下 Java 代码:
static final String KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] bArr = null;
Key key = new SecretKeySpec(KEY_STRING.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(2, key);
bArr = cipher.doFinal(encrypt);
return bArr;
}
我想将它翻译成 c#。这是我的工作:
const string KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
cryptoProvider.Key = key;
using (MemoryStream mm = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(mm,
cryptoProvider.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encrypt, 0, encrypt.Length);
}
return mm.ToArray();
}
}
但它不会给出与 Java 代码相同的结果。
我不知道 Java。但是根据我的搜索,我想我可能有以下错误:
key
可能不一样,因为KEY_STRING.getBytes()
取决于应用程序(或系统?)字符集。- 转换后的算法可能和原来的不一样
我也收到错误 The specificed key is not valid size
.
我正在进行逐步转换,所以我没有样本输入和输出数据,抱歉。你能建议错误在哪里以及如何解决吗?
您已经找到了您的解决方案,它是 getBytes()
/ GetBytes()
调用。您需要明确指定要使用的字节编码,并确保 C# 和 Java 使用相同的字节编码。使用系统默认值通常是跨平台编写的错误。选择一种编码:ASCII、UTF-8 或其他编码,并明确指定它在两边都相同。
经过数小时的搜索和阅读,我找到了解决方案。 Java 中的默认密码模式是 ECB,而在 C# 中是 CBC。下面是工作代码:
const string KEY_STRING = "MOGO_APP";
public static byte[] decrypt(byte[] encrypt)
{
byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);
DESCryptoServiceProvider cp = new DESCryptoServiceProvider();
cp.Mode = CipherMode.ECB;
cp.Key = bytes;
ICryptoTransform i = cp.CreateDecryptor();
return i.TransformFinalBlock(encrypt, 0, encrypt.Length);
}