using System; >>using System.Linq; >>using System.Text; >> >>namespace Cipher >>{ >> public class Cipher >> { >> private const int PwMinNum = 1000; >> >> public string Encrypt(string tcStr, string tcPassword) >> { >> byte[] tcStrBytes = Encoding.ASCII.GetBytes(tcStr); >> int tcStrLength = tcStrBytes.Length; >> >> string lcPassword = tcPassword + '0'; >> byte[] lcPasswordBytes = Encoding.ASCII.GetBytes(lcPassword); >> int lnPassLen = lcPasswordBytes.Length - 1; >> >> int lnPassPos = 0; >> >> string lcStrOut = string.Empty; >> >> int lnPassNum = ((CipherGetPnum(lcPassword)/997 - 1)%254) + 1; >> >> for (int i = 0; i < tcStrLength;i++) >> { >> int lnNum01 = ((lnPassNum + (i - tcStrLength)) - 1); >> lnPassNum = (Math.Abs(lnNum01)%254)*Math.Sign(lnNum01) + 1; >> var lnByte = tcStrBytes[i] ^ (lnPassNum ^ lcPasswordBytes[lnPassPos]); >> lnByte = lnByte & 0xFF; >> lcStrOut = lcStrOut + (lnByte == 0 ? Convert.ToChar( tcStrBytes[i + 1]) : Convert.ToChar(lnByte)); >> lnPassPos = lnPassPos>=lnPassLen ? 1:lnPassPos + 1; >> } >> return lcStrOut; >> } >> >> private int CipherGetPnum(string tcStr) >> { >> byte[] ascii = Encoding.ASCII.GetBytes(tcStr); >> int liRet = 1 + ascii.Select((t, i) => t + i).Sum(); >> >> while (liRet < PwMinNum) >> { >> liRet = liRet << 1; >> } >> return liRet; >> } >> } >>}>
> public class VfpCipher > { > > public static string Cipher(string cString, string tcPassword) > { > string lcPassword; > int lnPassLen; > int lnPassPos; > int iAsciiValue; > int lnPassNum; > int lnStrLen; > > lnStrLen = cString.Length; > > char ChrZero; > ChrZero = (char)0; > > lcPassword = tcPassword + ChrZero.ToString(); // in VFP this was add CHR(0) to the Password string > lnPassLen = lcPassword.Length; > > int[] laPassword = new int[lnPassLen+1]; > for (lnPassPos = 0; lnPassPos < lnPassLen; lnPassPos++) > { > // Get one-character from the Password string and store the ASC()/ASCII value of it to the array. > var charByte = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPassword.Substring(lnPassPos, 1)); > laPassword[lnPassPos] = Convert.ToInt32(charByte[0]); > } > > // Get seed value > lnPassNum = (int)((((CipherGetPnum(lcPassword) / 997) - 1) % 254) + 1); > > int lnByte; > string lcStrOut = ""; > lnPassPos = 0; // in VFP this is 1 but in C# the array is zero-based. > int lnNum01; > > // Encode/decode each character > for (int lnInPos=0; lnInPos < lnStrLen-1; lnInPos++) > { > // Get new seed value > lnNum01 = (( lnPassNum + (lnInPos - lnStrLen)) - 1); > lnPassNum = ( Math.Abs(lnNum01) % 254 ) * Math.Sign(lnNum01) + 1; > > // Get the character byte and extract the ASCII value of the character. > var charByte = System.Text.Encoding.GetEncoding(1252).GetBytes(cString.Substring(lnInPos, 1)); > > iAsciiValue = Convert.ToInt32(charByte[0]); > lnByte = (iAsciiValue ^ (lnPassNum ^ laPassword[lnPassPos])); > > // Convert signed value to unsigned, if necessary > lnByte = lnByte & 0xFF; > > // If result is zero, use current character > // Get one character string value of lnByte > char cOneChar; > cOneChar = (char)lnByte; > string sOneChar; > sOneChar = cOneChar.ToString(); > lcStrOut = lcStrOut + (lnByte.Equals(0) ? cString.Substring(lnInPos, 1) : sOneChar); > > lnPassPos = (lnPassPos.CompareTo(lnPassLen-1) >= 0 ? 0 : lnPassPos + 1); > } > > return lcStrOut; > > } > > public static int CipherGetPnum(string SeedString) > { > int liRet = 1; > int iAsciiValue; > for (int lnPos = 0; lnPos < SeedString.Length; lnPos++) > { > var charByte = System.Text.Encoding.GetEncoding(1252).GetBytes(SeedString.Substring(lnPos, 1)); > iAsciiValue = Convert.ToInt32(charByte[0]); > liRet = liRet + iAsciiValue + lnPos; > } > > // Note that in Sergey's code the value 1000 is declared as constant. > do > { > liRet = liRet << 1; > } while (liRet < 1000); > > return liRet; > > } > } >Hmm. Does that work correctly - looks as if you are not processing the last character of the string to be encrypted ?