需要咨询关于将 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。但是根据我的搜索,我想我可能有以下错误:

我也收到错误 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); 
}