Solved

Vigenere Cipher - variation

Posted on 2010-08-26
33
1,341 Views
Last Modified: 2012-05-10
I need a variation of the Vigenere Cipher

http://delphi.about.com/od/fullcodeprojects/a/vigenere-cipher-delphi-implementation-fdac-49.htm

which will take flags that turn on and off options

I would like it to default to just the original Vigenere Cipher using the capital characters 'A' - 'Z'

but the function should include flags to turn on or off additional charactees

   lowercase alphabet    'a' - 'z',    
   numeric                        0..9
   special characters      ~`!@#$%^&*()_-+=|\}]{[:;"'?/>.<,
  Control characters


[opLower, opNumeric, opSpecial, opControl]

can anyone help me with this?

much appreciated
function VigenereExEncrypt(sSource, sKey: String; bDecrypt: Boolean = False; iTableSize: Integer = 94): String;

var

 i, iPosText, iPosKey: Integer;

 sTable: string;

begin

 i:= 32;

 while i <= (iTableSize + 32) do

 begin

  sTable:= ConCat(sTable, Chr(i));

  inc(i);

 end;

 while Length(sSource) >= Length(sKey) do

  sKey:= ConCat(sKey,sKey);

 i:=0;

 while i<=Length(sSource) do

 if (sSource[i]=Chr(10)) or (sSource[i]=Chr(13)) then

  Delete(sSource, i, 1)

 else

  Inc(i);

 i:= 1;

 while i <= Length(sSource) do

 begin

  iPosText  := pred(pos(sSource[i],sTable));

  iPosKey   := pred(pos(sKey[i],sTable));

  case bDecrypt of

   False: Result    := Result + sTable[((iPosText  + iPosKey) mod iTableSize) + 1];

   True : Result    := Result + sTable[(((iPosText + iTableSize) - iPosKey) mod iTableSize) + 1];

  end;

   inc(i);

 end;

end;

Open in new window

0
Comment
Question by:Looking_4_Answers
  • 15
  • 12
  • 4
  • +1
33 Comments
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
When you refer to
"the function should include flags to turn on or off additional characte[r]s"
Do you mean that you do not want those included in your Key or that you do not want to include those characters in the source text to be encyphered (in other words, treat them like CR or LF characters)?

0
 
LVL 45

Expert Comment

by:aikimark
Comment Utility
or do you mean to output special characters, unencrypted, if that special character's option is disabled?

What is the context for your question?
0
 
LVL 16

Accepted Solution

by:
CodedK earned 500 total points
Comment Utility
Hi  Looking 4 Answers,

The answer you are looking is quite easy but there are flows...

The problem is that if you leave the "lowercase" untouched or some of them then while decrypting
you should leave those letters (lowercase letters for example) untouched too !
>> Because those letters where not encrypted and for this they should remain as is while decrypting.

The problem is you need to check for the translated values while you decrypt.

This will get you started:


Replace this :
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
case bDecrypt of
   False: Result    := Result + sTable[((iPosText  + iPosKey) mod iTableSize) + 1];
   True : Result    := Result + sTable[(((iPosText + iTableSize) - iPosKey) mod iTableSize) + 1];
 end;
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-

with this :


~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
    Case bDecrypt of
     False:
           begin
              if (sSource[i] in ['a'..'z']) then
              begin
                Result:= Result +sSource[i];
              end else
              begin
                Result    := Result + sTable[((iPosText  + iPosKey) mod iTableSize) + 1];
              end;
           end;
     True :
           begin
              if (sSource[i] in ['a'..'z']) then
              begin
                Result:= Result +sSource[i];
              end else
              begin
                Result    := Result + sTable[(((iPosText + iTableSize) - iPosKey) mod iTableSize) + 1];
              end;
           end;
    end;
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-

Of course you can insert a flag in the function like this :

Function VigenereExEncrypt(sSource, sKey: String; bDecrypt: Boolean = False; iTableSize: Integer = 94; LeaveLower: Boolean = False;): String;

~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
By default is false so the only thing you need to change now is the check :
 if ( (sSource[i] in ['a'..'z']) and LeaveLower) then ...

and the call to the function...




Hope this helps.
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
As a possible twist on the process of making sure that your encypher/decypher processes work the same, you may want to embed the encypher options in, say, the first or last character of the results so that, by knowing the which it is and how it is encoded, your decyphering process could extract the embedded options and handle the process on its own.
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
8080 diver: I do not want to include those characters in the source text to be encyphered


aikimark: if you google "Vigenere Cipher", you will see the original was only "A..Z".  However, many variations have been produced, inlcuding additional characters, such as "a..z", or "0..9", and then special characters, and then control characters such a s space....etc, etc.........thats what i mean

I would like to take the original code above from the delphi.about.com site and change it to include these, by turning on flags. The dfault would be the "A..Z" original vigenere

thanks
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
8080 diver

"As a possible twist on the process of making sure that your encypher/decypher processes work the same, you may want to embed the encypher options in, say, the first or last character of the results so that, by knowing the which it is and how it is encoded, your decyphering process could extract the embedded options and handle the process on its own."

i would think, just adding checkboxes on my app, that turns the flags on / off would be suffice, then call the function with those flags

wouldn't you? I dont want people to know what variation of the cypher it is <smile>
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
CodedK: i have tested your code yet, but it seems to me it handles only two scenarios.

The default would be "A..Z" only, which the current code above, does not do

then the additional flags would turn on or off (allow) the other characters

lowercase alphabet    'a' - 'z',    
numeric                        0..9
special characters      ~`!@#$%^&*()_-+=|\}]{[:;"'?/>.<,
Control characters  Example: space
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
i would think, just adding checkboxes on my app, that turns the flags on / off would be suffice, then call the function with those flags
The thing is, if you check 3 of the 4 boxes to encypher the text and a different set of checkboxes to decypher the text, will you get the same results?  On the other hand, if you embed the selcted options (in an encrypted/encyphered form) simewhere in the encyphered text block, then your app can read that spot first, extrract the selected options, and properly decypher the text.
I do not want to include those characters in the source text to be encyphered
I am reading that to mean that you want to drop those out of your source text before encyphering it.  (You do realize, of course that a properly formed and punctuated sentnce such as this one will be changed to just an encyphered "string" of Y .)
0
 
