Số nguyên tố và phân tích thành thừa số: 1.Phát sinh số nguyên tố:

Một phần của tài liệu Giải thuật mã hóa mật mã RSA (Trang 49 - 53)

7.1. 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;}

}

7.2. 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.

7.3. Ý 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ó.

7.4. 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.

7.5. 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ố π(n) chỉ định số lượng các số nguyên tố nhỏ hơn hoặc bằng với n. 1 ln / ) ( lim = ∞ → n n n 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 π(n)

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, …..[ ]n (adsbygoogle = window.adsbygoogle || []).push({});

( 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.

7.6. 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( a, b )  á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ột phần của tài liệu Giải thuật mã hóa mật mã RSA (Trang 49 - 53)