需要咨询有关将Java代码sipnet转换为c#的信息

时间:2016-11-27 11:22:36

标签: java c# cryptography des

我有以下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(或系统?)字符集。
  • 转换的算法可能与orignal不同。

我也收到错误 The specificed key is not valid size

我正在逐步转换,所以我没有样本输入和输出数据,抱歉。你会建议错误在哪里以及如何修复它?

2 个答案:

答案 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); 
}