Jump to content

RSA-Encryption-Plugin


peethebee
 Share

Recommended Posts

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:

CODE
RSA_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 :whistle: {

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- :lol: % 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 * 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 by peethebee

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

  • 2 months later...

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Hi!

The RSA factoring challenge gives a hint of the time needed to crack:

http://www.rsa.com/rsalabs/node.asp?id=2964

It 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

Link to comment
Share on other sites

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

I 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)

Link to comment
Share on other sites

  • 2 months later...

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!

Link to comment
Share on other sites

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 :whistle: .

Thanks for your plaudit,

peethebee

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvGerman Forums: http://www.autoit.deGerman Help File: http://autoit.de/hilfe vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

Link to comment
Share on other sites

  • 3 years later...

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

Link to comment
Share on other sites

  • 4 years later...

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 Gude
How 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

Link to comment
Share on other sites

  • 1 year later...

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 2022-02-19 - Version 1.6.1.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 (NEW 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

 

Link to comment
Share on other sites

  • 3 weeks later...

 

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 Gude
How 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

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...