LVL 45

Expert Comment

by:aikimark
Comment Utility
It seems to me that the Vigenere cipher isn't very strong, even if you included characters beyond [A..Z].  My earlier comment about context deals with your use/purpose of the Delphi code snippet.
0
 
LVL 16

Expert Comment

by:CodedK
Comment Utility
Looking_4_Answers,
I just wrote some lines to cover one possible scenario to show to you how to do this...

Copy-paste isn't hard!  You can change the code (1 or 2 lines)
or put in an array the characters you desire, so to fit any possible scenario ...
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Okay, let's first define some constants, see Code_1, attached.
Then you need the function, see Code_2, attached.

Code_1:

const

  VIGENERELCASE         = 1;

  VIGENERESPECIAL       = 2;

  VIGENERELNUMERIC      = 4;

  VIGENERECONTROL       = 8;

  VIGENERELCASESET      = ['a'..'z'];

  VIGENERESPECIALSET    = ['~','`','!','@','#','$','%','^','&','*','(',')','_','-','+','=','|','\','}',']','{','[',':',';','"','''','?','/','>','.','<',',','];

  VIGENERELNUMERICSET   = ['0'..'9'];

  VIGENERECONTROLSET    = [' '];





Code_2:

function VigenereExEncrypt( Source      : String;

                            sKey        : String;

                            bDecrypt    : Boolean = False;

                            iTableSize  : Integer = 94;

                            Constraints : INT     = 15): String;

var

 i        : Integer;

 iPosText : Integer;

 iPosKey  : Integer;

 sTable   : string;

begin



  i:= 32;



  while i <= (iTableSize + 32) do

  begin

    sTable:= ConCat(sTable, Chr(i));

    inc(i);

  end; {while}



  while Length(sSource) >= Length(sKey) do

  begin

    sKey:= ConCat(sKey,sKey);

  end; {while}



  i:=0;



  while i<=Length(sSource) do

  begin

    if  (sSource[i]=Chr(10)) or

        (sSource[i]=Chr(13)) or

        (((Constraints and VIGENERELCASE) = VIGENERELCASE) and

         (Source[i] in VIGENERELCASESET)) or

        (((Constraints and VIGENERESPECIAL) = VIGENERESPECIAL) and

         (Source[i] in VENERESPECIALSETRDWIIRDWII)) or

        (((Constraints and VIGENERELNUMERICCASE) = VIGENERELNUMERIC) and

         (Source[i] in VIGENERELNUMERICSET)) or

        (((Constraints and VIGENERECONTROL) = VIGENERECONTROL) and

         (Source[i] RDWII VIGENERECONTROLSET))

    then begin

      Delete(sSource, i, 1)

    end

    else begin

      Inc(i);

    end; {if}



  end; {while}



  i:= 1;



  while i <= Length(sSource) do

  begin



    iPosText  := pred(pos(sSource[i],sTable));



    iPosKey   := pred(pos(sKey[i],sTable));



    case bDecrypt of

      False: Result    := Result + sTable[((iPosText  + iPosKey) mod iTableSize) + 1];

      True : Result    := Result + sTable[(((iPosText + iTableSize) - iPosKey) mod iTableSize) + 1];

    end; {case}



    inc(i);



  end; {while}



end;

Open in new window

0
 
LVL 45

Expert Comment

by:aikimark
Comment Utility
>>I do not want to include those characters in the source text to be encyphered

* The characters wouldn't be in the source text, just the cipher text
*  You only need to prepend/append one character for these settings

Example:
Plain Vingenere (just A..Z): 0
lowercase alphabet: 1
numeric: 2
special characters: 4

If a zero was found in the first/last character position, then no special characters.
If a five was found in the first/last character position, then both lower-case and special characters are encoded.
If a seven was found in the first/last character position, then all character sets are encoded.
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
8080_Diver:

SO, exactly how do i use your code?


const
  VIGENERELCASE         = 1;
  VIGENERESPECIAL       = 2;
  VIGENERELNUMERIC      = 4;
  VIGENERECONTROL       = 8;
  VIGENERELCASESET      = ['a'..'z'];
  VIGENERESPECIALSET    = ['~','`','!','@','#','$','%','^','&','*','(',')','_','-','+','=','|','\','}',']','{','[',':',';','"','''','?','/','>','.','<',',','];
  VIGENERELNUMERICSET   = ['0'..'9'];
  VIGENERECONTROLSET    = [' '];


whats the difference between say

  VIGENERELNUMERIC      = 4;

and

VIGENERELNUMERICSET   = ['0'..'9'];


or the difference between

VIGENERESPECIAL       = 2;

and

VIGENERESPECIALSET    = ['~','`','!','@','#','$','%','^','&','*','(',')','_','-','+','=','|','\','}',']','{','[',':',';','"','''','?','/','>','.','<',',','];


thanks
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
The control constants should be OR'ed together to pass as a parameter.  
VIGENERELCASE         = 1;
  VIGENERESPECIAL       = 2;
  VIGENERELNUMERIC      = 4;
  VIGENERECONTROL       = 8;
 
So, if you want to eliminate the lowercase and control chataracters, you would pass a value of (VIGENERELCASE  OR VIGENERECONTROL) or 9.  The constants ending in SET contain the characters that will be omitted/deleted if that control constant is OR'ed into the Constraints parameter.
If you want more than just the Space character to be considered as a "Control Character", then you just add those characters to the VIGENERECONTROLSET constant definition.
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Were you able to follow the dcode? ;-)
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
Great, i'll give it a try and get back to ya
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:Looking_4_Answers
Comment Utility
8080_Diver:

have you tried your code (tested it)?  I get all kinds of errors


[DCC Error] UntCommon.pas(14): E2005 'Int' is not a type identifier
[DCC Error] UntCommon.pas(41): E2005 'Int' is not a type identifier
[DCC Error] UntCommon.pas(57): E2003 Undeclared identifier: 'sSource'
[DCC Error] UntCommon.pas(57): E2008 Incompatible types
[DCC Error] UntCommon.pas(64): E2008 Incompatible types
[DCC Warning] UntCommon.pas(67): W1024 Combining signed and unsigned types - widened both operands
[DCC Error] UntCommon.pas(68): E2003 Undeclared identifier: 'VIGENERELCASE'
[DCC Error] UntCommon.pas(69): E2003 Undeclared identifier: 'VIGENERELCASESET'
[DCC Error] UntCommon.pas(69): E2015 Operator not applicable to this operand type
[DCC Error] UntCommon.pas(70): E2003 Undeclared identifier: 'VIGENERESPECIAL'
[DCC Error] UntCommon.pas(71): E2003 Undeclared identifier: 'VENERESPECIALSETRDWIIRDWII'
[DCC Error] UntCommon.pas(71): E2015 Operator not applicable to this operand type
[DCC Error] UntCommon.pas(72): E2003 Undeclared identifier: 'VIGENERELNUMERICCASE'
[DCC Error] UntCommon.pas(72): E2003 Undeclared identifier: 'VIGENERELNUMERIC'
[DCC Error] UntCommon.pas(73): E2003 Undeclared identifier: 'VIGENERELNUMERICSET'
[DCC Error] UntCommon.pas(73): E2015 Operator not applicable to this operand type
[DCC Error] UntCommon.pas(74): E2003 Undeclared identifier: 'VIGENERECONTROL'
[DCC Error] UntCommon.pas(75): E2029 ')' expected but identifier 'RDWII' found
[DCC Warning] UntCommon.pas(75): W1024 Combining signed and unsigned types - widened both operands
[DCC Error] UntCommon.pas(75): E2012 Type of expression must be BOOLEAN
[DCC Error] UntCommon.pas(77): E2008 Incompatible types
[DCC Error] UntCommon.pas(87): E2008 Incompatible types
[DCC Error] UntCommon.pas(90): E2250 There is no overloaded version of 'Pos' that can be called with these arguments
[DCC Warning] UntCommon.pas(90): W1058 Implicit string cast with potential data loss from 'string' to 'RawByteString'
[DCC Fatal Error] GCPZTBX.dpr(8): F2063 Could not compile used unit 'UntCommon.pas'
Failed
Elapsed time: 00:00:00.8
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Sorry about that,
  1. The parameter needs to be of type Integer.
  2. the parameter named Source should be sSource.
  3. The Constants have to be declared at the top of the unit (up there in the same place that you declare the Class Objects).
As for the rest of them, I don't have your source code and I don't have any way of compiling the code if I did.  some of the messages are totally unfamiliar to me (e.g. Implicit string cast with potential data loss from 'string' to 'RawByteString').  Also, I have NO idea why you should have anything involving RDWII in the code.
Other than the expanded IF statement and the Constants, the code I included was from the stuff I pulled out of your code.
Have you never worked with Constants? :-/

0
 

Author Comment

by:Looking_4_Answers
Comment Utility
i only copied what you provided me

which has two lines with " " in it

(Source[i] in VENERESPECIALSETRDWIIRDWII)) or

(Source[i] RDWII VIGENERECONTROLSET))


0
 

Author Comment

by:Looking_4_Answers
Comment Utility
i call your function, and i always returns an empty string

memMain.Lines.Text:= VigenereExEncrypt(Trim(memMain.Lines.Text), edtKey.Text);
unction VigenereExEncrypt( SSource      : String;

                            sKey        : String;

                            bDecrypt    : Boolean = False;

                            iTableSize  : Integer = 94;

                            Constraints : INTEGER     = 15): String;

var

 i        : Integer;

 iPosText : Integer;

 iPosKey  : Integer;

 sTable   : string;

begin



  i:= 32;



  while i <= (iTableSize + 32) do

  begin

    sTable:= ConCat(sTable, Chr(i));

    inc(i);

  end; {while}



  while Length(sSource) >= Length(sKey) do

  begin

    sKey:= ConCat(sKey,sKey);

  end; {while}



  i:=0;



  while i<=Length(sSource) do

  begin

    if  (sSource[i]=Chr(10)) or

        (sSource[i]=Chr(13)) or

        (((Constraints and VIGENERELCASE) = VIGENERELCASE) and

         (sSource[i] in VIGENERELCASESET)) or

        (((Constraints and VIGENERESPECIAL) = VIGENERESPECIAL) and

         (sSource[i] in VIGENERESPECIALSET)) or

        (((Constraints and VIGENERELNUMERIC) = VIGENERELNUMERIC) and

         (sSource[i] in VIGENERELNUMERICSET)) or

        (((Constraints and VIGENERECONTROL) = VIGENERECONTROL) and

         (sSource[i] in VIGENERECONTROLSET ))

    then begin

      Delete(sSource, i, 1)

    end

    else begin

      Inc(i);

    end; {if}



  end; {while}



  i:= 1;



  while i <= Length(sSource) do

  begin



    iPosText  := pred(pos(sSource[i],sTable));



    iPosKey   := pred(pos(sKey[i],sTable));



    case bDecrypt of

      False: Result    := Result + sTable[((iPosText  + iPosKey) mod iTableSize) + 1];

      True : Result    := Result + sTable[(((iPosText + iTableSize) - iPosKey) mod iTableSize) + 1];

    end; {case}



    inc(i);



  end; {while}



end;

Open in new window

0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
I am having a hard time seeing the string you are passing in  . . . also, the stuff your are passing to the sKey parameter is a bit dim. . . can you highlight it in bold for me ? ;-)
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Have you tried stepping through the function to see exactly how it is manipulating the data?  As I said, I don't have the means for debugging it right now and I can't see either the data you are passing in to be encyphered or the string you are passing as the sKey.  Set some watches on some key variables within the function, a break point at the start of the function, and then use the <F7> key to step through it.
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
"I am having a hard time seeing the string you are passing in"

