Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
How to call VFP function from .NET C# code?
Message
De
04/01/2015 13:24:19
 
 
Information générale
Forum:
ASP.NET
Catégorie:
Autre
Versions des environnements
Environment:
VB 9.0
OS:
Windows Server 2012
Network:
Windows 2008 Server
Database:
MS SQL Server
Application:
Web
Divers
Thread ID:
01612997
Message ID:
01613028
Vues:
67
>>>>>>If all this function does is encrypt a password there are lots of examples written in c# out there ( Google is your friend )
>>>>>
>>>>>I did but so for I could not find a simple enough c# encrypt function that can be "duplicated" in VFP. You see I need a function that would do the same from VFP and c# end.
>>>>>Thank you.
>>>>
>>>>Presumably you mean that the C# version should be usable with strings already encoded using the VFP cipher library that you mentioned?
>>>>
>>>>Al's pointer to Rick's paper is still valid - you could create a small VFP com interop which could be accessed from .net.
>>>>
>>>>But which functions of that library do you actually use ? - the core encryption is fairly straightforward.
>>>>I took a look at the original C code and it would seem that a C# version should be simple enough to implement......
>>>
>>>The function cipher() I am using in VFP code is written in VFP; not in C. Maybe Sergey also wrote it in C but the one he recommended to me years ago was the VFP function. To be honest, I don't even understand all VFP functions he used in creating the cipher(). So converting/rewriting it to C# would be a great challenge.
>>
>>The VFP code was based on a C conversion and there's a link to the C source - you might find that easier to convert to C# (or not :-} )
>
>Do you know where I can find the DLL (I presume tha the C code was built into a DLL) file that uses this C code? And maybe it has the C code there as well.

Does this work (not properly tested and could certainly be improved):
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;
        }
    }
}
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform