Mã hóa công khai được sử dụng để bảo vệ dữ liệu số thông qua kênh không an toàn từ nơi này đến nơi khác.. Thuật toán RSA được sử dụng rộng rãi trong các ứng dụng của cơ sở hạ tầng khóa c
Trang 1A FAST IMPLEMENTATION OF THE RSA ALGORITHM USING THE GNU
MP LIBRARY
Rajorshi Biswas, Shibdas Bandyopadhyay, Anirban Banerjee
Indian Institute of Information Technology, Calcutta
//thực thi nhanh thuật toán RSA sử dụng thư viện GNU MP
ABSTRACT
Organizations in both public and private sectors have become increasingly
dependent on electronic data processing Protecting these important data is of utmost concern to the organizations and cryptography is one of the primary ways
to do the job Public Key Cryptography is used to protect digital data going
through an insecure channel from one place to another RSA algorithm is
extensively used in the popular implementations of Public Key Infrastructures In this paper, we have done an efficient implementation of RSA algorithm using gmp library from GNU We have also analyzed the changes in the performance of the algorithm by changing the number of characters we are encoding together (we termed this procedure as bitwise incremental RSA)
// tính trừng tượng
Các tổ chức trong các lĩnh vực công khai hay bí mật đều phụ thuộc vào quá trình
xử lý dữ liệu số Việc bảo vệ dữ liệu quan trọng là mục tiêu tối cao của các tổ chức
và mã hóa là một trong những cách làm chủ yếu cho công việc này Mã hóa công khai được sử dụng để bảo vệ dữ liệu số thông qua kênh không an toàn từ nơi này đến nơi khác Thuật toán RSA được sử dụng rộng rãi trong các ứng dụng của cơ sở
hạ tầng khóa công khai Trong tài liệu này, đã làm một ứng dụng của thuật toán RSA sử dụng thư viện GMP từ GNU Cũng đã phân tích sự thay đổi trong hiệu suất của thuật toán bằng cách chuyển đổi số của các ký tự mà ta mã hóa
KEYWORDS
Cryptography,RSA,PKI,GMP
1 INTRODUCTION
Trang 2Data communication is an important aspect of our living So, protection of data from misuse is essential A cryptosystem defines a pair of data transformations called encryption and decryption Encryption is applied to the plain text i.e the data to be communicated to produce cipher text i.e encrypted data using
encryption key Decryption uses the decryption key to convert cipher text to plain text i.e the original data Now, if the encryption key and the decryption key is the same or one can be derived from the other then it is said to be symmetric
cryptography This type of cryptosystem can be easily broken if the key used to encrypt or decrypt can be found To improve the protection mechanism Public Key Cryptosystem was introduced in 1976 by Whitfield Diffe and Martin Hellman of Stanford University It uses a pair of related keys one for encryption and other for decryption One key, which is called the private key, is kept secret and other one known as public key is disclosed
//Giới thiệu
Trao đổi dữ liệu là một khía cạch quan trọng trong cuộc sống của chúng ta Vì vậy, bảo vệ dữ liệu khỏi những hacker là vô cùng cần thiết Hệ thống mã hóa làm hai việc biết đổi dữ liệu đó là mã hóa và giải mã Đối với mã hóa đối xứng khóa giải
và khóa mã là giống nhau Kiểu mã hóa này có thể dễ dàng bị phá vỡ nếu khóa sử dụng mã và giải được tìm ra Để nâng cao cơ chế bảo vệ, mã hóa công khai được giới thiệu năm 1976 bởi Whitfield Diffe và Martin Hellman của đại học Stanford
Nó được sử dụng với hai khóa, một để mã hóa và khóa còn lại để giải mã Một khóa gọi là khóa bí mật được giữ bí mật và một gọi là khóa công khai được công bố
The message is encrypted with public key and can only be decrypted by using the private key So, the encrypted message cannot be decrypted by anyone who knows the public key and thus secure communication is possible RSA (named after its authors - Rivest, Shamir and Adleman) is the most popular public key algorithm
// Bản tin được mã hóa với khóa công khai và chỉ có thể giải mã bằng khóa bí mật
Vì vậy bản tin mã hóa không thể giải mã bởi bất kỳ ai biết khóa công khai và thông tin được bảo vệ RSA là thuật toán khóa công khai rất phổ biến
In relies on the factorization problem of mathematics that indicates that given a very large number it is quite impossible in today's aspect to find two prime
Trang 3numbers whose product is the given number As we increase the number the
possibility for factoring the number decreases So, we need very large numbers for
a good Public Key Cryptosystem GNU has an excellent library called GMP that can handle numbers of arbitrary precision We have used this library to implement RSA algorithm As we have shown in this paper, number of bits encrypted together using a public key has significant impact on the decryption time and the strength of the cryptosystem
Độ khó của thuật toán là vấn đề phân tích ra thừa số, chỉ ra rằng cho một số rất lớn
và không thể phân tích ra được hai số nguyên tố Ta tăng số đã cho lên để khả năng phân tích ra hai thừa số giảm đi Vì vậy, ta cần các số rất lớn cho hệ thống mã hóa công khai tốt GNU có một thư viện tuyệt vời gọi là GMP mà có thể xử lý các số chính xác tùy ý Trong tài liệu này có sử dụng thư viện GMP để thực hiện thuật toán RSA Số bít mã hóa sử dụng khóa công khai có tác động đáng kể đến thời gian mã hóa và độ mạnh của hệ thống mã hóa
2 REVIEW OF EXISTING LITERATURE
Authentication protocols and their implications are discussed in [1] Computing inverse of a shared secret modulus, which involves mathematical formulation of RSA, is discussed in [2] Application of hash function in the field of cryptography
is discussed in [3] The strength of RSA algorithm is discussed in [4] A survey of fast exponentiation method is done in [5] Cryptosystem for sensor networks is studied in [6] Security proofs for various digital signature scheme is studied in [7] Multiparty authentication services and key agreement protocols are discussed in [8] Various fast RSA implementations are described in [9] An efficient
implementation of RSA is discussed in [10] The basic RSA algorithms and other cryptography related issues are discussed in [11]
3 SCOPE OF PRESENT WORK
Our work in this paper is focused primarily on the implementation of RSA For efficient implementation we have used the GMP library, we have explored the behaviour and feasibility of the algorithm with the change of various input
Trang 4parameters, and finally a user interface is developed to provide an application of our analysis
Phạm vi của công việc
Việc thực thi ứng dụng trong tài liệu này tập trung chủ yếu vào ứng dụng của thuật toán RSA Để ứng dụng đạt hiệu quả cao, có sử dụng thư viện GMP và đã nghiên cứu tính khả thi và các thực hiện thuật toán với sự thay đổi khác nhau của thông số đầu vào, và cuối cùng giao diện người sử dụng được phát triển để cung cấp một ứng dụng dựa vào các phân tích đưa ra
5 OUR IMPLEMENTATION OF THE RSA ALGORITHM
Chương trình ứng dụng thuật toán RSA
5.1 Introduction
We have implemented the RSA cryptosystem in two forms : a console mode
implementation, as well as a user friendly GUI implementation We focus on the console mode implementation here, and leave the GUI implementation for a later section of this report The console application uses a 1024 bit modulus RSA
implementation, which is adequate for non-critical applications By a simple
modification of the source code, higher bit-strengths may be easily achieved, albeit with a slight performance hit
Giới thiệu
Tôi đã thực hiện hệ thống mã hóa RSA ở dạng chương trình chế độ điều khiển Ứng dụng bảng điều khiển sử dụng 1024 bít Bằng cách chỉnh sửa đơn giản mã nguồn, có thể nâng cao số bít lên nhưng hiệu suất sẽ thâp đi
5.2 Handling large integers and the GMP library
Any practical implementation of the RSA cryptosystem would involve working with large integers (in our case, of 1024 bits or more in size) One way of dealing with this requirement would be to write our own library that handles all the
required functions While this would indeed make our application independent of any other third-party library, we refrained from doing so due to mainly two
considerations First, the speed of our implementation would not match the speed
Trang 5of the libraries available for such purposes Second, it would probably be not as secure as some available open-source libraries are
Xử lý các số nguyên lớn và thư viện GMP
Chương trình ứng dụng hệ thống mã hóa RSA sẽ làm việc với số nguyên lớn(1024 bít hoặc lớn hơn) Một cách cách là tự viết một thư viện xử lý được tất cả các chức năng được yêu cầu Trong khi thực sự là chương trình ứng dụng này độc lập với thư viện bên thứ ba khác, tốc độ của chương trình sẽ không bằng tốc độ của thư viện, tiếp nữa là không bảo mật như các thư viện mã nguồn mở
There were several libraries to consider for our application We narrowed the choice to three libraries: the BigInteger library (Java), the GNU MP Arbitrary Precision library (C/C++), and the OpenSSL crypto library (C/C++) Of these, the GMP library (i.e the GNU MP library) seemed to suit our needs the most
Hiện tại có vài thư viện được xem xét sử dụng Có ba thư viện được chọn: thư viện BigInteger(Java), thư viện GNU MP(C/C++), và thư viện Open SSL cryto (C/C+ +) Trong số đó, thư viện GMP dường như thích hợp cho việc thực hiện ứng dụng này nhất
The GMP library aims to provide the fastest possible arithmetic for applications that need a higher precision than the ones directly supported under C/C++ by using highly optimized assembly code Further the GMP library is a cross-platform library, implying that our application should work across platforms with minimal modifications, provided it is linked with the GMP library for the appropriate
platform We have used the facilities offered by the GMP library heavily
throughout our application The key generation, encryption and decryption routines all use the integer handling functions offered by this library
Thư viện GMP có mục đích cung cấp thuật toán nhanh nhất cho các ứng dụng cần
sự chính xác cao hơn các thư viện cùng hỗ trợ C/C++ bằng cách sử dụng mã hợp ngữ được tối ưu hóa cao Hơn thế nữa, thư viện GMP là thư viện đa nền tảng, ứng dụng được viết này sẽ làm việc ở nhiều nền với các sự điều chỉnh ít nhất, nó được liên kết với thư viện GMP với nền tảng thích hợp tôi đã sử dụng những điều kiện
dễ dàng mà thư viện GMP cung cấp để tích hợp vào ứng dụng Việc tạo khóa, mã hoa, giải mã đều được xử lý bởi các hàm được cung cấp bởi thư viện GMP
Trang 65.3 Application Overview
In this subsection, we present the basic structure of the console mode RSA
implementation The program is meant for use on a per user basis where each user's home directory stores files containing the private and public keys for the particular user The application stores the private and public keys for a user in the files $HOME/.rsaprivate and $HOME/.rsapublic respectively
Tổng quan ứng dụng
Trong tiểu đề này, tôi sẽ trình bày cấu trúc đơn giản của chương trình RSA chế độ dòng lệnh Mỗi người dùng sẽ có một tập tin lưu trữ khóa công khai và khóa bị mật cho từng người dùng đó Ứng dụng lưu trữ khóa công khai và khóa bí mật cho một người dùng ở trong trập tin $HOME/.rsa cho khóa bí mật và $HOME/.rsa cho khóa công khai
At the very beginning the program searches for the existence of the
aforementioned files and reads in the values of the private and public keys If they are not present (as when the application is run for the first time), the program proceeds to generate the keys and writes them to the files
Mỗi khi chướng trình bắt đầu nó sẽ tìm các tập tin đã nêu trên xem có tồn tại không
và đọc các giá trị khóa bí mật và khóa công khai Nếu chúng không có nội dung (khi ứng dụng chạy lần đầu), chương trình sẽ tạo các khóa và viết chúng vào các tập tin
Following this, the user is presented with a menu, asking him whether he would like to encrypt a file, decrypt an encrypted file, or quit the application If the user chooses to encrypt a file, he is asked to enter the path to the file containing the recipient's public keys as well as the number of characters to encrypt at a time (this
is justified later) If decryption is chosen, the path to the encrypted file is requested and the program subsequently decrypts the file to the standard output
Chương trình sẽ hỏi người sử dụng liệu có muốn mã hóa file hay giải mã một file
đã mã hóa hoặc là thoát khỏi chương trình Nếu người sử dụng chọn mã hóa file, thì người dùng sẽ được hỏi đưa đường dẫn đến file có chưa khóa công khai của người nhận Nếu giải mã được chọn, cái thành phần đường dẫn để mã hóa file được yêu cầu và chương trình giải mã file đó đến một đầu ra chuẩn
Trang 75.4 RSA key generation
The generation of the RSA keys is of paramount importance to the whole
application The application maintains a constant named 'BITSTRENGTH' which
is the size of the RSA modulus (n) in bits According to this setting, two character arrays to contain the digits of the primes p and q are declared A simple loop
through all the digits of this array initializes the array with a random string of bits
We have used C's inbuilt random number generation routines to generate the bits of the string The random generator is seeded using the srand() routine by the return value of the function time(), which returns the time since the epoch (00:00:00 UTC, January 1, 1970), measured in seconds Key generation at the same return value of time() is avoided by sleep(), which delays the execution by one second, thus ensuring that the random numbers are never repeated
srand giống như rand là hàm dùng để tạo số ngẫu nhiên nhưng srand sau mỗi lần khởi động cho các kết quả không trùng nhau.
srand là hàm thiết lập 1 hạt seed -"start point" nghĩa là lấy seed làm cơ sở để random number.Nếu cùng seed thì sẽ random giống nhau.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main ()
{
int a , ;
srand ( ); //dat seed cho a;
a rand ()% 5
printf ("%d\nPress to continue\n", );
getch ();
srand ( ); //dat lai seed cho b;
b rand ()% 5
printf ("%d:%d\n", , ); //ket qua giong nhau
}
Tạo khóa RSA
Việc tạo các khóa RSA là tối quan trọng trong ứng dụng này Ứng dụng này duy trì một hằng số tên là ‘BITSTRENGTH’ Theo như cài đặt, hai mảng ký tự chứa các con số của số nguyên tố p và q đã được tìm ra Một vòng lặp xuyên suốt các chữ số của mảng này khởi tạo mảng với một chuỗi bit ngẫu nhiên Tôi có sử dụng hàm tạo
số ngẫu nhiên để tạo các bít của chuỗi này Máy tạo số ngẫu nhiên được sử dụng hàm srand() bằng cách nhận giá tri hàm time(), hàm này trả lại thời gian kể từ khi bắt đầu và được đo bằng giây Việc tạo khóa trả lại giá trị của time() được tránh
Trang 8bởi hàm sleep(), đây là độ trễ thực hiện được tính bằng giây, do đó để đảm bảo rằng các số ngẫu nhiên không bao giờ lặp lại
At the end of this process, we have strings containing binary representations of the numbers p and q, but they are not prime yet To achieve that, two gmp integers are first initialized with the contents of these strings Then, the function
mpz_nextprime() is called, which changes p and q to the next possible primes This function uses a probabilistic algorithm to identify primes According to the gmp manual, it is adequate for practical purposes and the chance of a composite passing
is extremely small
Ở cuối quá trình xử lý này, tôi có các chuỗi bao gồm các số nhị phân của các số p
và q, nhưng chúng không phải là số nguyên tố Để đạt được điều này, hai số
nguyên gmp được tạo với nội dung của các chuỗi này Sau đó, hàm
mpz_nextprime() được gọi, nó thay đổi p và q thành các số nguyên tố tiếp theo Hàm này sử dụng thuật toán xác suất để xác định các số nguyên tố
Now that we have the two 512-bit primes p and q, calculating the values of n (=pq) and x (=(p- 1)*(q-1)) is a simple matter of invoking mpz_mul() with the proper arguments Next, to determine the value of 'e', we started with a value of 65537, and incremented it by two each time until the condition gcd(e,x) = 1 is satisfied (which, incidentally, is almost always satisfied by the number 65537 itself)
Bây giờ chúng ta đã có hai số p và q là số nguyên tố kích cỡ khoảng 512 bit, tính giá trị của n (=pq) và x (=(p-1)*(q-1)) là các thông số của hàm mpz_mul() Tiếp theo, để xác định giá trị của e, ta bắt đầu với giá trị 65537, và tăng nó lên cho đên khí gcd(e,x)=1 được thỏa mãn
Now there exists a procedure in the gmp library with the prototype int
mpz_invert(mpz_t ROP, mpz_t OP1, mpz_t OP2) which computes the
multiplicative inverse of OP1 modulo OP2 and puts the result in ROP Using this function helps us avoid writing our own routine based on the Extended Euclidean Algorithm (as this function executes extremely fast) In this way, we obtain the value of d, which completes our quest for the RSA keys Finally the keys (d,e,n) are stored in two files rsapublic and rsaprivate, both in the user's home directory
Trang 9Giờ đã có sự tồn tại của thủ tục trong thư viện gmp với hàm “int mpz_invert(mpz_t ROP, mpz_t OP1, mpz_t OP2)”, hàm này tích nhân nghịch đảo của OP1 mô đun OP2 và đưa kết quả vào ROP Sử dụng hàm này giúp chúng ta tránh được việc viết các hàm dựa trên thuật toán Euclidean mở rộng (giống như hàm thực hiện cực nhanh) Theo cách này, chúng ta thu được giá trị của d, vậy là đã hoàn thành yêu cầu cho các khóa RSA Cuối cùng khóa (d,e,n) được lưu trữ vào hai tập tin
.rsapublic và rsapricate, cả hai đều có đường dẫn đến nơi lưu trữ cho người dùng
It is to be noted that the entire application can use a higher (or lower) bitstrength of the RSA modulus n by simply changing the constant BITSTRENGTH at the very beginning of the source-code
Chú ý rằng toàn bộ ứng dụng có thể sử dụng độ mạnh cao hơn của mô đun n RSA bằng cách thay đổi hằng số BITSTRENGTH ở đoạn đầu mã nguồn
5.5 RSA encryption
As the application is executed, the existence of the key files are checked and if they do not exist, the RSA keys are generated Following this, the user is presented with a menu, which enables him to choose to encrypt, decrypt or quit
Khi chương trình ứng dụng thực thi, nó sẽ kiểm tra các tệp tin khóa có tồn tại không nếu không, các khóa RSA sẽ được tạo Người dùng sẽ được được phép chọn
mã hóa, giải mã hoặc thoát
First, the path to the file containing the public key of the recipient is requested from the user However the user is also given the option of using his own public keys (in which case, only he can decrypt the message) Using the values of e and n read from the relevant file containing the public keys, the message is encrypted
Đầu tiên, đường dẫn đến tập tin chưa khóa công khai của người nhận được yêu cầu
từ người sử dụng Tuy nhiên người sử dụng cũng được tùy chọn sử dụng các khóa công khai của mình(chỉ người đó mới có thể giải mã được bản tin Sử dụng các giá trị của e và n đọc từ tệp tin có khóa công khai, bản tin được giải mã
A critical requirement for the proper functioning of the RSA algorithm is that the message m must be represented as an integer in the range [0,n-1] (where n is, as usual, the RSA modulus) Our application converts text messages to integers by
Trang 10using a simple mapping of every character to its ASCII code But encrypting only one character at a time is not only expensive in terms of the time required to
encrypt and decrypt, but also in terms of security
Yêu cầu cuối cùng trong thuật toán RSA là bản tin m phải được biểu diễn bởi một
số nguyên trong giải [0, n-1] Ứng dụng chuyển bản tin rõ thành các số nguyên bằng cách so sánh trong bản mã ASCII Nhưng mã hóa chỉ một ký tự một thời điểm không giảm về thời gian mã hóa và giải mã mà còn về sự bảo mật
This is because the encrypted integers would then only be from a small finite set (containing a maximum of as many integers as the number of ASCII characters) Hence, we ask the user the number of characters to encrypt at a time For an RSA encryption scheme with the modulus size of 1024 bits, we have seen that about 100 characters can be encrypted at once Lesser number of characters cause encryption and (especially) decryption to take significantly longer, whereas higher number of characters often violate the condition that the message m must lie in the interval [0,n-1]
Có điều này bởi vì các số nguyên được mã hóa sẽ chỉ là từ một tập hợp hữu hạn nhỏ(có chứa tối đa số lượng số nguyên bằng bới số lượng trong bảng mã ASCII) Người dùng sẽ được hỏi số lượng các ký tự mã hóa cùng một lúc Lược đồ mã hóa RSA với mô đun lô cỡ 1024, có nghĩa là khoảng 100 ký tự có thể được mã hóa cùng một lúc
The entire file to encrypt is processed as a group of strings each containing the specified number of characters (except possibly the last such string) Each
character in such a string is converted to its 3- character wide ASCII code, and the entire resulting numeric string is our message m Encrypting it is achieved by computing m ^ e mod n There is a gmp routine specifically for such a computation having the prototype void mpz_powm (mpz_t ROP, mpz_t BASE, mpz_t EXP, mpz_t MOD) which sets ROP to (BASE raised to EXP) modulo MOD Thus invoking moz_powm(c,m,e,n) stores the encrypted partial message in the integer c This is written each time to the file to encrypt to until the whole message has been processed This completes the encryption process
Toàn bộ tệp tin để mã hóa được xử lý như một nhóm các cuỗi mà mỗi nhóm bao gồm số lượng cụ thể các ký tự Mỗi ký tự trong chuỗi được chuyển thành 3 ký tự