does it matter?  they are various test strings

example:

text:    hello world

key:  test



0
 

Author Comment

by:Looking_4_Answers
Comment Utility
i'll step through and test it tonight
0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
does it matter?
Well, only if you want to actually try to do debugging. :-/
For instance, if you pass in all lower case characters and you are deleting all lower case characters, then you will bget an empty string as the return and that will actually be what you are supposed to be getting back.  On the other hand, if you pass in all upper case letters in the ['A'..'Z'] set, and you are getting an empty string backm, then there is a problem.
If you are using the default Constraints (i.e. delete everything except uppercase) and you are passing in "hello world", then you are getting back exactly what you are asking for . . . an empty string.  
This is Debugging 101, by the way.  Unless you know what is being passed for the parameters, there is no way to determine what you might be supposed to get back.  On the other hand, if you set a break point (as I recommended) and then step through the function, you might also figure out the problem.
Try putting a break point on the line while i<=Length(sSource) do.  Then put another one on Delete(sSource, i, 1).  When you hit the first break point, start using the <F7> key to step through the code.  If you have passed in the "hello world" text and "text" as the sKey, then I am going to bet that you will step through the delete line every time and, as a result, the string to be encyphered will be "" (i.e. an empty string).
Have you ever debugged a program?  

0
 

Author Comment

