[英]how to convert function from VB.net to C#?
I have this function in VB.net and I am trying to convert this code from VB to C#. 我在VB.net中具有此功能,并且正在尝试将此代码从VB转换为C#。
Function HashEncode(strSecret)
' Function takes an ASCII string less than 2^61 characters long and
' one way hash encrypts it using 160 bit encryption into a 40 digit hex value.
' The encoded hex value cannot be decoded to the original string value.
'
' This is the only function that you need to call for encryption.
'
' Written By: Mark G. Jager
' Written Date: 8/10/2000
'
' Free to distribute as long as code is not modified, and header is kept intact
'
' The author makes no warranties as to the validity, and/or authenticity of this code.
' You may use any code found herein at your own risk.
' This code was written to follow as closely as possible the standards found in
' Federal Information Processing Standards Publication (FIPS PUB 180-1)
' http://csrc.nist.gov/fips/fip180-1.txt -- Secure Hash Standard SHA-1
'
' This code is for private use only, and the security and/or encryption of the resulting
' hexadecimal value is not warrented or gaurenteed in any way.
'
Dim strEncode, strH(4)
Dim intPos
If len(strSecret) = 0 or len(strSecret) >= 2^61 then
HashEncode = "0000000000000000000000000000000000000000"
exit function
end if
'Initial Hex words are used for encoding Digest.
'These can be any valid 8-digit hex value (0 to F)
strH(0) = "FB0C14C2"
strH(1) = "9F00AB2E"
strH(2) = "991FFA67"
strH(3) = "76FA2C3F"
strH(4) = "ADE426FA"
For intPos = 1 to len(strSecret) step 56
strEncode = Mid(strSecret, intPos, 56) 'get 56 character chunks
strEncode = WordToBinary(strEncode) 'convert to binary
strEncode = PadBinary(strEncode) 'make it 512 bites
strEncode = BlockToHex(strEncode) 'convert to hex value
'Encode the hex value using the previous runs digest
'If it is the first run then use the initial values above
strEncode = DigestHex(strEncode, strH(0), strH(1), strH(2), strH(3), strH(4))
'Combine the old digest with the new digest
strH(0) = HexAdd(left(strEncode, 8), strH(0))
strH(1) = HexAdd(mid(strEncode, 9, 8), strH(1))
strH(2) = HexAdd(mid(strEncode, 17, 8), strH(2))
strH(3) = HexAdd(mid(strEncode, 25, 8), strH(3))
strH(4) = HexAdd(right(strEncode, 8), strH(4))
Next
'This is the final Hex Digest
HashEncode = strH(0) & strH(1) & strH(2) & strH(3) & strH(4)
End Function
I have converted it in C# as 我已经在C#中将其转换为
public string HashEncode(string strSecret)
{
string strEncode;
string[] strH = new string [4];
int intPos;
if (strSecret.Length == 0 || strSecret.Length >= Int64.MaxValue)
{
return "0000000000000000000000000000000000000000";
//break;
}
//Initial Hex words are used for encoding Digest.
//These can be any valid 8-digit hex value (0 to F)
strH[0] = "FB0C14C2";
strH[1] = "9F00AB2E";
strH[2] = "991FFA67";
strH[3] = "76FA2C3F";
strH[4] = "ADE426FA";
for(intPos = 1; intPos < strSecret.Length; intPos += 56)
{
strEncode = strSecret.Substring(intPos, strSecret.IndexOf(" ", 56));
//strEncode = Mid(strSecret, intPos, 56); //get 56 character chunks
strEncode = WordToBinary(strEncode); //convert to binary
strEncode = PadBinary(strEncode); //make it 512 bites
strEncode = BlockToHex(strEncode); //convert to hex value
//Encode the hex value using the previous runs digest
//If it is the first run then use the initial values above
strEncode = DigestHex(strEncode, strH[0], strH[1], strH[2], strH[3], strH[4]);
//Combine the old digest with the new digest
//strH[0] = HexAdd(left(strEncode, 8), strH[0]);
//strH[1] = HexAdd(mid(strEncode, 9, 8), strH[1]);
//strH[2] = HexAdd(mid(strEncode, 17, 8), strH[2]);
//strH[3] = HexAdd(mid(strEncode, 25, 8), strH[3]);
//strH[4] = HexAdd(right(strEncode, 8), strH[4]);
strH[0] = HexAdd(strEncode.Substring(0, 8), strH[0]);
strH[1] = HexAdd(strEncode.Substring(9, 8), strH[1]);
strH[2] = HexAdd(strEncode.Substring(17, 8), strH[2]);
strH[3] = HexAdd(strEncode.Substring(25, 8), strH[3]);
strH[4] = HexAdd(strEncode.Substring(strEncode.Length - 8,8),strH[4]);
}
//This is the final Hex Digest
return strH[0] + strH[1] + strH[2] + strH[3] + strH[4];
}
It successfully compiled but not working. 它已成功编译,但无法正常工作。 It gives exception at for loop as 'System.IndexOutOfRangeException was unhandled by user' Is anyone help me to solve this problem
它在for循环中给出了异常,因为“ System.IndexOutOfRangeException未由用户处理”有人帮助我解决了这个问题
The code is an implementation of the SHA-1 algorithm, correct? 该代码是SHA-1算法的实现,对吗? In that case:
在这种情况下:
using System.Security.Cryptography;
using System.Text;
string str = "foobar";
byte[] data = Encoding.ASCII.GetBytes(str);
SHA1 sha = new SHA1Managed();
byte[] hash = sha.ComputeHash(data);
Console.WriteLine(String.Concat(Array.ConvertAll(hash, x => x.ToString("X2"))));
Translation complete. 翻译完成。
Your 'for' loop is wrong for a couple of reasons: 1. the ending condition is incorrect - strSecret.Length has to be included if you start your indexing at 1. 2. when converting the legacy VB string functions, you have to be aware that they use 1-based indexing, while the .NET methods use 0-based indexing. 您的“ for”循环是错误的,原因有两个:1.结束条件不正确-如果从1开始索引,则必须包含strSecret.Length。2.转换旧版VB字符串函数时,必须请注意,他们使用基于1的索引,而.NET方法使用基于0的索引。
for (int intPos = 1; intPos <= strSecret.Length; intPos += 56)
{
strEncode = strSecret.ToString().Substring(intPos - 1, 56); //get 56 character chunks
strEncode = WordToBinary(strEncode); //convert to binary
strEncode = PadBinary(strEncode); //make it 512 bites
strEncode = BlockToHex(strEncode); //convert to hex value
//Encode the hex value using the previous runs digest
//If it is the first run then use the initial values above
strEncode = DigestHex(strEncode, strH[0], strH[1], strH[2], strH[3], strH[4]);
//Combine the old digest with the new digest
strH[0] = HexAdd(strEncode.Substring(0, 8), strH[0]);
strH[1] = HexAdd(strEncode.Substring(8, 8), strH[1]);
strH[2] = HexAdd(strEncode.Substring(16, 8), strH[2]);
strH[3] = HexAdd(strEncode.Substring(24, 8), strH[3]);
strH[4] = HexAdd(strEncode.Substring(strEncode.Length - 8), strH[4]);
}
You also could use: 您还可以使用:
for (int intPos = 0; intPos < strSecret.Length; intPos += 56)
{
strEncode = strSecret.ToString().Substring(intPos, 56); //get 56 character chunks
... (rest is identical)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.