我有以下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()
取决于app(或系统?)字符集。我也收到错误 The specificed key is not valid size
。
我正在逐步转换,所以我没有样本输入和输出数据,抱歉。你会建议错误在哪里以及如何修复它?
答案 0 :(得分:1)
您已经找到了解决方案,这是getBytes()
/ GetBytes()
次来电。您需要明确指定要使用的字节编码,并确保C#和Java都使用相同的字节编码。使用系统默认通常是跨平台编写的错误。选择编码:ASCII,UTF-8或其他任何内容,并明确指定它在两边都是相同的。
答案 1 :(得分:0)
经过几个小时的搜索和阅读,我找到了解决方案。 Java中的默认密码模式为 ECB ,而C#中的默认密码模式为 CBC 。 Bellowing是工作代码:
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);
}