5. Base64 encryption and decryption algorithm using javascript in Delphi
Searching Google: Javascript base64 encryption will find many base64 encryption codes. The following is a piece of code I searched for (the copyright of the following code belongs to its original author):
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64DecodeChars = new Array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1); function base64encode(str) { var out, i, len; var c1, c2, c3; len = str.length; i = 0; out = ""; while(i < len) { c1 = str.charCodeAt(i++) & 0xff; if(i == len) { out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt((c1 & 0x3) << 4); out += "=="; break; } c2 = str.charCodeAt(i++); if(i == len) { out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt((c2 & 0xF) << 2); out += "="; break; } c3 = str.charCodeAt(i++); out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); out += base64EncodeChars.charAt(c3 & 0x } return out; } function base64decode(str) { var c1, c2, c3, c4; var i, len, out; len = str.length; i = 0; out = ""; while(i < len) { /* c1 */ do { c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; } while(i < len && c1 == -1); if(c1 == -1) break; /* c2 */ do { c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; } while(i < len && c2 == -1); if(c2 == -1) break; out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); /* c3 */ do { c3 = str.charCodeAt(i++) & 0xff; if(c3 == 61) return out; c3 = base64DecodeChars[c3]; } while(i < len && c3 == -1); if(c3 == -1) break; out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x /* c4 */ do { c4 = str.charCodeAt(i++) & 0xff; if(c4 == 61) return out; c4 = base64DecodeChars[c4]; } while(i < len && c4 == -1); if(c4 == -1) break; out += String.fromCharCode(((c3 & 0x03) << 6) | c4); } return out; } function utf16to8(str) { var out, i, len, c; out = ""; len = str.length; for(i = 0; i < len; i++) { c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x out += str.charAt(i); } else if (c > 0x07FF) { out += String.fromCharCode(0xE0 | ((c >> 12) & 0x out += String.fromCharCode(0x80 | ((c >> 6) & 0x out += String.fromCharCode(0x80 | ((c >> 0) & 0x } else { out += String.fromCharCode(0xC0 | ((c >> 6) & 0x out += String.fromCharCode(0x80 | ((c >> 0) & 0x } } return out; } function utf8to16(str) { var out, i, len, c; var char2, char3; out = ""; len = str.length; i = 0; while(i < len) { c = str.charCodeAt(i++); switch(c >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 0xxxxxxxx out += str.charAt(i-1); break; case 12: case 13: // 110x xxxx 10xx xxxx char2 = str.charCodeAt(i++); out += String.fromCharCode(((c & 0x break; case 14: // 1110 xxxx 10xx xxxx 10xx xxxx char2 = str.charCodeAt(i++); char3 = str.charCodeAt(i++); out += String.fromCharCode(((c & 0x ((char2 & 0x ((char3 & 0x break; } } return out; } |
How can we add such a long piece of code in the method of AddCode()?
1) The first method: define such a long code to a string. This workload is definitely very large and error-prone.
2) The second method: define it in a notepad and read it in when the program is running. The security is very low and it is easy to be modified and lead to errors.
3) The third method: store it in a Dll as a resource file. This method is more suitable. We will use this method to deal with it below.
Steps to generate a DLL:
1) Create a new notepad, paste the above code, and finally save it as Base64.txt.
2) Create a new notepad, write the following code, and finally save it as Base64.rc.
Base64File exefile "Base64.txt" |
3) Create a new batch file in the same directory and save it as Base64.bat.
Brcc32.exe Base64.rc |
4) Compile into resource file Res: Double-click to execute Base64.bat, and after that, a Base64.res file will be generated, which is the resource file of JavaScript script.
5) Create a new DLL, save it as Base64.dPR, add the following code, and then compile it into Base64.dll.
library Base64; {$R Base64.RES} Begin end. |
In this way, our resource file is packaged into a dll and it is completed!
Next, our job is to read JavaScript code through dlls.
{Read resource file to a String variable} Function ReadResource():String; Var Hinst : Thandle; Stream:TResourceStream; CodeString : TStrings; Begin Results := ''; //Load dll Hinst:=Loadlibrary('Base64.dll'); If Hinst=0 Then Exit; Try //Read resource file Stream:=TResourceStream.Create(Hinst,'Base64File','exefile'); CodeString := TStringList.Create(); Try //Save the resource file in the list CodeString.LoadFromStream(Stream); //Return a string Result := CodeString.Text; Finally CodeString.Free; Stream.Free; end; Finally FreeLibrary(Hinst); end; end; |
The following work is to add custom JavaScript functions through AddCode() of the ScriptControl control.
Initialize the ScriptControl component, please refer to the Advanced Application of ScriptControl in Delphi (I)
http://blog.csdn.net/juwuyi/archive/
Sc.AddCode(ReadResource()); //encryption Words:='This is a piece of text encrypted with BASE64'; //Result: Result:=sc.Eval('base64encode(utf16to8(''+Words+'''))'); //Decryption Result:=sc.Eval('utf8to16(base64decode(''+Words+'''))'); |
<SPAN style="FONT-FAMILY: Song font; m