Kết luận về RSA
Hệ mã hoá mật mã RSA có tính bảo mật cao và được ứng dụng rộng rãi trong thực tiễn như bảo mật trong trao đổi dữ liệu điện tử, thương mại điện tử, chuyển đổi tiền tệ, phân bổ phần mềm, Nhưng về tốc độ, giải thuật RSA chậm hơn rất nhiều so với giải thuật DES
Hướng phát triển:
Có thể cài đặt chương trình mã hoá dùng giải thuật RSA vào các ứng dụng khác như email, chat, winword, Nếu có thêm thời gian và tiền bạc thì chương trình này sẽ hoàn thiện hơn.
74 trang |
Chia sẻ: baoanh98 | Lượt xem: 879 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Giải thuật mã hoá mật mã RSA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
rằng ở đây ta không áp dụng tính với số 13 để có số 7 mà ta tính toán theo cách sau:
m' = 13^7 mod 33 = 13^(3+3+1) mod 33 = 13^3.13^3.13 mod 33
= (13^3 mod 33).(13^3 mod 33).(13 mod 33) mod 33
= (2197 mod 33).(2197 mod 33).(13 mod 33) mod 33
= 19.19.13 mod 33 = 4693 mod 33 =7
Nếu ta tính toán c từ m có giá trị ( 0, 32) ta có:
m 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
c 0 1 8 27 31 26 18 13 17 3 10 11 12 19 5 9 4
m 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
c 29 24 28 14 21 22 23 30 16 20 15 7 2 6 25 32
Nhưng theo hệ thống Unicode ta sẽ bỏ đi 0 và 1 không còn bí mật nữa mà nó công khai vì khi ta đã mã hoá rồi mà nó vẫn còn nguyên như cũ. Do đó phải loại bỏ nó đi và ta chọn số khác. Nếu ta muốn sử dụng hệ thống bảo mật này ta cần chọn A=2, B=3, ..., Z=27.
Chẳng hạn như ta muốn chọn thông báo cần mã hoá có tên là: "HELLOWORLD" và được thể hiện dưới dạng số nguyên m1, m2
Ta có: {9, 6, 13, 13, 16, 24, 16, 19, 13, 5}
Và ta có thông báo mã hoá:
{3, 18, 19, 19, 4, 30, 4, 28, 19, 26}
Chú ý rằng:
Cách mã hoá trên gần giống với Ceasar nhưng không phải vì ta sử dụng giải thuật RSA.
c. Ví dụ 3:
Cho một thông báo sau:
ATTACKxATxSEVEN = ATT ACK XAT XSE VEN
Ta chia thông báo kia theo khối gồm 3 ký tự, dựa trên nền gồm 26 ký tự: A=0, B=1, C=2, ..., Z=25
ATT = 0 x 26^2 + 19 x 26^1 + 19 = 513
ACK = 0 x 26^2 + 2 x 26^1 + 10 = 62
XAT = 23 x 26^2 + 0 x 26^1 + 19 = 15567
XSE = 23 x 26^2 + 18 x 26^1 + 4 = 16020
VEN = 21 x 26^2 + 4 x 26^1 + 13 = 14313
Với ví dụ trên ta không phải lo lắng về các con số và các ký tự chấm câu hay những nhóm như AAA hay AAB. Trong hệ thống mã hoá này giá trị lớn nhất của cụm ZZZ là 26^3-1 = 17575 vì thế ta phải yêu cầu một số môđun n lớn hơn số này.
Ta “sinh” ra cặp khoá số nguyên tố p=137 và q=131
n = pq = 137.131 = 17947
phi = (p-1)(q-1) = 136.130 = 17680
chọn e = 3
Kiểm tra gcd(e, p-1) = gcd(3, 136) = 1, kiểm tra gcd(e, q-1) = gcd(3, 130) = 1, cả hai đều phù hợp à chọn.
Ta tính toán: d = e^-1 mod phi = 3^-1 mod 17680 = 11787.
Lúc này cặp khóa như sau: khóa công khai là (n, e) = (17947, 3) và khoá bí mật là: (n, d) = (17947, 11787).
Hàm mã hoá RSA.
unsigned long RSA_encrypt(char *source, unsigned long source_size, char *result, unsigned long result_size, char *pubkey_content, unsigned long pubkey_content_size)
{
if(!RSA_load_public_certificate_from_buffer(pubkey, pubkey_content, pubkey_content_size))
goto err;
chiper_block_length_byte = (pubkey->modulus_length / 8); chiper_BN_ULONG_length = chiper_block_length_byte / 4;
message_block_length_byte = chiper_block_length_byte - 16;
message_BN_ULONG_length = message_block_length_byte / 4;
if(source_size % message_block_length_byte) source_padded_length = ((source_size / message_block_length_byte) + 1) * message_block_length_byte;
else
source_padded_length = (source_size / message_block_length_byte) * message_block_length_byte;
// cấp phát bộ nhớ.
source_padded = (char *) malloc(source_padded_length);
if(source_padded == NULL) goto err;
if(!RSA_insert_padding(source, source_padded, source_size, source_padded_length, source_padded_length - source_size)) goto err;
total_block = source_padded_length / message_block_length_byte;
// lưu vào bộ đệm đích.
target_size = total_block * chiper_block_length_byte;
target = (char *) malloc(target_size);
if(target == NULL) goto err;
memset(target, 0, target_size);
original_target_pointer = target;
//vòng lặp.
// bắt đầu mã hóa từng khối một
for(i = 0; i < source_padded_length; i += essage_block_length_byte)
{
// đổi biến con trỏ char* sang biến con trỏ BIGNUM*
memcpy(sourcebn->d, source_padded + i, message_block_length_byte);
// mã hóa một khối
if(RSA_public_certificate_do_1_block(targetbn, source_oaep_encoded, pubkey, ctx))
goto err;
// lưu kết quả và chuyển đổi BIGNUM* ngược trở lại char*
memcpy(target, targetbn->d, chiper_block_length_byte);
target += chiper_block_length_byte;
// tăng bộ đếm để lưu vị trí tiếp theo.
}
target = original_target_pointer;
if(result_size < target_size) goto err;
memcpy(result, target, target_size);
// giải phóng bộ nhớ đã cấp phát
free(target);
free(source_padded);
BN_free(sourcebn);
BN_free(targetbn);
BN_free(source_oaep_encoded);
BN_CTX_free(ctx);
RSA_public_certificate_free(&pubkey);
return(target_size);
}
Giải thuật mã hoá PEM
const unsigned char PEM_encode_data[] =
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //0-7
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', //8-15
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', //16-23
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', //24-31
‘g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', //32-39
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', //40-47
'w', 'x', 'y', 'z', '0', '1', '2', '3', //48-55
‘4', '5', '6', '7', '8', '9', '+', '/', }; //56-63
Dữ liệu của PEM không được sắp xếp và trang thái tự nhiên
const unsigned char PEM_decode_data[] =
{0, 0, 0, 0, 0, 0, 0, 0, //0-7
0, 0, 0, 0, 0, 0, 0, 0, //8-15
0, 0, 0, 0, 0, 0, 0, 0, //16-23
0, 0, 0, 0, 0, 0, 0, 0, //24-31
0, 0, 0, 0, 0, 0, 0, 0, //32-39
0, 0, 0, 62, 0, 0, 0, 63, //40-47
52, 53, 54, 55, 56, 57, 58, 59, //48-55
60, 61, 0, 0, 0, 0, 0, 0, //56-63 ... 61 = '='
0, 0, 1, 2, 3, 4, 5, 6, //64-71
7, 8, 9, 10, 11, 12, 13, 14, //72-79
15, 16, 17, 18, 19, 20, 21, 22, //80-87
23, 24, 25, 0, 0, 0, 0, 0, //88-9
0, 26, 27, 28, 29, 30, 31, 32, //96-10
33, 34, 35, 36, 37, 38, 39, 40, //104-111
41, 42, 43, 44, 45, 46, 47, 48, //112-119
49, 50, 51, }; //120-122
int PEM_encode(char *source, char *target, int sourceLen, int targetLen)
{ // Đổi từ 8 bit sang 6 bit .. tăng kích thước 33, 3%
// Kiểm tra chiều dài .... Đây là chiều dài nhỏ nhất được yêu cầu ...tránh những khe hở trong bộ nhớ
if(sourceLen + (sourceLen / 2) > targetLen)
return(0);
total_block = sourceLen / small_size;
pSource = (unsigned long *) source;
for(i = 0; i < total_block; i++)
{ sourceValue = (*pSource & 0x00ffffffL);
// lưu trữ chúng
for(y = 0; y < big_size; y++)
{
*(target++) = PEM_encode_data[sourceValue & max_six_bits]; // Đổi trực tiếp sang PEM
sourceValue >>= six;
}
// Tăng bộ đếm
pSource = (unsigned long *)(((char *) pSource) + small_size);
}
left_over = sourceLen % small_size;
if(left_over)
{
sourceValue = 0;
memcpy(&sourceValue, pSource, left_over);
for(y = 0; y < left_over; y++)
{
*(target++) = PEM_encode_data[sourceValue & max_six_bits];
sourceValue >>= six;
}
*(target++) = PEM_encode_data[sourceValue & max_six_bits];
// Chèn vào vùng đệm
if(left_over == 1)
{ *(target++) = '=';
*(target++) = '=';
}
else
*(target++) = '=';
}
// Tính kích thước cuối cùng hiện hành
if(left_over)
final_target_size = ((total_block + 1) * big_size);
else
final_target_size = (total_block * big_size);
// quay lai từ đầu
target = original_target;
// tách thành mỗi max_total_character_in_a_line per-line
total_line = final_target_size / max_total_character_in_a_line;
for(i = 0; i < total_line; i++)
{
memcpy(pTemp, target, max_total_character_in_a_line);
target += max_total_character_in_a_line;
pTemp += max_total_character_in_a_line;
memcpy(pTemp, CRLF, CRLF_length);
pTemp += CRLF_length;
}
// kiểm tra leftover
left_over = final_target_size - (total_line * max_total_character_in_a_line);
if(left_over)
{ // nếu co leftover , thực hiện
memcpy(pTemp, target, left_over);
pTemp += left_over;
}
final_target_size = pTemp - temp;
if(final_target_size > targetLen)
return(0);
Hàm giải mã RSA:
unsigned long RSA_decrypt(char *source, unsigned long source_size,
char *result, unsigned long result_size, char *prikey_content, unsigned long prikey_content_size)
{
if(!RSA_load_private_key_from_buffer(prikey, prikey_content, prikey_content_size))
goto err;
// đổi kiểu dữ liệu thô của khóa riêng sang cấu trúc khóa riêng RSA
chiper_block_length_byte = (prikey->modulus_length / 8); chiper_BN_ULONG_length = chiper_block_length_byte / 4;
message_block_length_byte = chiper_block_length_byte - 16; message_BN_ULONG_length = message_block_length_byte / 4;
// biến source_size phải là bội số của biến chiper_block_length_byte
total_block = source_size / chiper_block_length_byte;
// lưu vào bộ đệm đích
target_size = total_block * message_block_length_byte;
target = (char *) malloc(target_size);
if(target == NULL)
goto err;
memset(target, 0, target_size);
original_target_pointer = target;
// bắt đầu giải mã theo từng khối một.
for(i = 0; i < source_size; i += chiper_block_length_byte)
{
// chuyển đổi từ char* sang BIGNUM*
memcpy(sourcebn->d, source + i, chiper_block_length_byte);
//bắt đầu giải mã một khối
if(RSA_private_key_CRT_do_1_block(targetbn, sourcebn, prikey, ctx))
goto err;
OAEP_decode(targetbn, target_oaep_decoded, message_block_length_byte * 8);
memcpy(target, target_oaep_decoded->d, message_block_length_byte);
target += message_block_length_byte;
}
}
6. Khóa RSA.
Chiều dài khóa công khai ( khóa không đối xứng) :
Những giải thuật mã hoá khoá công khai dựa vào việc phân tích thành thừa số những số nguyên rất lớn, kết quả của việc nhân hai số nguyên tố lớn. Những giải thuật này không cố gắng thử từng khoá có khả năng mà cố gắng tìm thừa số của một số nguyên lớn, nếu tìm được số nguyên có độ lớn thích hợp thì tính bảo mật càng cao. Tùy thuộc thời gian bảo mật hữu hiệu cho khoá mà ta có 3 loại chiều dài khoá cho mỗi năm: một cho cá nhân, một cho công ty kinh doanh và một giành cho chính quyền.
Năm
Cá nhân
Công ty
Chính quyền
1995
768
1028
1536
2000
1024
1028
1536
2005
1280
1536
2048
2010
1280
1536
2048
2015
1536
2048
2048
Kỹ thuật phân tích thừa số đã và đang phát triển. Do đó, chiều dài khoá cũng ngày càng lớn để tăng cường tính bảo mật.
Nếu có sự chọn lựa giữa chiều dài khoá đối xứng và chiều dài khoá công khai, bạn nên chọn chiều dài khoá công khai vì nó bảo mật hơn, tồn tại lâu hơn và bảo vệ được nhiều thông tin hơn.
Khai báo cấu trúc khóa công khai:
typedef struct public_key
{
unsigned short modulus_length;
BIGNUM *e;
BIGNUM *n;
} pub_key;
Chiều dài khóa riêng:
Những giải thuật mã hoá khoá riêng sử dụng một khoá riêng để mã hoá và giải mã dữ liệu. Bạn phải bảo mật khoá, tránh sự truy cập của người khác bởi vì bất kỳ một người nào khác nếu có khoá này sẽ dùng khóa này để giải mã được dữ liệu của bạn. Trong mã hoá đối xứng, khoá riêng cũng là khóa chung bởi vì nó mã hoá và giải mã chỉ cùng một khoá. Giải thuật này cực nhanh so với những giải thuật khoá công khai và tiện cho việc đổi mật mã những dòng dữ liệu lớn.
Nhìn chung những giải thuật khoá riêng, được sử dụng để để mã hoá một khối dữ liệu tại một thời điểm. Những mã khối, như DES chẳng hạn, đổi sang mã một khối n byte đầu vào sang một khối byte mã hoá đầu ra. Nếu muốn mã hoá một chuỗi byte, bạn phải thực hiện theo từng khối một. Kích thước của nhỏ (thường bằng 8, 16, 24), nhưng đối với những giá trị lớn hơn phải được mã hoá mỗi khối một ít.
Sự bất tiện của mã hoá khoá riêng là giữa hai người quan hệ phải có sự nhất trí theo một khoá, một vectơ khởi tạo và truyền thông những giá trị của họ. Và khoá cũng phải được giữ kín với người khác. Chính vì vậy, mã hoá khoá riêng thường kết hợp với mã hoá khoá chung để truyền thông riêng những giá trị khoá và khóa khởi tạo.
Khai báo cấu trúc của khóa bí mật:
typedef struct private_key
{
unsigned short modulus_length;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dp;
BIGNUM *dq;
BIGNUM *e;
BIGNUM *qinv;
} pri_key;
6.3. Quản lý khoá.
Những phương thức của việc quản lý khóa vô cùng quan trọng. Trong thực tế, hầu hết mọi sự tấn công trong hệ thống khóa công khai sẽ tập trung vào mức độ quản lý khóa còn hơn là tấn công vào giải thuật mã hóa của chính chương trình.
Những ai muốn ký vào một thông điệp hay để nhận một thông điệp được mã hóa phải có một cặp khóa. Người ta có thể có nhiều khóa. Chẳng hạn, một người có một khóa liên kết với nơi làm việc của người đó và một khóa bí mật cho mục đích sử dụng cá nhân.
Mỗi người sử dụng nên phát sinh ra một cặp khóa bí mật của riêng mình. Nhưng đây là một bảo mật đầy rủi ro vì nó có dính dáng đến việc truyền khóa bí mật trên mạng cũng như sẽ có kết cục không hay nếu như một kẻ tấn công xâm nhập vào vị trí phát sinh khóa. Với mỗi điểm trên mạng có khả năng phát sinh khóa cục bộ, vì vậy khóa bí mật không bao giờ được truyền đi và không mở rộng khóa nguồn để đảm bảo tin cậy trung thực. Tất nhiên phần mềm phát sinh khóa cục bộ phải đáng tin cậy. Những hệ thống nhận diện khóa bảo mật chẳng hạn như Kerberos thường không cho phép phát sinh bộ nhưng thay vào đó sử dụng một máy chủ trung tâm để phát sinh khóa.
Một khi phát sinh khóa, người sử dụng phải đăng ký khóa chung của người đó cho một số nhà quản trị trung tâm, được gọi là tổ chức cung cấp chứng nhận. Tại đây, họ trả về một cho người sử dụng một chứng nhận chứng thực sự thật khóa chung của người sử dụng trên suốt tất cả mọi thông tin. Hầu hết những người sử dụng không thu được một chứng nhận cho cùng một khóa tương tự, để đơn giản những tác vụ của kế toán đơn giản liên kết với một khóa.
6.4. Cách tìm khóa ngẫu nhiên .
Bạn cần những số ngẫu nhiên để tìm hai số nguyên tố ngẫu nhiên cho mođun n. Nếu bạn dùng phương pháp dự đoán để phát sinh số nguyên tố, kẻ xâm nhập có thể tấn công bằng cách cố gắng tái tạo lại quá trình phát sinh khoá.
Những số ngẫu nhiên thu được từ một tiến trình vật lý nói chung là tốt nhất. Người ta có thể dùng một thiết bị phần cứng, như điôt chẳng hạn, được bán trên những mạch thêm vào máy tính cho mục đích này. Một ý khác là sử dụng những môi trường vật lý của người sử dụng máy tính, chẳng hạn như việc định giờ phím nhấn được đo bằng micrô giây. Nhưng bằng bất kỳ phương pháp nào thì những số ngẫu nhiên chứa những sự tương quan tính ngẫu nhiên thống kê đủ.
Chú ý: Người ta không cần những số ngẫu nhiên để xác định để xác định những khoá chung và khoá riêng sau khi chọn muđun n. Họ có thể chọn một giá trị tuỳ ý cho khoá công khai.
Phát sinh khóa ngẫu nhiên:
int RSA_generate_keys(char *privatekey, char *publiccertificate,
int *privatekey_length, int *publiccertificate_length, int primeBitSize)
{
generate_key:
prikey->p = BN_generate_prime(NULL, primeBitSize, 0, NULL, NULL, NULL, NULL);
prikey->q = BN_generate_prime(NULL, primeBitSize, 0, NULL, NULL, NULL, NULL);
}
Việc bảo vệ khóa hay còn xem xét đến việc kiểm tra khóa được thể hiện qua hình sau:
Hình 8 : Kiểm tra khóa.
Sơ đồ bảo vệ khóa, thông qua hệ thống bảo mật:
Hình 9: Hình thức kiểm tra khóa bảo mật.
Những người sử dụng phải giữ được một cách chắc chắn cặp khóa phù hợp với khả năng và những bảo mật cần thiết. Đó phải là cách tìm kiếm khóa chung của người khác đưa ra công khai khóa mà người đó sở hữu. Những người sử dụng phải giải trình tính hợp pháp trong những khóa công khai của người khác; nói cách khác người xâm nhập có thể thay đổi những khóa công khai được liệt kê trong một thư mục hay đóng vai một người sử dụng khác. Chứng nhận được sử dụng cho mục đích này. Chứng nhận phải thật, có thể tìm thấy trong danh sách bảo mật và được xử lý như trong trường hợp kẻ xâm nhập lạm dụng điều này. Ban hành chứng nhận phải được xử lý trong trường hợp bảo mật, ngăn chặn mọi tấn công. Nếu như một khóa bí mật của một ai đó bị mất hay bị xâm phạm, những người khác trong hệ thống phải nhận ra điều này, chính vì thế họ không thể mã hoá những thông điệp dưới những khóa chung đã bị vô hiệu và cũng không cho phép những thông điệp gán với khóa bí mật bị vô hiệu đó nữa. Những người sử dụng phải lưu trữ khóa bí mật của họ một cách an toàn mà không một kẻ xâm nhập nào có thể tìm kiếm được nó còn những khóa khác phải được sẵn sàng sử dụng cho việc sử dụng hợp pháp. Những khóa đó có giá trị trong một thời hạn cho phép. Thời hạn cho phép phải được chọn có mục đích thích đáng và được đưa ra công khai một cách an toàn. Một vài văn bản phải có chữ ký để thẫm tra thời gian khi khóa được sử dụng để gán còn thời hạn. Mặc dù những vấn đề quản lý khóa nảy sinh trong một số hệ thống mã hóa, để thích hợp họ đưa vấn đề này vào RSA.
6.5. Phân bố khóa bảo mật:
Việc tiến hành bảo vệ thông tin truyền trên mạng được tổ chức nhiều lần trên nhiều mức khác nhau :
Giữa thiết bị đầu với thiết bị đầu (end - to - end encryption).
Giữa thiết bị đầu với máy chủ (terminal - to - host encryption).
Giữa các máy chủ với nhau (host - to - host encryption).
Hình 10: Bảo mật tại nơi ra và nơi nhận vào của hai người sử dụng.
Terminal - to - host encryption
Hình 11: Bảo mật tại nơi ra của người gửi và tại nơi nhận trước khi vào hệ thống của người nhận.
Hình12: Kết hợp bảo mật tại các máy chủ.
Số nguyên tố và phân tích thành thừa số:
Phát sinh số nguyên tố:
Hai số nguyên tố p và q nên có chiều dài bằng nhau, điều này sẽ làm cho mođun n khó phân tích hơn là có một trong hai số nguyên tố rất nhỏ. Vì vậy, nếu ta chọn dùng môđun n 512 bít thì mỗi số nguyên tố nên có chiều dài xấp xỉ 256 bít.
Trong hầu hết tất cả hệ khoá công khai, kích thước của khoá phù hợp với kích thước những đầu vào cho hàm một chiều, kích thước càng lớn thì sự khác biệt trong việc tính toán hàm theo hướng thuận và hướng nghịch càng lớn.
Những hệ mật mã khoá công khai trong thực tế dựa trên những hàm được xem là một chiều nhưng chúng không được chứng minh, có nghĩa là về mặt lý thuyết, một giải thuật sẽ có thể được phục hồi để có thể tính hàm nghịch một cách dễ dàng mà không cần cửa bẫy. Sự phát triển này sẽ hoàn trả lại một hệ mã bất kỳ dựa trên hàm một không an toàn và vô dụng đó.
Kiểm tra số nguyên tố:
int BN_is_prime(const BIGNUM *a, int checks, void ( *callback) (int, int, void *), BN_CTX *ctx_passed, void *cb_arg)
{
return BN_is_prime_fasttest(a, checks, callback, ctx_passed, cb_arg, 0); }
Hàm phát sinh số nguyên tố:
BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe,
const BIGNUM *add, const BIGNUM *rem, void (*callback)(int, int, void *), void *cb_arg)
{
loop:
/* tạo ra một số ngẫu nhiên và thíêt lập bít đầu và bít cuối */
if (add == NULL)
{if (!probable_prime(rnd, bits)) goto err; }
else {
if (safe)
{if (!probable_prime_dh_safe(rnd, bits, add, rem, ctx))
goto err;}
else {if (!probable_prime_dh(rnd, bits, add, rem, ctx)) goto err;}
}
Phân tích thành thừa số:
Phân tích thành thừa số là việc phân những số nguyên thành những số nguyên nhỏ hơn mà khi nhân những số đó với nhau sẽ thành số nguyên ban đầu. Phân tích thừa số nguyên tố đòi hỏi phải phân một số nguyên thành những thừa số là những số nguyên tố. Nhân hai số nguyên tố thì dễ, nhưng việc phân tích thành thừa số nguyên tố thì khó hơn nhiều.
Ý nghĩa của việc phân tích thừa số trong mật mã :
Phân tích thừa số nguyên tố là vấn đề khó khăn trong nhiều hệ mã khoá công khai, kể cả RSA.Việc phân tích thành thừa số một muđun RSA cho phép kẻ thù tìm ra khoá riêng. Vì vậy, bất cứ ai có thể phân tích thành thừa số một muđun đều có thể mã hoá thông điệp và giả mạo chữ ký. Nhưng đây là một việc hết sức khó khăn.
Phân tích thành thừa số những số nguyên lớn mất nhiều thời gian hơn so với những số nguyên nhỏ. Điều này lý giải tại sao kích thước muđun RSA xác định tính bảo mật như thế nào; muđun càng lớn, việc phân tích thành thừa số nguyên tố càng khó.
Vấn đề của phân tích thừa số:
Việc phân tích thành thừa số trở nên dễ dàng hơn cách đây 15 năm bởi phần cứng máy tính ngày càng mạnh hơn và những giải thuật phân tích thừa số nguyên tố ngày càng phát triển.
Sự phát triển về phần cứng làm cho RSA càng bảo mật hơn bởi vì nó làm cho kẻ địch phải phân tích thành thừa những số lớn hơn trong cùng một thời gian so với trước kia và cho phép người sử dụng dùng một khoá có hằng tá số dài hơn trước kia. Người sử dụng có thể chọn một khoá có hằng tá số dài hơn trước đó mà chưa kể đến việc phân tích thành thừa số càng khó hơn nhiều cho kẻ thù. Vì vậy, mặc dù phần cứng phát triển sẽ giúp cho kẻ thù nhưng nó giúp người sử dụng còn nhiều hơn. Quy luật chung này có thể thất bại trong trường hợp dùng những máy có tốc độ cao của tương lai để tấn công vào những khoá đời cũ nhờ vào sự tiến bộ của phần cứng.
Những giải thuật phân tích thành thừa số tốt hơn sẽ giúp cho kẻ thù nhiều hơn so với việc phát triển phần cứng. Trong hệ mật mã RSA nói riêng, và trong mật mã nói chung, phải hết sức chú ý. Để giải quyết những khó khăn trong việc phân tích thừa số, nhiều nhà nghiên cứu đã tìm ra những phương pháp phân tích thừa số mới. Điều này làm cho việc phân tích thừa số dễ dàng hơn đối với những số có ích thước bất kỳ và không quan tâm đến sự phát triển về phần cứng. Tuy nhiên, vấn đề này vẫn còn nhiều khó khăn. Khi phần cứng ngày càng phát triển mà độ phức tạp của thuật toán không tăng thì việc bảo mật của RSA càng cao vì khoá có kích thước càng lớn.
Thử tính nguyên.
Với nhiều ứng dụng trong mã hoá ta cần tìm các số nguyên tố ngẫu nhiên lớn. Để không tốn thời gian trong việc kiểm tra các số nguyên ngẫu nhiên có kích cỡ thích hợp cho đến khi tìm thấy một số nguyên tố. Hàm phân phối số nguyên tố chỉ định số lượng các số nguyên tố nhỏ hơn hoặc bằng với n.
Phép xấp xỉ n /ln n cho ra các ước lượng chính xác hợp lý của thậm chí với n nhỏ. Cách tiếp can đơn giản cho một bài toán kiểm tra tính nguyên đó là phép chia thử. Ta thử chia n với mỗi số nguyên 2, 3, .. ( các số nguyên chẳn lớn hơn 2 có thể bỏ qua). Ta dễ dàng tìm ra số nguyên tố là n nếu và chỉ nếu không có ước số thử nào chia hết cho n.
Kiểm tra ước số chung lớn nhất.
Trong lúc tính phi hàm ta còn tìm ước số chung lớn nhất của hai số nguyên tố. Ta phải dùng đến thuật toán Euclid để tính ước số chung lớn nhất của hai số nguyên một cách hiệu quả. Ta phải hạn chế số nguyên không âm
gcd( a, b) = gcd(, ) à áp dụng định lý đệ quy GCD.
Hàm tính ước số chung lớn nhất:
int BN_gcd(BIGNUM *r, const BIGNUM *in_a, const BIGNUM *in_b, BN_CTX *ctx)
{
BIGNUM *a, *b, *t;
int ret=0;
bn_check_top(in_a);
bn_check_top(in_b);
BN_CTX_start(ctx);
a = BN_CTX_get(ctx);
b = BN_CTX_get(ctx);
if (a == NULL || b == NULL) goto err;
if (BN_copy(a, in_a) == NULL) goto err;
if (BN_copy(b, in_b) == NULL) goto err;
a->neg = 0;
b->neg = 0;
if (BN_cmp(a, b) < 0) { t=a; a=b; b=t; }
t=euclid(a, b); // gọi thuật toán euclid
if (t == NULL) goto err;
if (BN_copy(r, t) == NULL) goto err;
ret=1;
err:
BN_CTX_end(ctx);
return(ret);
}
Hàm kiểm tra số nguyên tố nhanh nhất:
int BN_is_prime_fasttest(const BIGNUM *a, int checks, void (*callback)(int, int, void *), BN_CTX *ctx_passed, void *cb_arg,
int do_trial_division)
Môđun trong hệ thống
Kích thước của môđun.
Kích thước tốt nhất của một môđun RSA là dựa trên nhu cầu bảo mật của người đó. Môđun lớn, những bảo mật mạnh những cũng vẫn thấp hơn những phép tính của RSA. Trước hết, người ta nên chọn chiều dài một môđun trong khoảng xem xét của nhu cầu cần bảo mật của người đó, chẳng hạn như giá trị của dữ liệu được bảo vệ và chiều dài cần thiết phải bảo vệ, thứ hai, tiềm năng sức mạnh của kẻ tấn công.
Một phép phân tích tốt của bảo mật đã thu được bởi việc lấy chiều dài môđun được đưa ra bởi Rivest, trong phạm vi của môđun lôgarít riêng biệt của một số nguyên tố, nhưng được áp dụng rất tốt trong RSA. Theo đánh giá của Rivest, một môđun 512 bít có thể tính toán đến 8, 2 tỉ $, nhưng ít hơn trong tương lai. Có lẽ vì thế rất thích hợp cho việc sử dụng một môđun dài hơn, có lẽ dài khoảng 768 bít. Những dữ liệu có giá trị vô cùng lớn (hay những xâm phạm lớn từ những giả mạo chữ ký kỹ thuật số). Cần có giấy chủ quyền để sử dụng những môđun có chiều dài lên đến 1000 bít hay lớn hơn nữa, bởi vì giá trị pháp lý của nhiều cặp khóa dựa trên việc bảo mật của khóa trung tâm.
Khóa của một cá nhân sử dụng sẽ hết hạn sau thời gian nào đó, thông thường khoảng hai năm. Khoảng thời gian hết hạn, người sử dụng sẽ phát sinh ra một khoá mới có những số lớn hơn nhất dài hơn khóa cũ để phản hồi cho tốc độ tăng trưởng của máy tính trong hai năm sau đó. Bảng phụ lục chiều dài khóa được đưa ra có lẽ sẽ được công bố bởi cơ quan có thẩm quyền.
Những người sử dụng giữ trong thâm tâm mình thời gian ước đoán để “ bẻ gãy” RSA chỉ ở mức trung bình. Khi kẻ thù cố gắng phân tích thành thừa số, chúng sẽ tấn công vào hằng nghìn môđun RSA và có thể thành công trong một khoảng thời gian hợp lý. Cho dù việc bảo mật của các khoá cá nhân vẫn rất mạnh với những phương thức tính toán luôn có những rủi ro nhỏ mà những kẻ tấn công có thể lấy thành công và tính toán nó rất nhanh chóng.
Về phần những lý do làm chậm lại là do sự tăng trưởng của kích thước khoá, ta ï tăng gấp đôi chiều dài môđun, tăng thời gian yêu cầu cho những phép tính toán khóa công khai ( mã hoá và kiểm tra chữ ký ) lấy thừa số của 4 và việc tăng thời gian của những phép tính toán những khóa bí mật riêng tư ( giải mã và ra hiệu) lấy thừa số của 8. Lý do là những phép tính tóan khoá công khai bị tác động ít hơn những phép tính toán khóa bí mật đó là số mũ chung có thể vẫn được trộng lẫn khi môđun được tăng lên nhưng ngược lại những số mũ riêng biệt tăng theo tỉ lệ. Thời gian phát sinh khóa có thể tăng việc lấy thừa số đến 16 của việc tăng gấp đôi môđun, nhưng đây là một phép tính ít xảy ra có liên quan đến hầu hết người sử dụng.
Giải thuật nhân môđun.
Nhân môđun được thực thi bằng cách sử dụng những thay đổi chuẩn và giải thuật cộng thêm vào được sử dụng trong những phép nhân thông thường. Điều khác cho phép nhân môđun là mỗi lần tính cộng được hình thành, phép cộng đã so sánh với môđun. Nếu phép cộng lớn hơn những môđun thì những môđun được loại trừ từ phép cộng để đưa ra một môđun được làm giảm những phép cộng trung gian. Giải thuật này cho phép phép nhân môđun ngoài việc hình thành của những đềiu kiện trung gian lớn hơn những môđun. Do đó hai số N bít có thể nhân môđun với những môđun N bít bằng chỉ những phần N bít.
Giải thuật mũ hóa môđun trong hệ thống.
Mũ hoá môđun được thực thi bằng việc sử dụng phép nhân môđun hoặc để bình phương giới hạn bình phương (SQT) hay để nhân những giới hạn bình phương bằng cách chạy các tích số (RP). Giải thuật bắt đầu với thông báo trong việc đăng ký SQT và một trong đăng ký RP. Nếu mũ số chẳn thì SQT là môđun được bình phương và được viết vào trong bảng đăng ký SQT. Cũng như thế vì SQT phải bình phương mũ số có thể chia hết cho 2 bằng cách dịch chuyển nó sang phải. Nếu mũ số là số lẻ thì SQT là môđun được nhân bởi RP và được viết trong RP. Sau đó 1 được loại trừ ra khỏi mũ số bằng cách lật 1 của mũ số thành 0. Tiếp tục làm cho đến khi mũ số giảm xuống 1. Rồi SQT kết hợp với RP để cuối cùng ra kết quả.
Ví dụ về giải thuật môđun:
Chúng ta có:
Các vấn đề của RSA
Lý do sử dụng vào RSA trong thực tế.
RSA được nối với một hệ mật mã khoá bí mật, giống như DES, để mã hoá một thông tin bằng phương pháp “Phong bì số RSA”.
Giả sử người thứ nhất muốn gửi một thông tin đã mã hoá cho người thứ hai, đầu tiên người thứ nhất mã hoá thông tin bằng DES, dùng một khoá DES được chọn ngẫu nhiên. Sau đó anh ta lấy khoá công khai của người thứ hai và dùng nó để mã hoá khoá DES. Thông tin được mã hoá bằng DES và khoá DES được mã hoá bằng RSA tạo thành “phong bì số RSA” và được gởi cho người thứ hai. Lúc nhận được phong bì số, người thứ hai giải mã khoá DES bằng khoá riêng của anh ta, sau đó dùng khoá DES để giải mã thông tin của chính nó.
Chiều dài của những thông báo đặc biệt chính là lý do sử dụng RSA.
Chỉ có một số lượng rất nhỏ dữ liệu mở rộng có liên quan đến việc sử dụng RSA. Để mã hoá, một thông báo có vẻ như được đưa vào trong chiều dài, đó là sự phức tạp của chiều dài những khối. Thường là 64 bít, vì RSA thường kết nối với một mã hóa khối khoá mật mãnhư DES. Việc mã cần khóa DES cần có nhiều phép nhân các bít như chiều dài của phép mũ RSA.
Để chứng minh một chữ ký kỹ thuật sốRSA được gắn vào một văn bản. Một chữ ký RSA bao gồm những thông tin như tên của người ký đặc trưng với chiều dài vài trăm byte. Một bản chứng nhận RSA dài khoảng vài trăm byte.
Tốc độ của RSA.
Một “thao tác RSA” dùng cho mã hóa hay giải mã, dùng để ký hay kiểm tra lại về cơ bản là mũ hóa môđun, có thể thực hiện một loạt các phép nhân môđun.
Trong các ứng dụng thực hành, điều nói chung là chọn một số mũ chung nhỏ cho khóa công khai. Trên thực tế, toàn bộ những nhóm những người sử dụng có thể sử dụng cùng chung một số mũ chung. Điều này làm cho việc mã hóa nhanh hơn việc giải mã và kiểm tra nhanh hơn ký. Về thuật toán, những thao tác khóa công khai cần O(k^2) bước, những thao tác khóa bí mật cần O(k^3) bước, và các khóa phát sinh cần O(k^4), với k là số trong trị tuyệt đối, O là những chú thích đề cập đến những phạm vi cao hơn trong tiệm cận thời gian chạy của thuật toán.
Trong phương diện thương mại phần cứng đáp ứng nay đủ RSA. Và thường xuyên thông báo những con chip mới hơn và nhanh hơn. Con chip nhanh nhất của RSA hiện nay đang được sử dụng có thông lượng lớn hơn 600K bít/s với số mũ lên đến 512 bít. Ngụ ý nói rằng nó thực hiện trên 1000 thao tác khóa bí mật RSA/s. Người ta cũng đang cố gắng để tốc độ của RSA đạt đến 1 Mbít/s.
Khi so sánh ta thấy DES nhanh hơn RSA. Trong phần mềm thông thường DES nhanh hơn 100 lần so với RSA. Về phần cứng thì DES nhanh hơn ằnm trong khoảng 1000 đến 10000 lần, chúng phụ thuộc vào quá trình thực hiện. Nhưng chắc rằng khoảng cách này của RSA sẽ bị thu hẹp lại trong những năm sắp đến.
Tính xác nhận dùng trong hệ thống RSA.
Giả sử Alice muốn gửi một thông báo đã được ký rồi đến cho Bob. Cô ta sử dụng một hàm băm trên thông báo để tạo ra một thông điệp có hệ thống, được coi như là một thông điệp đã được “chỉ điểm số“. Sau đó cô ta mã hoá thông điệp có hệ thống này với khóa bí mật RSA, ở đây là một chữ ký số, và được gửi đi cho Bob. Vào thời điểm sau đó Bob nhận được thông điệp và chữ ký, Bob giải mã chữ ký với khoá công khai của Alice để phục hồi lại thông điệp có hệ thống đó. Sau đó anh ta cũng trộn thông điệp đó lại và dùng một hàm băm tương tự của Alice đã sử dụng và so sánh kết quả với thông địep đã được giải mã có hệ thống từ chữ ký. Nếu họ có kết qủa chính xác thì chữ ký đã kiểm tra thành công và anh ta có thể tin chắc rằng thông điệp đó chắc chắn đến từ Alice. Tuy nhiên, nếu họ không đạt được kết quả thì thông neap không biết đến từ nơi nào và nó đã bị thay đổi sau khi đã được ký, và anh ta khôngthể nhận được thông báo đó.
Chú ý rằng với việc xác nhận, vai trò của những khoá công khai và khoá bí mật được nghịch đảo vai trò của chúng trong mã hóa, nơi mà khóa công khai được sử dụng để mã hoá và khóa bí mật dùng để giải mã.
Trong thực tế, mũ số chung được sử dụng nhỏ hơn mũ số riêng, điều này có nghĩa là việc xác nhận chữ ký nhanh hơn ký hiệu. Đó là ước muốn bởi vì một thôngbáo hay một văn bản sẽ chỉ được ký bởi một cá nhân nhưng chữ ký có thể được kiểm tra nhiều lần.
Nó phải không đáp ứn cho bất kỳ ai có thể tìm ra một thông báo mà băm ra các trị số khác hay tìm hai thông báo băm cùng chung một trị số. Nếu đềiu này không thể một kẻ xâm nhập có thể tấn công một thông báo lỗi lên trên chữ ký của Alice. Những hàm băm chẳng hạn như MD4, MD5 được thiết kế một cách đặc biệt để có những thuộc tính có thể tìm ra một sự so khớp không thể xảy ra, và do đó phải có suy nghĩ chính chắn để phù hợp với việc sử dụng trong mã hoá.
Một hay nhiều bằng chứng nhận có thể đi kèm với một chữ ký số. Một bằng chứng nhận là một văn bản được ký hiệu được chứng nhận tính đồng nhất và khoá công khai của một người ký lên một thông báo. Mục đích của nó là ngăn chặn người khác từ một người giả dạng khác sử dụng cặp khoá giả mạo. Nếu bằng chứng nhận được thể hiện thì người nhận (hay người đồng hành) có thể kiểm tra xác nhận khoá công khai.
RSA tìm ra được những văn bản bị lỗi .
Một chữ ký kỹ thuật số RSA cấp tiến hơn so với chữ ký tay, trong trường hợp này nó chứng nhận nội dung của một thông báo cũng như sự thống nhất của người ký. Chừng nào mà một hàm băm bảo mật được sử dụng, thì không có cách nào để lấy chữ ký của người nào đó từ một văn bản của họ và tấn công vào cái khác, hay thay đổi thông báo đã được ký theo cách khác. Một thay đổi sơ sài nhất trong một văn bản được ký sẽ là nguyên nhân quá trình kiểm tra chữ ký kỹ thuật số bị lỗi. Do đó, việc xác nhận của RSA cho phép người sử dụng kiểm tra tính toàn vẹn của văn bản đã được ký. Tất nhiên nếu việc kiểm tra một chữ ký bị lỗi, thì nó có thể khó hiểu có chăng đó không là việc cố gắng giả mạo chữ ký hay một đường truyền đơn giản bị lỗi.
Vấn đề sử dụng RSA hiện nay.
Việc sử dụng RSA đang trải qua một thời gian nhanh chóng và có thể có mặt khắp mọi nơi trong vài năm tới. Hiện nay nó đang được sử dụng đa dạng về mặt sản phẩm, các nền tảng và trong công nghiệp trên khắp thế giới. Nó được tìm thấy trong ngành thương mại sản phẩm phần mềm và có kế hoạch rất nhiều. RSA được xây dựng trên các hệ điều hành hiện tại và trong tương lai bởi Microsoft, Apple, Sun và Novell. Trong phần cứng RSA có thể tìm thấy trong việc bảo mật điện thoại, trên thẻ mạng Ethernet. RSA cũng được sử dụng bên trong nhiều tổ chức chính phủ, bao gồm các chi nhánh của chính phủ Mỹ, những tập đoàn chính yếu, những thư viện quốc tế và các trường đại học.
Phương pháp RSA dường như đang phát triển một cách nhanh chóng trong việc xác nhận (chữ ký số) hơn là riêng tư (mã hoá), bởi lẽ trong phần này sản phẩm cho việc xác nhận chữ ký dễ dàng để xuất khẩu hơn là những sản phẩm có tính riêng tư.
Hình 13: Mô hình phát triển của hệ thống bảo mật hiện nay.
RSA là một phần trong nhiều chuẩn chính thức của thế giới. Theo ISO (International Stan dards Organization: tổ chức các chuẩn quốc tế ) chuẩn 9796 liệt kê RSA như một giải thuật mã hoá tương thích, là “cố vấn chính trị “ trong chuẩn X.509 về điện thoại, điện báo Quốc tế (Consultative Committee in International Telegraphy and Telephony (CCITT)). RSA là một phần của chuẩn hội viễn thông tài chính thế giới (Society for Worldwide Interbank Financial Telecommunications (SWIFT)), chuẩn ETEBAC5 của công nghiệp tài chính Pháp, và là chuẩn cổ phiếu ANSI X9.31 của công nghiệp ngân hàng Mỹ. Chuẩn quản lý khóa của người Úc AS2805.6.5.3 cũng đặc biệt sử dụng RSA.
RSA được tìm thấy cho mục đích chuẩn tăng tính bảo mật của mail (PEM (Privacy Enhanced Mail)) của Internet và chuẩn PKCS của công nghiệp phần mềm. Trong hội thảo của các khuế ước ISO (OSI Implementors' Workshop (OIW)) đã ban hành qui ước cho PKCS và PEM bao gồm RSA. Một số của những chuẩn khác đang được sử dụng hiện nay đã được phát triển và sẽ được phát đi trong vài năm sắp tới; nhiều chuẩn đã được chờ đợi bao gồm RSA như đã được xác nhận hay là một hệ được bảo đảm cho an toàn và cho việc xác nhận tốt.
RSA là một chuẩn phổ biến và tầm quan trọng của chuẩn phổ biến.
Ngày nay, RSA là hệ thống bảo mật sử dụng khóa công khai được sử dụng rộng rãi nhất trên thế giới và thường xuyên được gọi là một hcuẩn phổ biến. Bất chấp những chuẩn chính thức, sự tồn tại của chuẩn phổ biến không chính thức này là vô cùng quan trọng cho việc phát triển quản lý kinh tế kỹ thuật số. Nếu một hệ thống sử dụng khoá công khai được sử dụng ở khắp mọi nơic cho việc xác nhận thì những văn bản ký kỹ thuật số có thể được chuyển đổi giữa người sử dụng trong những quốc gia khác đang sử dụng những phần mềm khác trên những môi trường khác; khả năng làm được có tính quốc tế này cần thiết cho việc quản lý kinh tế kỹ thuật số phát triển. Thiếu xác nhận bảo mật đã trở nên là một cản trở chính trong việc thực hiện lời hứa máy tính có thể thay thế các giấy tờ; các giấy tờ còn cần thiết ở hầu hết mọi nơi cho các hợp đồng, séc, thư từ quan trọng, những văn bản hợp pháp và giấy chứng minh.
Với cốt lõi cần thiết của những chuyển đổi các loại chứng từ, nó không được khả thi để đưa ra những cái hoàn chỉnh nhất của một tổ chức mà dực trên chuyển đổi điện tử. Chữ ký kỹ thuật số là một công cụ cần thiết chính xác để chuyển đổi hầu hết các chứng từ cần thiết dựa trên những văn bản đến những hình ảnh điện tử kỹ thuật số. Chẳng hạn như chữ ký kỹ thuật số làm cho nó hợp lý, để có thể di chuyển, những di chúc, hộ chiếu, học bạ phổ thông cao đẳng, séc và những mẫu đăng ký cử tri mà chỉ tồn tại trong mẫu điện tử; một vài bản mẫu chứng từ có thể “sao chép” từ những bản điện tử nguyên thuỷ. Tất cả những điều trên cho phép sự thừa nhận chuẩn của chữ ký kỹ thuật số.
Ứng dụng của RSA trong thời đại ngày nay.
Bảo mật trong giao dịch điện tử.
Cuộc cách mạng của công nghệ thông tin và sự phát triển của Internet đã thay đổi cơ cấu quản lý của chúng ta tù việc xây dựng từng viên gạch thông thường và tô vữa cho đến thông tin và kiến thức được dựa trên cơ cấu tổ chức. Để c1o những cơ hội khổng lồ của thời đại công nghệ thông tin này, những ứng dụng internet, những giao dịch mua bán điện tử sẽ phải được tiến hành một cách chắc chắn để bảo vệ sở thích của những người sử dụng, những nhà kinh doanh và những ngân hàng. Thẻ SIM thế hệ mới được phát triển dựa trên nền tảng của thẻ thông minh chung. Thông qua kỹ thuật RSA, nó có thể phát sinh ra cặp khoá công khai và khoá bí mật có khả năng tiến hành kiểm tra chữ ký, mã hóa và giải mã dựa trên giải thuật RSA. Với những chức năng đó cho phép điện thoại di động có thể phục vụ như những thiết bị cuối mua bán giao dịch điện tử di động.
Hình 14: Cách sử dụng RSA hiện nay.
Hình 15: Bảo mật thông qua tổ chức www.rsasecurity.com
Ví dụ ứng dụng thẻ TimeCOS/PK là thẻ có thể ký và kiểm tra trong thời gian ngắn.
Hình 16: Sử dụng thẻ để đăng ký và kiểm tra.
Một ví dụ về thế giới thực – bảo mật những socket máy khách.
Một trong những cái chung nhất của việc sửng dụng kỹ thuật khóa công khai là trong giao thức bảo mật những lớp socket, được sử dụng bởi trình duyệt Netscape và các trình duyệt khác để bảo mật đường truyền trên internet. Socket được bảo mật cho phép người sử dụng – điển hình như một việc cá nhân từ một máy tính cá nhân tại nhà (gọi là máy khách) – để truyền đến một chổ trang web máy tính (gọi là máy chủ). Máy máy chủ này có thể được điều khiển bởi nhà quản lý và những người sử dụng dường như mong muốn máy tính máy khách gởi đến một số của thẻ tính dụng đến máy chủ để đặt hàng hóa. Giao thức bảo mật socket sử dụng kỹ thuật khóa chung để mã hóa số của thẻ tín dụng để con số đó không thể gửi như một hình thức có thể hiểu được của một văn bản được mã hóa trên internet. Máy khách có thể thực hiện tất cả các mã mã hóa RSA và có thể kiểm tra được các bước vi phạm chuẩn RSA.
Trong hình thức đơn giản, giao thức bảo mật socket sử dụng phương pháp RSA làm việc như sau: Sau khi một máy khách tạo ra một ngữ cảnh với một website máy chủ, và các phiên bảo mật được thiết lập, máy chủ phát đi một thông báo cho máy khách bao gồm: (1) khóa công khai của máy chủ; (2) một chữ ký số từ nơi chứng nhận bản quyền chứng nhận khóa công khai máy chủ yêu cầu như nó sở hữu, trong trường hợp này nó sở hữu. Tiếp theo máy khách kiểm tra khóa công khai của máy chủ sử dụng khoá công khai của nơi đăng ký mà nó được cài đặt với một phần mềm trình duyệt trên máy tính máy khách.
Trong cách này máy khách có thể đảm bảo rằng máy chủ cho phép việc này. Lúc này máy khách sẵn sàng gửi thông tin bí mật (chẳng hạn như số của thẻ tín dụng) đến máy chủ.
Máy khách có thể mã hóa số của thẻ tín dụng nhưng không sử dụng kỹ thuật RSA hay những kỹ thuật khóa công khai khác để trên thực tế mã hóa dữ liệu. RSA mã hoá chậm hơn những phương thức mã hoá thông thường đó là việc sử dụng khóa giống nhau để mã hóa và giải mã. Trong khi dường như nó không là gì cả nếu tất cả những cái đó đã bị mã hóa là số của thẻ tín dụng trong phần thực hiện một phiên bảo mật với một trình duyệt web bao gồm việc truyền đi hàng ngàn byte thông tin. Để ngăn chặn những khó khăn bị đình trệ lâu, máy khách phát sinh ra một con số ngẫu nhiên để sử dụng thông thường, khóa đối xứng để mã hóa tất cả dữ liệu được gửi suốt quá trình bảo mật các phiên. Máy khách mã hoá khóa này đang sử dụng khóa công khai RSA của máy chủ được truyền đi trong khi đang mở thông điệp từ máy chủ. Máy chủ nhận khoá bị mã hoá này và giải mã nếu sử dụng khoá bảo mật. Cả máy khách và máy chủ đang sở hữu khoá được chia sẻ và đối xứng với cả việc sử dụng để mã hoá và giải mã tất cả những dữ liệu tiếp theo bị gửi trong lúc bảo mật phiên.
Trong giao thức này máy khách không chỉ có hai bước khóa công khai và nó không thực thi những bước khoá thông dụng khác.
Ta có thể tóm tắt ứng dụng của giải thuật RSA như sau: gồm 3 phần:
Phát sinh khóa.
Mã hoá
Giải mã.
Giải thuật này được ứng dụng trong thư điện tử, chuyển đổi tiền điện tử, trao đổi dữ liệu điện tử, phân bổ phần mềm, lưu trữ dữ liệu.
Lợi thế của RSA so với DES.
RSA không phải là một sự thay đổi hay thay thế cho DES mà ở đây RSA nhằm bổ sung cho DES ( hay cho những hệ thống mã hóa mật mã với tải lượng nhanh hơn ) và được sử dụng chung với DES trong một môi trường truyền thông tin an toàn.
RSA cho phép hai chức năng quan trọng là không cung cấp bởi DES: bảo mật sự trao đổi khóa ngoài những thay đổi khóa trước đó và chữ ký số. Để mã hóa thông báo, RSA và DES thường được sử dụng kết hợp như sau: số nguyên tố thông báo được mã hóa với một khóa DES ngẫu nhiên nào đó và rồi trước khi gửi đi trên một kênh truyền thông không an toàn, khóa DES được mã hóa tiếp bằng RSA. Đồng thời cả thông báo được mã hóa bằng DES và khóa DES cũng được mã hóa bằng RSA cùng được gửi. Giao thức này được hiểu như là một bao số RSA.
Trong một vài trường hợp RSA không cần thiết và một mình DES thì thích hợp hơn. Đấy là trong những môi trường nhiều người sử dụng cùng một lúc đồng ý sử dụng khóa DES, chẳng hạn như trong cuộc gặp mang tính chất cá nhân. Cũng như thế RSA không thích hợp trong môi trường làm việc độc lập của một người sử dụng. Ví dụ nếu bạn muốn giữ những tập tin đã mã hóa mang tính cá nhân của bạn, bạn phải sử dụng DES. Mật khẩu của bạn phải là khóa DES. RSA hay những hệ thống bảo mã hóa dùng khóa công khai nói chung thích hợp nhất trong môi trường nhiều người sở dụng cùng một lúc. Cũng như thế, một vài hệ thống chữ ký kỹ thuật số đều mong muốn sử dụng RSA hay những hệ thống mã hóa khóa công khai khác.
CHƯƠNG III: THỰC NGHIỆM
Giao diện chính của chương trình:
Giao diện mã hoá dữ liệu 64 bít:
Mã hóa một chuỗi:
Màn hình thực hiện:
Màn hình kết quả thực hiện mã hóa một chuỗi “đã gửi tiền”:
Mã hóa một tập tin:
Mã hóa một tập tin:
Màn hình giải mã một tập tin:
Màn hình mã hóa một tập tin phát sinh khóa là 512 bít.
Thời gian phát sinh khoá công khai và khoá bí mật là:
Với số nguyên tố có kích thước là 256 bít: 11 giây.
Với số nguyên tố có kích thước là 512 bít: 13 giây.
Với số nguyên tố có kích thước là 256 bít: 15 giây.
Kích thước của khóa công khai là:
Với số nguyên tố là 256 bít: 166 bytes
Với số nguyên tố là 512 bít: 252 bytes
Với số nguyên tố là 1024 bít: 430 bytes.
Kích thước của khóa bí mật là:
Với số nguyên tố là 256 bít: 306 bytes
Với số nguyên tố là 512 bít: 530 bytes
Với số nguyên tố là 1024 bít: 966 bytes.
CHƯƠNG IV: KẾT LUẬN
Kết luận về RSA
Hệ mã hoá mật mã RSA có tính bảo mật cao và được ứng dụng rộng rãi trong thực tiễn như bảo mật trong trao đổi dữ liệu điện tử, thương mại điện tử, chuyển đổi tiền tệ, phân bổ phần mềm, Nhưng về tốc độ, giải thuật RSA chậm hơn rất nhiều so với giải thuật DES
Hướng phát triển:
Có thể cài đặt chương trình mã hoá dùng giải thuật RSA vào các ứng dụng khác như email, chat, winword, Nếu có thêm thời gian và tiền bạc thì chương trình này sẽ hoàn thiện hơn.
PHỤ LỤC
Tài liệu tham khảo:
FREQUENTLY ASKED QUESTIONS ( About Today's Cryptography) Paul Fahn _ RSA Laboratories (100 Marine Parkway - Redwood City, CA 94065)
Thuật toán ( Nhà xuất bản thống kê)
Applied cryptography, second edition (John Wiley & Sons.Inc)
Network security essentials ( Apppication and standards – William Stallings)
Attacks on RSA ( Ward A. Wurtz)
Paj's Home Cryptography RSA Mathematics
RSA Algorithm - MCA(6) (By Kartik Shah - LAY NETWORKS)
People Making Information Technology Work Securely (J. G. Van Dyke & Associates, Inc.)
R.L Rivset, A. Shamir, L. Adleman. A method for obtaining digital signatures and public key crytosystems; Communications of the ACM, vol. 21 ( 1978).
M. Pohst, H. Zassenhaus Algorithmic Algebraic Number Theory. Cambridge Univ. Press, 1989.
H.W Lenstra, M. Pohst. Computational Number Theory. Brikhauser, 1992.
http:// www.openssl.org