[英]how to convert function from VB.net 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
我已经在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];
}
它已成功编译,但无法正常工作。 它在for循环中给出了异常,因为“ System.IndexOutOfRangeException未由用户处理”有人帮助我解决了这个问题
该代码是SHA-1算法的实现,对吗? 在这种情况下:
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"))));
翻译完成。
您的“ 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]);
}
您还可以使用:
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.