首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

加密算法解决办法

2012-02-11 
加密算法请问这个是什么加密算法,谁可以帮我翻译成c#,我翻译老不对,里面有些函数c#里没有,如ascFunctioncr

加密算法
请问这个是什么加密算法,谁可以帮我翻译成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;
}
}

热点排行