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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
The RSA encryption and utility routines.
The RSA routines are built on top of a big number library (the BN library).
There are support routines in the X509 library for loading and manipulating
the various objects in the RSA library. When errors are returned, read
about the ERR library for how to access the error codes.
All RSA encryption is done according to the PKCS-1 standard which is
compatible with PEM and RSAref. This means that any values being encrypted
must be less than the size of the modulus in bytes, minus 10, bytes long.
This library uses RAND_bytes()() for it's random data, make sure to feed
RAND_seed() with lots of interesting and varied data before using these
routines.
The RSA library has one specific data type, the RSA structure.
It is composed of 8 BIGNUM variables (see the BN library for details) and
can hold either a private RSA key or a public RSA key.
Some RSA libraries have different structures for public and private keys, I
don't. For my libraries, a public key is determined by the fact that the
RSA->d value is NULL. These routines will operate on any size RSA keys.
While I'm sure 4096 bit keys are very very secure, they take a lot longer
to process that 1024 bit keys :-).
The function in the RSA library are as follows.
RSA *RSA_new();
This function creates a new RSA object. The sub-fields of the RSA
type are also malloced so you should always use this routine to
create RSA variables.
void RSA_free(
RSA *rsa);
This function 'frees' an RSA structure. This routine should always
be used to free the RSA structure since it will also 'free' any
sub-fields of the RSA type that need freeing.
int RSA_size(
RSA *rsa);
This function returns the size of the RSA modulus in bytes. Why do
I need this you may ask, well the reason is that when you encrypt
with RSA, the output string will be the size of the RSA modulus.
So the output for the RSA_encrypt and the input for the RSA_decrypt
routines need to be RSA_size() bytes long, because this is how many
bytes are expected.
For the following 4 RSA encryption routines, it should be noted that
RSA_private_decrypt() should be used on the output from
RSA_public_encrypt() and RSA_public_decrypt() should be used on
the output from RSA_private_encrypt().
int RSA_public_encrypt(
int from_len;
unsigned char *from
unsigned char *to
RSA *rsa);
This function implements RSA public encryption, the rsa variable
should be a public key (but can be a private key). 'from_len'
bytes taken from 'from' and encrypted and put into 'to'. 'to' needs
to be at least RSA_size(rsa) bytes long. The number of bytes
written into 'to' is returned. -1 is returned on an error. The
operation performed is
to = from^rsa->e mod rsa->n.
int RSA_private_encrypt(
int from_len;
unsigned char *from
unsigned char *to
RSA *rsa);
This function implements RSA private encryption, the rsa variable
should be a private key. 'from_len' bytes taken from
'from' and encrypted and put into 'to'. 'to' needs
to be at least RSA_size(rsa) bytes long. The number of bytes
written into 'to' is returned. -1 is returned on an error. The
operation performed is
to = from^rsa->d mod rsa->n.
int RSA_public_decrypt(
int from_len;
unsigned char *from
unsigned char *to
RSA *rsa);
This function implements RSA public decryption, the rsa variable
should be a public key (but can be a private key). 'from_len'
bytes are taken from 'from' and decrypted. The decrypted data is
put into 'to'. The number of bytes encrypted is returned. -1 is
returned to indicate an error. The operation performed is
to = from^rsa->e mod rsa->n.
int RSA_private_decrypt(
int from_len;
unsigned char *from
unsigned char *to
RSA *rsa);
This function implements RSA private decryption, the rsa variable
should be a private key. 'from_len' bytes are taken
from 'from' and decrypted. The decrypted data is
put into 'to'. The number of bytes encrypted is returned. -1 is
returned to indicate an error. The operation performed is
to = from^rsa->d mod rsa->n.
int RSA_mod_exp(
BIGNUM *n;
BIGNUM *p;
RSA *rsa);
Normally you will never use this routine.
This is really an internal function which is called by
RSA_private_encrypt() and RSA_private_decrypt(). It performs
n=n^p mod rsa->n except that it uses the 5 extra variables in the
RSA structure to make this more efficient.
RSA *RSA_generate_key(
int bits;
unsigned long e;
void (*callback)();
This routine is used to generate RSA private keys. It takes
quite a period of time to run and should only be used to
generate initial private keys that should then be stored
for later use. The passed callback function
will be called periodically so that feedback can be given
as to how this function is progressing.
'bits' is the length desired for the modulus, so it would be 1024
to generate a 1024 bit private key.
'e' is the value to use for the public exponent 'e'. Traditionally
it is set to either 3 or 0x10001.
The callback function (if not NULL) is called in the following
situations.
when we have generated a suspected prime number to test,
callback(0,num1++). When it passes a prime number test,
callback(1,num2++). When it is rejected as one of
the 2 primes required due to gcd(prime,e value) != 0,
callback(2,num3++). When finally accepted as one of the 2 primes,
callback(3,num4++).
|