by:Looking_4_Answers
Comment Utility
Yes, I have debugged a program!  Idon't understand the rhetoric i am receiving. I guess I will solve this on my own. Thanks for your help anyways.

Your code is not working.

using your code, with all the defaults, i would asume it would want 'A - Z' characters - correct?

so, i type in 'HELLO WORLD"  and I use the key:  TEXT

i get nothing

thank you
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
I am accepting CodedK 's answers, because although he didn't solve the whole thing, his code has got me the closest to solving it on my own.  I'll take it from there
0
 

Author Closing Comment

by:Looking_4_Answers
Comment Utility
Its a start....and it helped me do alittle on my own, and i think over time, i can solve it on my own
0
 
LVL 45

Expert Comment

by:aikimark
Comment Utility
>>so, i type in 'HELLO WORLD"  and I use the key:  TEXT

If you only accept [A..Z] characters, why are you passing in a string that contains a space character?


>>Idon't understand the rhetoric i am receiving.
Since the participating don't know your Delphi experience, some of the 'rhetoric' was meant to reveal how much hand-holding you might need in implementing the posted code.  Heck.  We don't even know what version of Delphi you are using.

0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Looking_4_Answers,
I ask again, have you tried stepping through the code? (I also realize that whether you have or not is now a mute point. ;-)
Stepping through the code will let you see, at each and every step of the way, exactly what is going on in the code.  KNowing that information, you may be able to better figure out what is wrong.  In fact, it is often the case that, as you step through the code, you see that a step is taken that you know shouldn't be and you can pause right there and figure out why that step was taken.
As Aikimark has indicated, you have provided no information about the version of Delphi you are using and you have not indicated that you are cooperating with our/my efforts to help you debug this.  You also provided the equivalent of "My car engine makes a funny noise and it doesn't start." and then asked why the requested inforamtion was even relavent.  Those of us who try to assist others most commonly ask questions for a reason and that reason is usally that we are trying to use your finger tips and eyes to do what we would do in attempting to debug the problem.
I do sincerelty wish you luck in getting your solution up and running.  I think you may well need it. ;-)
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
8080_Diver::

