2016-11-27 63 views
-1

我有以下的Java代码:需要咨询有关Java代码sipnet转换为C#

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()依赖于应用程序(或系统?)字符集。
  • 转换后alogrithm可以不与一部开拓创新相同。

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

我做的一步一步的转换,所以我没有样品输入和输出数据,对不起。你会建议错误在哪里以及如何解决?

+1

欢迎来到Stack Overflow!它看起来像你需要学习使用调试器。请帮助一些[互补调试技术](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之后仍然有问题,请随时返回更多详情。 –

+0

@JoeC我已经使用调试器,我知道如何使用它(作为中级程序员)。问题是我不知道Java。请仔细阅读问题。 – Sakura

回答

0

后的搜索和阅读的时间,我找到了解决办法。 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); 
} 
1

你已经找到了解决方案,它是getBytes()/GetBytes()电话。您需要明确指定要使用的字节编码,并确保C#和Java都使用相同的字节编码。使用系统默认值在跨平台编写时通常是一个错误。选择一种编码:ASCII,UTF-8或其他,并明确指定它在两侧都是相同的。

+0

找到解决方案。看到我的答案。感谢您的帮助! – Sakura