C# 从Java到C的翻译:重新编码字符串的简单代码
发送此公式是为了加密用Java编写的字符串: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
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));