C# 从Java到C的翻译:重新编码字符串的简单代码

C# 从Java到C的翻译:重新编码字符串的简单代码,c#,java,encryption,translation,C#,Java,Encryption,Translation,发送此公式是为了加密用Java编写的字符串: String myInput = "test1234"; MessageDigest md = MessageDigest.getInstance("SHA"); byte[] myD = md.digest(myInput.getBytes()); BASE64Encoder en64 = new BASE64Encoder(); String myOutput = new Strin

发送此公式是为了加密用Java编写的字符串:

String        myInput = "test1234";
MessageDigest      md = MessageDigest.getInstance("SHA");
byte[]            myD = md.digest(myInput.getBytes());
BASE64Encoder    en64 = new BASE64Encoder();
String       myOutput = new String ( 
                            Java.net.URLEncoder.encode( en64.encode(myD)));
// myOutput becomes "F009U%2Bx99bVTGwS3cQdHf%2BJcpCo%3D"
我们试图用C语言编写这篇文章:

System.Security.Cryptography.SHA1 sha1 = 
    new System.Security.Cryptography.SHA1CryptoServiceProvider();
string myOutput = HttpUtility.UrlEncode( 
                      Convert.ToBase64String( 
                          sha1.ComputeHash( 
                              ASCIIEncoding.Default.GetBytes(myInput))));

然而,输出却不尽相同。它甚至没有百分号。有没有可能有人知道我们哪里出了问题?

在您的C版本中,我建议您尝试一下,而不是您当前的版本


如果不指定,Java方法将使用平台的默认编码。该平台的默认编码不太可能是ASCII。

在您的C版本中,我建议尝试,或者不使用当前的编码


如果不指定,Java方法将使用平台的默认编码。平台的默认编码不太可能是ASCII。

我建议您将其分解

1-比较从Java String.getBytes和.NET Encoding.getBytes返回的内容 下面是一些.NET代码,它将为每个编码转储字符串的字节,并将结果与来自Java的结果进行比较

string myInput = "test1234";
foreach (EncodingInfo ei in Encoding.GetEncodings())
{
  byte[] bytes = ei.GetEncoding().GetBytes(myInput);
  Console.WriteLine("{0}\t\t{1}", 
    BitConverter.ToString(bytes), ei.DisplayName);
}
2-如果从步骤1中找到正确的编码,请转至下一步。比较Java和.NET中相同字节的SHA1哈希。这应该是匹配的,但我喜欢有条不紊,从不做假设,尤其是当假设快速且易于验证时

3-一旦您显示您有相同的SHA1字节,您就可以进行Base64编码和比较


4-最后执行Url编码,如果你做到这一点,我怀疑你会发现大小写的不同。IIRC.NET Url encode使用小写,从您的示例中,我看到Java使用大写,例如Java中的%3D可能是.NET中的%3D。

我建议您将其分解

1-比较从Java String.getBytes和.NET Encoding.getBytes返回的内容 下面是一些.NET代码,它将为每个编码转储字符串的字节,并将结果与来自Java的结果进行比较

string myInput = "test1234";
foreach (EncodingInfo ei in Encoding.GetEncodings())
{
  byte[] bytes = ei.GetEncoding().GetBytes(myInput);
  Console.WriteLine("{0}\t\t{1}", 
    BitConverter.ToString(bytes), ei.DisplayName);
}
2-如果从步骤1中找到正确的编码,请转至下一步。比较Java和.NET中相同字节的SHA1哈希。这应该是匹配的,但我喜欢有条不紊,从不做假设,尤其是当假设快速且易于验证时

3-一旦您显示您有相同的SHA1字节,您就可以进行Base64编码和比较


4-最后执行Url编码,如果你做到这一点,我怀疑你会发现大小写的不同。IIRC.NET Url encode使用小写,从您的示例中,我看到Java使用大写,例如,Java中的%3D在.NET中可能是%3D。

就像LukeH说的那样,如果在同一台机器上运行Java版本和C版本,您可以尝试将C版本中的编码更改为encoding.Default.GetBytesmyInput

如果失败或不是选项,您可以始终尝试打印字节值,并将其与Java中的相应步骤进行比较,以找出错误所在:

String myInput = "test1234";
System.Security.Cryptography.SHA1 crypto = new System.Security.Cryptography.SHA1CryptoServiceProvider();
Byte[] myInputBytes = Encoding.Default.GetBytes(myInput);
Console.WriteLine(BitConverter.ToString(myInputBytes));
Byte[] hash = crypto.ComputeHash(myInputBytes);
Console.WriteLine(BitConverter.ToString(hash));

正如LukeH所说,如果在同一台机器上同时运行Java版本和C版本,则可以尝试将C版本中的编码更改为encoding.Default.GetBytesmyInput

如果失败或不是选项,您可以始终尝试打印字节值,并将其与Java中的相应步骤进行比较,以找出错误所在:

String myInput = "test1234";
System.Security.Cryptography.SHA1 crypto = new System.Security.Cryptography.SHA1CryptoServiceProvider();
Byte[] myInputBytes = Encoding.Default.GetBytes(myInput);
Console.WriteLine(BitConverter.ToString(myInputBytes));
Byte[] hash = crypto.ComputeHash(myInputBytes);
Console.WriteLine(BitConverter.ToString(hash));