peethebee Posted February 6, 2007 Posted February 6, 2007 (edited) Hi Guys! What is it? This is a RSA-Plugin for AutoIt. It is coded in C++ for performance reasons and is not limited in the key size. Therefore I believe this can improve the security of many applications (especially network scripts). History I wrote a paper in school about asymmetric encryption systems. I concentrated especially on RSA as it is the most popular example. For demonstration purposes I coded a RSA thing in C++. I was using the C++ BigInt Class by Alex Vinokur and William A. Rossi (http://sourceforge.net/projects/cpp-bigint/). I was using Code::Blocks IDE. Special thanks for the great support with this IDE and a C++ version of the plugin SDK go to JSThePatriot. Usage The result is RSA.dll which exports three functions to AutoIt: CODERSA_GenerateKeys (keybitlength, keypath, keyname) ; where keypath format is: C:\\Windows\\Test\ RSA_Encrypt (text, keyfilename) ; where keyfilename normally is a public key RSA_Decrypt (text, keyfilename) ; where keyfilename normally is a private key Download The following package contains the RSA.dll which is the only thing needed for usage in your script. Furthermore the Headers and source files are included. Download including source: http://www.autoit.de/peethebee/RSA/RSA-PlugIn_0.5.zip Download pure DLL: http://www.autoit.de/peethebee/RSA/RSA.dll Source code The relevant source passage is this one: CODE#include #include "bigint.h" #include #include #include #include "au3plugin.h" using namespace std; #define RBI RossiBigInt /* * * AutoIt v3 Plugin RSA * * Copyright © 1999-2006 Jonathan Bennett * Copyright © 2006-2007 peethebee * The rules of GPL apply to this work! * * RSA.c * */ /**************************************************************************** * Function List * * This is where you define the functions available to AutoIt. Including * the function name (Must be the same case as your exported DLL name), the * minimum and maximum number of parameters that the function takes. * ****************************************************************************/ /* "FunctionName", min_params, max_params */ AU3_PLUGIN_FUNC g_AU3_Funcs[] = { {"RSA_GenerateKeys", 3, 3}, {"RSA_Encrypt", 2, 2}, {"RSA_Decrypt", 2, 2} }; /**************************************************************************** * AU3_GetPluginDetails() * * This function is called by AutoIt when the plugin dll is first loaded to * query the plugin about what functions it supports. DO NOT MODIFY. * ****************************************************************************/ AU3_PLUGINAPI int AU3_GetPluginDetails(int *n_AU3_NumFuncs, AU3_PLUGIN_FUNC **p_AU3_Func) { /* Pass back the number of functions that this DLL supports */ *n_AU3_NumFuncs = sizeof(g_AU3_Funcs)/sizeof(AU3_PLUGIN_FUNC); /* Pack back the address of the global function table */ *p_AU3_Func = g_AU3_Funcs; return AU3_PLUGIN_OK; } /**************************************************************************** * DllMain() * * This function is called when the DLL is loaded and unloaded. Do not * modify it unless you understand what it does... * ****************************************************************************/ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } RBI euklid(RBI a, RBI { RBI h; while (b != RBI(0)) { h = a % b; a = b; b = h; } return a; } RBI _minus_mod(RBI a, RBI b, RBI m) { if (a > { return (a- % m; } else { return m - (b-a) % m; } } RBI extended_euclid(RBI a, RBI n) { RBI v3(n); RBI g(a); RBI v1(0); RBI t1(1); RBI t3; RBI temp; RBI q; do { q = g / v3; t3 = g % v3; if (t3 > RBI(0)) { q = (v1*q) % n; q = _minus_mod(t1, q, n); t1=v1; v1=q; g=v3; v3=t3; } } while (t3 != RBI(0)); return v1; } RBI fast_exp(RBI b, RBI e) { RBI result(1); // Ist die aktuelle Bitstelle von e gesetzt (1), // das Ergebnis mit b multiplizieren. while (e > RBI(0)) { if ((e & RBI(1)) == RBI(1)){ result = (result * ; } // den Exponenten in der Binärdarstellung um // 1 nach rechts verschieben, sodass der nächste // Durchlauf die nächste Bitstelle bearbeitet. e >>= 1; // b quadrieren, da es an der nächsten Bitstelle // eine entsprechend höhere Wertigkeit hat. b = b * b; } return result; } RBI fast_exp_mod(RBI b, RBI e, RBI m) { RBI result(1); while (e > RBI(0)) { // Ist die aktuelle Bitstelle von e gesetzt (1), // dann das Quadrat der Basis zum Ergebnis addieren. // Dabei gleich den Modulus einbeziehen, damit das // Ergebnis nicht unnötig groß wird. if ((e & RBI(1)) == RBI(1)){ result = (result * ; result = (result % m); } // den Exponenten in der Binärdarstellung um // 1 nach rechts verschieben, sodass der nächste // Durchlauf die nächste Bitstelle bearbeitet. e >>= 1; // b quadrieren, da es an der nächsten Bitstelle // eine entsprechend höhere Weritgkeit hat. b = (b * % m; } return result; } /* int miller_rabin_is_prime(RBI n, int steps) { long small_primes[10] = {2,3,5,7,11,13,17,19,23,29}; RBI d, a, t, y; d = n-RBI(1); while (RBI(d & RBI(1)) == RBI(0)) { d >>= 1; } for (int b=0;b a = RBI(small_primes); t = d; y = fast_exp_mod(a,t,n); while (t != n-RBI(1) && y != RBI(1) && y != n-RBI(1)) { y = (y * y) % n; t <<= 1; } //if (y != n-RBI(1) && RBI(t & RBI(1)) == RBI(0)) return 1; if ((y != n-RBI(1)) && (RBI(t & RBI(1)) == RBI(0))) { MessageBox(NULL, "nicht prim", "MR", MB_OK); return 1; } } MessageBox(NULL, "prim", "MR", MB_OK); return 0; }*/ int witness(RBI n, RBI a) { MessageBox(NULL, "witness", "anfang", MB_OK); RBI t, u, x, y, i; for(t = RBI(0); ((n - RBI(1)) & (fast_exp(RBI(2),(t+RBI(1))))) == RBI(0); t++); //My hack way of finding t and u u = (n - RBI(1)) / (fast_exp(RBI(2), t)); //such that 2^t * u = n - 1 where u is odd y = fast_exp_mod(a, u, n); //This is described in the next section for(i = RBI(1); i <= t; i++) { x = (y * y) % n; if((x == RBI(1)) && (y != RBI(1)) && (y != (n - RBI(1)))) { MessageBox(NULL, "oben", "return 1", MB_OK); return 1; } } if(x != RBI(1)) { MessageBox(NULL, "unten", "return 1", MB_OK); return 1; } return 0; } int miller_rabin_is_prime(RBI n, int s) { long small_primes[10] = {2,3,5,7,11,13,17,19,23,29}; if(n == RBI(3)) return 1; RBI a; int j; for(j = 0; j < s; j++) { a = RBI(small_primes[j]); if(witness(n, a)) { MessageBox(NULL, "nicht prim", "MR", MB_OK); return 0; } } MessageBox(NULL, "prim", "MR", MB_OK); return 1; } int fermat_is_prime(RBI n) { RBI result2(0); RBI result3(0); RBI result5(0); // Fermattest mit Basis 2 result2 = fast_exp_mod(RBI(2), n - RBI(1), n); // Fermattest mit Basis 3 result3 = fast_exp_mod(RBI(3), n - RBI(1), n); // Fermattest mit Basis 5 result5 = fast_exp_mod(RBI(5), n - RBI(1), n); // Das probabilistische Ergebnis zurückgeben. // Rückgabewert 1 steht für wahrscheinlich prim, // Rückgabewert 0 steht für sicher nicht prim. return (result2 == RBI(1) && result3 == RBI(1) && result5 == RBI(1)) ? 1:0; } RBI find_prime_number(double bitlength){ int fermat_res = 0; RBI rand_nr; // Zufallszahl berechnen srand(time(NULL)); //gewünschte Bitlänge herstellen RBI minimum_value(fast_exp(RBI(2), RBI(bitlength))); do { // Zufallszahl generieren rand_nr = RBI(rand()); rand_nr = (fast_exp(rand_nr, RBI(4))+RBI(1)) % (fast_exp(RBI(2), RBI(bitlength-1)) + 1); // Summe aus 2 hoch Bitlänge und Zufallszahl bilden und // Ergebnis auf Primalität testen fermat_res = fermat_is_prime(minimum_value + RBI(rand_nr)); } while (fermat_res == 0); // wenn Fermat keine zusammengesetzte Zahl erkannt hat, // dann Zahl als Primzahl zurückliefern return minimum_value + RBI(rand_nr); } AU3_PLUGIN_DEFINE(RSA_GenerateKeys) { AU3_PLUGIN_VAR *pMyResult; double key_bitlength; key_bitlength = AU3_GetDouble(&p_AU3_Params[0]); //miller_rabin_is_prime(RBI(key_bitlength), 2); string keypath; keypath = AU3_GetString(&p_AU3_Params[1]); //keypath = keypath::replace("\\", "\\\\" ); string keyname; keyname = AU3_GetString(&p_AU3_Params[2]); // Zwei Primzahlen p und q suchen RBI p(find_prime_number(key_bitlength / 2)); RBI q; // Sicherstellen, dass p ungleich q do { q = find_prime_number(key_bitlength / 2); } while (q == p); // n berechnen RBI n(p * q); // phi(n) berechnen: RBI phi((p - RBI(1)) * (q - RBI(1))); // e setzen RBI e; e = RBI(65537); //RBI(fast_exp(RBI(2), RBI(16))+1); // d berechnen srand(time(NULL)); RBI d = extended_euclid(e, phi); // öffentlichen Schlüssel in eine Datei schreiben string pubpath=keypath + keyname + ".pubkey"; ofstream pubkeyfile; pubkeyfile.open(pubpath.c_str()); pubkeyfile << n; pubkeyfile << "\n"; pubkeyfile << e; pubkeyfile << "\n"; pubkeyfile << key_bitlength << " bit"; pubkeyfile << "\n"; pubkeyfile << ""; pubkeyfile.close(); // privaten Schlüssel in eine Datei schreiben string privpath=keypath + keyname + ".privkey"; ofstream privkeyfile; privkeyfile.open(privpath.c_str()); privkeyfile << n; privkeyfile << "\n"; privkeyfile << d; privkeyfile << "\n"; privkeyfile << key_bitlength << " bit"; privkeyfile << "\n"; privkeyfile << ""; privkeyfile.close(); /* Ergebnisse in Datei ausgeben string logpath="C:\\rsa.log"; ofstream logfile; logfile.open(logpath.c_str()); logfile << "RSA-Schluesselgenerierung" << endl << endl; logfile << "p: " << p << endl; logfile << "q: " << q << endl; logfile << "n: " << n << endl; logfile << "phi(n): " << phi << endl; logfile << "e: " << e << endl; logfile << "d: " << d << endl; logfile << "de mod phi: " << (RBI(d)*e) % phi << endl << endl; logfile << "Schluessel gespeichert als " << keyname << ".privkey und " << keyname << ".pubkey im Ordner " << keypath << endl; logfile.close();*/ pMyResult = AU3_AllocVar(); AU3_SetInt32(pMyResult, 1); *p_AU3_Result = pMyResult; *n_AU3_ErrorCode = 0; *n_AU3_ExtCode = 0; return AU3_PLUGIN_OK; } AU3_PLUGIN_DEFINE(RSA_Encrypt) { AU3_PLUGIN_VAR *pMyResult; pMyResult = AU3_AllocVar(); string text; text = AU3_GetString(&p_AU3_Params[0]); string keyfilename; keyfilename = AU3_GetString(&p_AU3_Params[1]); //keyfilename = string_replace(keyfilename, "\\", "\\\\"); //MessageBox(NULL, text.c_str(), keyfilename.c_str(), MB_OK); // öffentlichen Schlüssel auslesen ifstream pubkeyfile; string line; pubkeyfile.open(keyfilename.c_str()); // erste Zeile auslesen und gleich n setzen getline(pubkeyfile, line); RBI n(line, 10); // zweite Zeile auslesen und gleich e setzen getline(pubkeyfile, line); RBI e(line, 10); // Plaintext zeichenweise durchgehen // immer 2 Zeichen sammeln um eine einfache // Blockchiffre umzusetzen //MessageBox(NULL, text.c_str(), keyfilename.c_str(), MB_OK); string res_str; // Stringlänge auf geraden Wert bringen if (text.length() % 2 == 1) {text = text + " ";} for (int i=0;i // ASCII-Code der Zeichens berechnen int mi1 = int(text); int mi2 = int(text[i+1]); // Verkettung RBI mi; mi = RBI(mi2) * fast_exp(RBI(2), RBI(7)) + RBI(mi1); // Eigentliche Verschlüsselung RBI ci(fast_exp_mod(mi, e, n)); // Ergebnis anhängen (als Hex-Wert, mit Trennzeichen #) res_str = res_str + ci.getstr_pure_hex_value() + "#"; } /* Ergebnis in eine temporäre Datei schreiben MessageBox(NULL, "test", "test", MB_OK); string tempfile="C:\\rsa.enc"; ofstream encfile; encfile.open(tempfile.c_str()); encfile << res_str; encfile.close(); */ //AU3_SetString(pMyResult, res_str.c_str()); //MessageBox(NULL, res_str.c_str(), "test", MB_OK); AU3_SetString(pMyResult, res_str.c_str()); //MessageBox(NULL, "test", "test", MB_OK); *p_AU3_Result = pMyResult; *n_AU3_ErrorCode = 0; *n_AU3_ExtCode = 0; //MessageBox(NULL, "test", "test", MB_OK); return AU3_PLUGIN_OK; } AU3_PLUGIN_DEFINE(RSA_Decrypt) { AU3_PLUGIN_VAR *pMyResult; pMyResult = AU3_AllocVar(); string text; text = AU3_GetString(&p_AU3_Params[0]); string keyfilename; keyfilename = AU3_GetString(&p_AU3_Params[1]); //keyfilename = string_replace(keyfilename, "\\", "\\\\"); //MessageBox(NULL, text.c_str(), "test", MB_OK); //MessageBox(NULL, keyfilename.c_str(), "test", MB_OK); // privaten Schlüssel auslesen ifstream privkeyfile; string line; privkeyfile.open(keyfilename.c_str()); // erste Zeile auslesen und gleich n setzen getline(privkeyfile, line); RBI n(line, 10); // zweite Zeile auslesen und gleich d setzen getline(privkeyfile, line); RBI d(line, 10); // Ciphertext an Trennzeichen spalten string res_str; string collect_string; for (int i=0;i if (text == '#') { // Entschlüsselung RBI mi(fast_exp_mod(RBI(collect_string, 16), d, n)); // beide Zeichen aus mi extrahiere RBI mi1; RBI mi2; mi1 = mi % fast_exp(RBI(2), RBI(7)); mi2 = mi / fast_exp(RBI(2), RBI(7)); // mi1 und mi2 an Ergebnis-String anhängen res_str = res_str + (char)mi1.get_pure_ulong(); res_str = res_str + (char)mi2.get_pure_ulong(); // Sammel-String wieder leeren collect_string = ""; } else { // Zeichen ist noch Teil des Blockes collect_string = collect_string + text; } } /* Ergebnis in eine temporäre Datei schreiben string tempfile="C:\\rsa.dec"; ofstream decfile; decfile.open(tempfile.c_str()); decfile << res_str; decfile.close();*/ AU3_SetString(pMyResult, res_str.c_str()); *p_AU3_Result = pMyResult; *n_AU3_ErrorCode = 0; *n_AU3_ExtCode = 0; return AU3_PLUGIN_OK; } Improvements and help There are still some things to improve of course: - There is at the moment only a 7-bit-alphabet supported, meaning ASCII-127. I would like to use 16-Bit (?) Unicode to make it work with any charsets. - The Miller-Rabin-Test (see Wikipedia) is a far better prime test than the simple Fermat test. So far I was not able to code that :-( - For decryption one should use the Chinese Reminder Theorem (see Wikipedia). It is much faster than the solution used at the moment. If you can help in any of the above cases or have any different suggestions, feel free to post here :-) Sample Mini-Sample: #compiler_plugin_funcs = RSA_GenerateKeys, RSA_Encrypt, RSA_Decrypt $plug = PluginOpen(@ScriptDir & "\rsa.dll") SplashTextOn("RSA", "Generating Key", 200, 25) RSA_GenerateKeys(64, "C:\", "peethebee") SplashTextOn("RSA", "Encrypting...", 200, 25) $enc = RSA_Encrypt("This is a simple test of the RSA plugin for AutoIt by peethebee", "C:\\peethebee.pubkey") SplashOff() MsgBox(0, "Encrypted", $enc) SplashTextOn("RSA", "Decrypting...", 200, 25) $dec = RSA_Decrypt($enc, "C:\\peethebee.privkey") SplashOff() MsgBox(0, "Decrypted", $dec) A more extensive example (a complete mulit-user-chat with this RSA encrytion) by GtaSpider see http://www.autoitscript.com/forum/index.php?showtopic=40902. I would really appreciate if you would test my work and give it a chance :-) peethebee Edited February 8, 2007 by peethebee vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
JSThePatriot Posted February 7, 2007 Posted February 7, 2007 peethebee, Great work as usual! It all looks great. I dont have anything to test it on at the moment, but I also appreciate the Kudos. You may also check into having this moved into the Example Scripts forum. That is where I have my plugin code/examples. (Just a thought) Again Great Job, JS AutoIt Links File-String Hash Plugin Updated! 04-02-2008 Plugins have been discontinued. I just found out. ComputerGetInfo UDF's Updated! 11-23-2006 External Links Vortex Revolutions Engineer / Inventor (Web, Desktop, and Mobile Applications, Hardware Gizmos, Consulting, and more)
sasdad Posted April 11, 2007 Posted April 11, 2007 Hi great work, I have some questions? How safe is this plugin? Is it OK, that for example test "hi" is everytime encrypted as the same string? And second question. Why took so ong to generate any key bigger then 128bit. I have generated 256bit key (approximately 10 minutes - processor E6300) And I'm trying to generate 512bit key. Thank you
peethebee Posted April 11, 2007 Author Posted April 11, 2007 Hi! It is no easy task to generate prime numbers of that size. Since my code is the code of a C++ beginner there is a lot of room for improvement as well on the mathematical as on the implementational side. Sorry about that, but key generation has only be done once, so it is not that big problem I hope. That it results in the same text is usual for RSA afaik. You could quite easy salt the text, but this is not yet implemented yet... Thanks for having a look at it, peethebee vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
sasdad Posted April 11, 2007 Posted April 11, 2007 OK, that's no problem. I just wanted to know, how difficult is to crack this encryption. If it's a work for days or hours.
peethebee Posted April 11, 2007 Author Posted April 11, 2007 Hi!The RSA factoring challenge gives a hint of the time needed to crack:http://www.rsa.com/rsalabs/node.asp?id=2964It says it took "30 2.2GHz-Opteron-CPU years" to crack a 640-bit key.peethebee vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
JSThePatriot Posted April 11, 2007 Posted April 11, 2007 Hi!It is no easy task to generate prime numbers of that size. Since my code is the code of a C++ beginner there is a lot of room for improvement as well on the mathematical as on the implementational side. Sorry about that, but key generation has only be done once, so it is not that big problem I hope.That it results in the same text is usual for RSA afaik. You could quite easy salt the text, but this is not yet implemented yet...Thanks for having a look at it,peethebeeI have been looking into creating a Math Plugin for AutoIt, and in that I have really been looking into the generation of prime numbers. Maybe I will be able to contribute some code to your project once I get this one underway.JS AutoIt Links File-String Hash Plugin Updated! 04-02-2008 Plugins have been discontinued. I just found out. ComputerGetInfo UDF's Updated! 11-23-2006 External Links Vortex Revolutions Engineer / Inventor (Web, Desktop, and Mobile Applications, Hardware Gizmos, Consulting, and more)
NuclearIce Posted July 7, 2007 Posted July 7, 2007 First off, your links aren't working anymore, peethebee. It worked out alright because I downloaded the dll from a link in a post by you on the german forum. Secondly, I've got a question: this may seem dumb, but how come RSA keys I generate with OpenSSL don't work with your plugin? Or, how do I generate compatible keys with OpenSSL (it's waaay quicker for long keys). If I'm way off, please put me back on track, or if you need more info, just ask. Thanks! And nice work, by the way!
peethebee Posted July 9, 2007 Author Posted July 9, 2007 Hi! I did not really follow any standards to save the keys. There sure are a lot of tricks used to speed up the generation and encryption process and some of those additional numbers that my script does not generate will be part of those key files. To be honest it was not my aim to be compatible, I just tested my mathematical and C++ knowledge . Thanks for your plaudit, peethebee vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
microsoft Posted July 15, 2007 Posted July 15, 2007 Plase New LinkThe Link Not Fund !! http://www.autoit.de/peethebee/RSA/RSA.dllPlease ! !
peethebee Posted July 15, 2007 Author Posted July 15, 2007 Hi!Reuploaded:http://www.autoit.de/peethebee/RSA-PlugIn_0.5.zippeethebee AutoFan 1 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
twitchyliquid64 Posted October 14, 2010 Posted October 14, 2010 THANKYOU THANKYOU THANKYOU. I have been looking for something like this to use for my P2P Program. One question; how secure is it? Would it be safe to say to my users that their data is secure (128bit key) for all non-polictical purposes? What key length do I need for secure transfer? What key length would be appropriate for encryption speed considering there are approx 10 msg needing to be processed a second? ongoing projects:-firestorm: Largescale P2P Social NetworkCompleted Autoit Programs/Scripts: Variable Pickler | Networked Streaming Audio (in pure autoIT) | firenet p2p web messenger | Proxy Checker | Dynamic Execute() Code Generator | P2P UDF | Graph Theory Proof of Concept - Breadth First search
AutoFan Posted December 9, 2014 Posted December 9, 2014 It took very long time to encrypt and got this error when it tried to decrypt : Hi! Reuploaded:http://www.autoit.de/peethebee/RSA-PlugIn_0.5.zip peethebee
BrewManNH Posted December 9, 2014 Posted December 9, 2014 The OP hasn't been on here in over 2 years, so I'm not sure you're going to get much from him. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator
water Posted May 22, 2016 Posted May 22, 2016 The OP has not been here for over 4 years. So I'm not sure you're going to get a quick reply. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
BrewManNH Posted June 7, 2016 Posted June 7, 2016 21 hours ago, Trong said: SomeMods Please fix first post! Why bother, let this thread finally die. The link is dead, and the OP hasn't been here in over 4 years, there's nothing in here of value. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now