---------------------------------------------------------------------__fastcall TForm1 :: btnDecryptClick (TObject * Sender)
{(EditD- gt; Text.IsEmpty ()) {- gt; SimpleText= Чи не задана секретна експонента d raquo ;;;
} (EditN2- gt; Text.IsEmpty ()) {- gt; SimpleText= Не настроєно модуль n raquo ;;;
} privKey; .d=_atoi64 (EditD- gt; Text.c_str ()) ;. n=_atoi64 (EditN2- gt; Text.c_str ()); (! OpenDialogDecrypt- gt; Execute ()) return; fname=OpenDialogDecrypt- gt; FileName; (fname.SubString (fname.Length () - 3, 4) .LowerCase () == .enc )=fname.SubString (0, fname.Length () - 4); gt; FileName=fname; (! SaveDialogDecrypt- gt; Execute ()) return; * f=fopen (OpenDialogDecrypt- gt; FileName.c_str (), rb ); (! f) {// Файл не буде открился- gt; SimpleText= Помилка відкриття файлу + OpenDialogDecrypt- gt; FileName ;;
} * g=fopen (SaveDialogDecrypt- gt; FileName.c_str (), wb ); (! g) {// Файл не буде открился- gt; SimpleText= Помилка створення файлу + OpenDialogEncrypt- gt; FileName + .enc raquo ;; (f) ;;
} me;// Зашифроване сообщеніеm;// Розшифрувати сообщеніеr;// Лічильник лічених бітів gt; Max=filelength (fileno (f))/sizeof (Int32); gt; Position=0; (! Feof (f)) {= fread ( amp; me, 1, sizeof (Int32), f );
if (r lt; sizeof (Int32)) {// Останні байти, яких менше 4, пишемо без розшифрування ( amp; me, 1, r, g) ;;
}=rsaDecrypt (me, amp; privKey); ( amp; m, 1, r, g); gt; StepIt ();
} (f); (g); gt; Position=0; - gt; SimpleText= Файл + OpenDialogDecrypt- gt; FileName + розшифрований raquo ;;
}
//---------------------------------------------------------------------------
RSAutil.cpp
# pragma hdrstop
# include RSAutil.h
# include Numeric.h
//---------------------------------------------------------------------------
# pragma package (smart_init)
//Методи RSA
//Генерація ключейrsaGenerate (rsaPublicKey * pubKey, rsaPrivateKey * privKey) {p, q, e; n, f, d;=3;// Вибираємо відриту експоненту E {= RandomPrime (16);// Випадкові фактори=RandomPrime (16);//=(Int64) p * q;// Модуль=(Int64) (p - 1) * (q - 1);// Функція Ейлера
//Перевіряємо, що E взаємно просте cf (IsSimple (e, f)) break;
} (1);
//Обчислюємо секретну експоненту=Inverse (e, f); gt; e=e; gt; n=n; gt; d=d; gt; n=n;
}
//Шифрування повідомлення на відкритому ключеrsaEncrypt (Int32 m, rsaPublicKey * pubKey) {me; (m lt; pubKey- gt; n) {= ModPow (m, pubKey- gt; e, pubKey- gt; n); (me lt; pubKey- gt; n) return me; m;
} m;// Числа менше модулів не шифруємо
}
//Дешифрування повідомлення на закритому ключеrsaDecrypt (Int32 c, rsaPrivateKey * privKey) {(c lt; privKey- gt; n) ModPow (c, privKey- gt; d, privKey- gt; n); c;// Числа менше модулів не розшифровуємо
}
RSA.cpp
#include lt; vcl.h gt;
#pragma hdrstop
//---------------------------------------------------------------------------(laquo;Unit1.cppraquo;, Form1);
//--------------------------------------------------------------------------- WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
{ gt; Initialize (); gt; Title= Шифрування методом RSA raquo ;; gt; CreateForm (__ classid (TForm1), amp; Form1); gt; Run ();
} (Exception amp; exception)
{ gt; ShowException ( amp; exception);
} (...)
{
{Exception ( );
} (Exception amp; exception)
{ gt; ShowException ( amp; exception);
}
} 0;
}. cpp
#pragma hdrstop
#include lt; math.h gt;
#include lt; limits.h gt;
#include lt; stdlib.h gt;
#include Numeric.h
//---------------------------------------------------------------------------
#pragma package (smart_init)
//Арифметичні алгоритми
//Розширений алгоритм Евкліда знаходження найбільшого спільного дільника чисел A і BEGCD (Int64 a, Int64 b, Int64 * u) {v [3]; t [3]; q; i;
//У масив u заноситься більше число [0]=(a gt; b? a: b); u [1]=1; u [2]=0; [0]=(a gt; b? b: a); v [1]=0; v [2]=1; (v [0]!=0) {= u [0]/v [0]; [0]=u [0]% v [0]; [1]=u [1]- q * v [1]; [2]=u [2] - q * v [2]; (i=0; i lt; 3; i ++) u [i]=v [i]; (i=0 ; i lt; 3; i ++) v [i]=t [i];
}
//У результаті в масиві v будуть числа: НОД (a, b), x, y - значення такі, що a * x + b * y=НОД (a, b)
}
//НОДGCD (Int64 a, Int64 b) {v [3]; (a, b, v); v [0];
}
...