加密算法
请问这个是什么加密算法,谁可以帮我翻译成c#,我翻译老不对,里面有些函数c#里没有,如asc
Function crypt(Action As String, Key As String, Src As String) As String
Dim Count As Integer, KeyPos As Integer, KeyLen As Integer, SrcAsc As Integer, dest As String, offset As Integer, TmpSrcAsc, SrcPos
KeyLen = Len(Key)
If Action = "E " Then
Randomize
offset = (Rnd * 10000 Mod 255) + 1
dest = Hex$(offset)
If Len(dest) = 1 Then
dest = "0 " + dest
End If
For SrcPos = 1 To Len(Src)
SrcAsc = (Asc(Mid$(Src, SrcPos, 1)) + offset) Mod 255
If KeyPos < KeyLen Then KeyPos = KeyPos + 1 Else KeyPos = 1
SrcAsc = SrcAsc Xor Asc(Mid$(Key, KeyPos, 1))
dest = dest + Format$(Hex$(SrcAsc), "@@ ")
offset = SrcAsc
Next
ElseIf Action = "D " Then
offset = Val( "&H " + Left$(Src, 2))
For SrcPos = 3 To Len(Src) Step 2
SrcAsc = Val( "&H " + Trim(Mid$(Src, SrcPos, 2)))
If KeyPos < KeyLen Then KeyPos = KeyPos + 1 Else KeyPos = 1
TmpSrcAsc = SrcAsc Xor Asc(Mid$(Key, KeyPos, 1))
If TmpSrcAsc <= offset Then
TmpSrcAsc = 255 + TmpSrcAsc - offset
Else
TmpSrcAsc = TmpSrcAsc - offset
End If
dest = dest + Chr(TmpSrcAsc)
offset = SrcAsc
Next
End If
crypt = dest
End Function
[解决办法]
//考虑字符中会出现汉字的情况,参考如下代码:
private string fCrypt(string Action, string Key, string Src)
{
int vKeyLen = Key.Length;
int vKeyPos = 0;
byte[] vKeyBuffer = Encoding.UTF8.GetBytes(Key);
if (Action == "E ")
{
byte[] vSrcBuffer = Encoding.UTF8.GetBytes(Src);
string vReturn = " ";
Random vRandom = new Random();
byte vOffset = (byte)vRandom.Next(256);
vReturn = vOffset.ToString( "X2 ");
foreach (byte vByte in vSrcBuffer)
{
byte vTemp = (byte)((vByte + vOffset) % 255);
vTemp ^= vKeyBuffer[vKeyPos];
vKeyPos = (vKeyPos + 1) % vKeyLen;
vReturn += vTemp.ToString( "X2 ");
vOffset = vTemp;
}
return vReturn;
}
else if (Action == "D ")
{
byte[] vDest = new byte[(Src.Length - 2) / 2];
int vOffset = int.Parse(Src.Substring(0, 2),
System.Globalization.NumberStyles.HexNumber);
for (int i = 2; i < Src.Length; i += 2)
{
byte vByte = (byte)int.Parse(Src.Substring(i, 2),
System.Globalization.NumberStyles.HexNumber);
byte vTemp = (byte)(vByte ^ vKeyBuffer[vKeyPos]);
if (vTemp <= vOffset)
vTemp = (byte)(255 + vTemp - vOffset);
else vTemp -= (byte)vOffset;
vKeyPos = (vKeyPos + 1) % vKeyLen;
vDest[i / 2 - 1] = vTemp;
vOffset = vByte;
}
return Encoding.UTF8.GetString(vDest);
}
return null;
}
private void button3_Click(object sender, EventArgs e)
{
string 原文 = "Zswang 路过 ";
string 钥文 = "接分 ";
string 密文 = fCrypt( "E ", 钥文, 原文);
MessageBox.Show(密文);
MessageBox.Show(fCrypt( "D ", 钥文, 密文));
}
[解决办法]
//原文翻译
public class VBCipher
{
public string fCrypt(string Action, string key, string Src)
{
int KeyPos = 0, KeyLen = 0, SrcAsc = 0, offset = 0, TmpSrcAsc, SrcPos;
string dest = " ";
// Let KeyLen = Len(key)
KeyLen = key.Length;
//If Action = "E " Then
if (Action == "E ")
{
// Randomize
System.Random rnd = new Random(unchecked((int)(System.DateTime.Now.Ticks)));
// offset = (Rnd * 10000 Mod 255) + 1
offset = Math.Abs((rnd.Next() * 10000 % 255) + 1);
// dest = Hex$(offset)
// If Len(dest) = 1 Then ' adds 0 in front of single digit hex numbers
// dest = "0 " + dest
// End If
dest = this.ChangeIntToHexString(offset);
// For SrcPos = 1 To Len(Src)
for (SrcPos = 0; SrcPos < Src.Length; SrcPos++)
{
// SrcAsc = (Asc(Mid$(Src, SrcPos, 1)) + offset) Mod 255
SrcAsc = (Convert.ToInt32(Src.Substring(SrcPos, 1).ToCharArray()[0]) + offset) % 255;
// If KeyPos < KeyLen Then KeyPos = KeyPos + 1 Else KeyPos = 1
if (KeyPos < KeyLen && SrcPos != 0) KeyPos = KeyPos + 1;
else KeyPos = 0;
// SrcAsc = SrcAsc Xor Asc(Mid$(key, KeyPos, 1))
SrcAsc = SrcAsc ^ Convert.ToInt32(key.Substring(KeyPos, 1).ToCharArray()[0]);
// dest = dest + Format$(Hex$(SrcAsc), "@@ ")
dest = dest + this.ChangeIntToHexString(SrcAsc);
// offset = SrcAsc
offset = SrcAsc;
}
// Next
}
// ElseIf Action = "D " Then
else if (Action == "D ")
{
//offset = Val( "&H " + Left$(Src, 2))
offset = Convert.ToInt32(Src.Substring(0, 2), 16);
// For SrcPos = 3 To Len(Src) Step 2
for (SrcPos = 2; SrcPos < Src.Length; SrcPos = SrcPos + 2)
{
// SrcAsc = Val( "&H " + Trim(Mid$(Src, SrcPos, 2)))
SrcAsc = Convert.ToInt32(Src.Substring(SrcPos, 2).Trim(), 16);
// If KeyPos < KeyLen Then KeyPos = KeyPos + 1 Else KeyPos = 1
if (KeyPos < KeyLen && SrcPos != 2) KeyPos = KeyPos + 1;
else KeyPos = 0;
// TmpSrcAsc = SrcAsc Xor Asc(Mid$(key, KeyPos, 1))
TmpSrcAsc = SrcAsc ^ Convert.ToInt32(key.Substring(KeyPos, 1).ToCharArray()[0]);
// If TmpSrcAsc <= offset Then
// TmpSrcAsc = 255 + TmpSrcAsc - offset
// Else
// TmpSrcAsc = TmpSrcAsc - offset
// End If
if (TmpSrcAsc <= offset) TmpSrcAsc = 255 + TmpSrcAsc - offset;
else TmpSrcAsc = TmpSrcAsc - offset;
// dest = dest + Chr(TmpSrcAsc)
dest = dest + (char)TmpSrcAsc;
// offset = SrcAsc
offset = SrcAsc;
// Next
}
}
// Let fCrypt = dest
return dest;
}
private string ChangeIntToHexString(int Input)
{
string cRet = " ";
cRet = Convert.ToString(Input,16);
if (cRet.Length == 1) cRet = "0 " + cRet;
return cRet;
}
}