Do you really think the version of delphi matters here ....in this case?  I dont!
0
 

Author Comment

by:Looking_4_Answers
Comment Utility
8080_Diver::

I am going to repost the question. If you can show me how your function works wiith examples for each case......starting with

Standard Vigenere  (A...Z)

 lowercase alphabet    'a' - 'z',    
 numeric                        0..9
 special characters      ~`!@#$%^&*()_-+=|\}]{[:;"'?/>.<,
 Control characters


0
 
LVL 22

Expert Comment

by:8080_Diver
Comment Utility
Looking_4_Answers,
Do you really think the version of delphi matters here ....in this case?  I dont
There are differnt functionalities available with different versions of Delphi.  Since I have been helping people on this site, I have dealt with D4, D5, D6, D7, D2007, D2009, and D2010 in their problems.  Some of the terminology and object choices differ between those versions.  Knowing which version of Delphi I am working (blindly) with helps me estimate, abomng other things the exprerience level of the person I am helping as well as the general programming environment.
Without that information, I have to ask what may be perceived as rude questions such as when, after you apparently either refused to step through the code ordid not know how to step through the code, I asked if you had  ever debugged an application.
Each of us have our particular methods for debugging code. Since you are the one having the difficulties and I am the one assisting, it really doesn't make any sense to me why you would insist that I am supposed to go about debugging the code as you would . . . your method apparently wasn't working.  If you then refuse to cooperate in being my remote eyes and fingers in debugging the code using the methods that I would use, I have a much harder time assisting you.
I am going to repost the question. If you can show me how your function works wiith examples for each case......starting with
I see no purpose in my doing that.  You have declared that you have a solution to your problem and you have the code I provided.  So, if you are interested in getting that code working, you should be able to debug the code or, at the very least, step through the code to determine what it is actually doing and, from that, what changes may be needed to have the code produce the results you expect.
If you will remember, the encyphering issue was yours to begin with and that means that I either have a preferred method that I use or that I have no need for the code in the first place.
Again, I do wish you luck and good fortune in your endeavors.
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now