xkor, насколько я понял В используется только для обозначения длины ключа...
Про GMP я уже читал и на этом форуме и на олчитс, но не мог никак выбрать нужные мне функции, в итоге скачал исходники GMP и там уже все нашел.
mpz_inp_str(dest_integer, stream, base) -- Input a number in base BASE from stdio stream STREAM and store the result in DEST_INTEGER.
#define mpz_inp_str __gmpz_inp_str
__GMP_DECLSPEC size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, FILE *, int));
mpz_powm(res,base,exp,mod) -- Set RES to (base**exp) mod MOD.
#define mpz_powm __gmpz_powm
__GMP_DECLSPEC void mpz_powm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr));
mpz_out_str(stream, base, integer) -- Output to STREAM the multi prec. integer INTEGER in base BASE.
#define mpz_out_str __gmpz_out_str
__GMP_DECLSPEC size_t mpz_out_str __GMP_PROTO ((FILE *, int, mpz_srcptr));
И если я все правильно понял, то должно получиться примерно сследующее:
Код:
void RSA_Encrypt(char *packet,char *RSAKey)
{
char *string_to_encrypt;
memcpy(string_to_encrypt,packet+2,128); //необходимо зашифровать только 128 байт начиная с 3
mpz_t Pa,raw,n,e;
mpz_init(Pa);
mpz_init(raw);
mpz_init(n);
mpz_init(e);
mpz_inp_str(raw,string_to_encode,16);
mpz_inp_str(n,RSAKey,16);
mpz_inp_str(e,"65537",10);
mpz_powm(
Pa, // рез-т
raw, // основание (т.е. блок, который необходимо зашифровать)
e, //65537
n); //из пакета инит
mpz_out_str(
string_to_encrypt,
16,
Pa);
memcpy(packet+2,string_to_encrypt,128); //запихиваем в пакет зашифрованный блок
}