A Design For An Fpga Implementation of Rijndael

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

A DESIGN FOR AN FPGA IMPLEMENTATION OF RIJNDAEL


CIPHER

M.B. Abdelhalim*, H. K. Aslan**, A. Mahmoud** and H. Farouk**


* Arab Academy of Science and Technology and Maritime Transport, Cairo, Egypt,
** Electronics Research Institute, Cairo, Egypt.
m_bakr@aucegypt.edu, hebaaslan@yahoo.com, tobal51000@yahoo.com, heshamali68@hotmail.com

Abstract encryptor core should prove beneficial in applications


Our aim is to simulate the Rijndael cipher using Field where speed is important as with real-time
Programmable Gate Array (FPGA) to achieve low communications such as SONET OC-48 networks and
cost, ease of implementation, availability “FPGAs satellite communications.
can be bought off the shelf“, high flexibility including The National Security Agency (NSA) evaluation plan
capability of frequent modifications of hardware, and targets only implementations using semi-custom
low cost of the final product. We propose a modified Application Specific Integrated Circuits (ASICs)
implementation of Rijndael, the Advanced providing no data regarding other technologies. FPGA
Encryption Standard (AES) based on the fact that any devices are assumed better alternative for such
FPGA includes built in memory block where we store implementations for many reasons as FPGA devices
all the results of the fixed operations. The have the following advantages over the ASICs:
modification gives an 11% reduction in area and 25% 1- Shorter design cycle leading to fully
increase in speed (throughput) compared with the functioning device prototypes.
original design. Our design gives the highest 2- Lower cost of the computer aided tools,
throughput and area utilization over all the Iterative verification and testing.
Looping (IL) based FPGA implementations. In the 3- Potential for fast, low cost multiple
original design, the decryption algorithm was not reprogramming and experimental
implemented. Our implementation of the decryption testing of a large number of various
algorithm gives better results than the other IL based architectures and revised versions of
FPGA implementations. the same architecture.

Keyword: Rijndael cipher, FPGA, memory block, A team from the University of California, Los
encryption, decryption. Angeles demonstrated in [3] an implementation of the
Rijndael cipher on Xilinx Virtex II XC2V1000-4
1. Introduction device using experimental frequency of 75 MHz,
For a long period of time, the Data Encryption throughput 739 Mbit/s for 128 bits.
Standard (DES) was considered a standard for the Máire McLoone, John V and McCanny described in
symmetric key encryption. DES has a key length of [4] their FPGA implementation, which employed
56 bits. For the time being, this key length is fully pipelined single-chip Rijndael design and runs at
considered small and can easily be broken. For this a data rate of 7 Gbits/sec on a Xilinx Virtex-E
reason, the National Institute of Standards and XCV812E-8-BG560 FPGA device. The decryptor
Technology (NIST) announced as a result of design also achieves a fast throughout of 6.4
computation among 15 algorithms that the Rijndael Gbits/sec.
cipher will replace the DES cipher and will become a Viktor Fischer and Milos Drutarovsk in [5] have
new AES. The Rijndael cipher has three possible implemented Rijndael cipher using 128-bit keys
block and key lengths: 128, 192, or 256 bits. implemented in Altera ACEX reconfigurable
Therefore, the problem of breaking the key becomes hardware, which has been found to be an excellent
more difficult [1-2]. solution for cost-sensitive encryption applications.
In general, hardware implementations of encryption Kenneth Stevens and Otmane Ait Mohamed have
algorithms and their associated key schedules are demonstrated in [6] a single-chip FPGA design of the
physically secure, as they cannot easily be modified Rijndael encryption algorithm. The design employed
by an outside attacker. Also, the high speed Rijndael two 32-bit DSP cores to reduce the latency issues

9
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

while a block cipher was implemented using the and key addition. On the other hand, each round of
Electronic Code Book mode of operation knowing Rijndael decryption function consists mainly of four
that the design focuses on a memory-based, byte- different transformations: InvByteSub, InvShiftRow,
sized arithematic pipeline structure that processes one InvMix-Column, and key addition. For a detailed
round at a time. The design provides a throughput description of each round transformations, the reader
rate of 0.1 Gbps per data channel. could refer to [1-2]. The output of the above
UCL Crypto Group, Laboratoire de transformations is called the 'state'. The state consists
Micro´electronique gave in [7] a good solution for of the same byte length as each block of the message.
applications, which need low area for implementation The description of the four transformations of the
like embedded systems where the rate of data transfer Rijndael cipher and their inverses will be given
is not the main concern. Such implementations use below.
FPGA Families like (Xilinx Virtex-II, Xilinx Spartan-
ByteSub Transformation: The ByteSub transformation
3 XC3S50).
is a non-linear byte substitution, operating on each of
M. C. Liberatori and J. D. Bonadero proposed in [8] a
the state bytes independently. The ByteSub
low-cost solution to deal with the sub-keys computed
transformation is done using a once-pre-calculated
during the decryption step while merging the key
substitution table called S-box. That S-box table
schedule and the data path parts which makes it
contains 256 numbers (from 0 to 255) and their
practical for cryptographic embedded applications.
corresponding resulting values. For more details of
the method of calculating the S-box table refer to
In this paper, we propose a modified implementation
[1- 2].
of Rijndael cipher using FPGA. Based on the fact that
any FPGA includes built in memory block, we store
InvByteSub Transformation: The InvByteSub
all the results of the fixed operations within the
transformation is done using a once-pre-calculated
memory modules. In order to achieve this goal, we
substitution table called InvS-box. That table (or
first implement the algorithm using C language. This
InvS-box) contains 256 numbers (from 0 to 255) and
step guides us through the FPGA design and helps us
their corresponding values.
in the optimization of the proposed design and in
obtaining the results of the fixed operation.
ShiftRow Transformation: In ShiftRow
transformation, the rows of the state are cyclically left
The present paper is organized as follows: in
shifted over different offsets. Row 0 is not shifted;
Section2, description of Rijndael cipher is given.
row 1 is shifted over one byte; row 2 is shifted over
Then, in Section 3, a description of the proposed
two bytes and row 3 is shifted over three bytes.
design for Very high speed integrated circuits
Hardware Description Language (VHDL)
InvShiftRow Transformation: In InvShiftRow
implementation of Rijndael encryption function is
transformation, the rows of the state are cyclically
detailed. In Section 4, a description of the proposed
right shifted over different offsets. Row 0 is not
design for VHDL implementation of Rijndael
shifted, row 1 is shifted over one byte, row 2 is shifted
decryption function is detailed. Then, in Section 5, a
over two bytes and row 3 is shifted over three bytes.
comparison of the proposed design with other FPGA
designs is illustrated. Finally, the paper concludes in
Mix-Column Transformation: In Mix-Column, the
Section 6.
columns of the state are considered as polynomials
multiplied by a fixed polynomial c(X), given by:
2. Description of Rijndael Cipher c(X)=’03’X3 + ‘01’X2 + ‘01’X + ‘02’. The Mix-
The Rijndael is a block cipher, which operates on Column transformation can be written in a matrix
different keys and block lengths: 128 bits, 192 bits, or multiplication as follows (equation 1):
256 bits. The input to each round consists of a block
of message called the state and the round key. It has ⎡d 0, j ⎤ ⎡02 03 01 01⎤ ⎡c 0, j ⎤
⎢d ⎥ ⎢ ⎢ ⎥
to be noted that the round key changes in every
⎢ 1, j ⎥ = ⎢ 01 02 03 01⎥⎥ ⎢ c1, j ⎥ (1)
round. The state can be represented as a rectangular ⎢d 2, j ⎥ ⎢ 01 01 02 03⎥ ⎢c 2, j ⎥
array of bytes. This array has four rows; the number ⎢ ⎥ ⎢ ⎥⎢ ⎥
of columns is denoted by Nb and is equal to the block ⎢⎣d 3, j ⎥⎦ ⎣03 01 01 01⎦ ⎢⎣c 3, j ⎥⎦
length divided by 32. The same could be applied to
the cipher key. The number of columns of the cipher
key is denoted by Nk and is equal to the key length Where the matrix ‘c’ represents the input to the Mix-
divided by 32. The cipher consists of a number of Column transformation and the matrix ‘d’ represents
rounds - that is denoted by Nr - which depends on the output of the Mix-Column transformation. Both
both block and key lengths. Each round of Rijndael ‘c’ and ‘d’ have a length of 32 bits.
encryption function consists mainly of four different
transformations: ByteSub, ShiftRow, Mix-Column InvMix-Column Transformation: In InvMix-Column,
the columns of the state are considered as polynomials

10
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

multiplied by a fixed polynomial d(x), given by: round_constant: it goes to the key schedule layer to
d(x)=’0B’x3 + ‘0D’x2 + ‘09’x + ‘0E’. The InvMix- indicate which round is running at the moment and it
Column transformation can be written in a matrix applies a constant value according to the running
multiplication form (equation 2) : round

⎡ b 0, j ⎤ ⎡ 0E 0B 0D 09 ⎤ ⎡a 0, j ⎤
⎢ ⎥ ⎢ ⎥⎢ ⎥
⎢ b1, j ⎥ ⎢ 09 0E 0B 0D ⎥ ⎢ a1, j ⎥ (2)
⎢b ⎥=⎢ ⎥ ⎢a ⎥
⎢ 2, j ⎥ ⎢0D 09 0E 0B ⎥ ⎢ 2, j ⎥
⎢ b 3, j ⎥ ⎣ 0B 0D 09 0E ⎦ ⎢a 3, j ⎥
⎣ ⎦ ⎣ ⎦

Where the matrix ‘a’ represents the input to the


InvMix-Column transformation and the matrix ‘b’
represents the output of the InvMix-Column
transformation. Both ‘a’ and ‘b’ have a length of 32
bits.

AddKey Transformation: The round key is applied to


the state - resulted from the operation of the Mix- Figure 1: Block Diagram of Encryption Module
Column transformation - by a simple bitwise X-OR.
The round key length is equal to the block length. 3.2. Key Generator: This block is responsible for
[1-2] contain information about how to calculate the creating the keys for each round as shown in Figure 2.
round key from the secret key. In the next section, a It contains four S boxes.
description of the proposed design for VHDL
implementation of Rijndael encryption function is
detailed.

3. VHDL Implementation of Rijndael


Encryption Function
In [9], FPGA implementation of Rijndael encryption
function using VHDL (the case where Nb=4 and
Nk=4) was designed. This implementation is based
on performing Mix-Column transformation using
shifts and X-OR operations. Since Mix-Column
transformation is a fixed transformation, therefore
look-up tables could be used to execute it. This will
lead to obtain a higher throughput. We enhance the
design proposed in [9] by using look-up tables for
both Mix-Column and SubByte transformations. The
components needed to implement the encryption
function of AES are shown in Figure 1. Figure 1 Figure 2. Block Diagram of key_schedule Module
contains the following components:

3.1. The controller 3.3. The round layers: This block represents the
This block controls the sequencing operations of the rounds as shown in Figure 3.
rounds. It generates the round constant associated
with each round. It also generates the control signal at It contains the row shifter followed by two blocks
the appropriate time, those control signals are: running in parallel. The first one is Mix-Column
key_reg_mux_sel: The key schedule input selector block combined with an S-Box block, and the second
which selects the input key before the first round, and one is S-Box block. The first block calls four look-up
then it reads the output key as the next input. tables to calculate its output. The second block is the
load_key_reg: The key schedule output enable. normal S-Box block. The final output is taken from S-
load_data_reg: The input register enable. Box combined with Mix-Column block except for the
data_reg_mux_sel : The data register selector which final case where the output is taken directly from S-
selects input register data from the plaintext input, Box block using last_mux_sel signal. Then, an X-OR
round0 output which is the X-OR between key zero function is applied with the round key.
and the plaintext input, or the round layers outputs.
last_mux_sel: it goes to the round layer to indicate
the last round.

11
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

e_in encryption code - and enable writing into the stack


as shown in Figure 4.
Shift Row
The old load_key_reg is used to read from the stack
after calculating the keys. After the rounds has
finished, the controller will be in the idle state
S Box S Box + Mix Column waiting a new decrypt pulse (not the init state) to
last_round_mux_sel prevent re-calculating the keys once again as they
Mux have been already calculated and stored in the key
stack.
Add Round Key The round layers block uses the Inv-Sbox block in
parallel with the Inv-Mix-Column combined with
Inv-Sbox block. The Inv-Shift-Row block has
d_out
changed internally while its interface stays the same
Figure 3: Block Diagram of the Round Module (encryption)
as shown in Figure 5.
d_in
To test the system, a test bench is used. The test
bench applies encryption input pulse to trigger the
system, then it checks the output ciphertext if valid or
not. Another test bench is used to continuously apply Inv Shift Row
inputs (read from a file) to the system by applying
encrypt pulse each 13 clocks. It also generates the
reset and clock signals. In the next section, a
Inv S Box Inv S Box +
description of the proposed design for VHDL Inv Mix
implementation of Rijndael decryption function is
detailed. last round mux
Mux

4. VHDL Implementation of Rijndael


Decryption Function Add Round Key
The implementation of Rijndael decryption function
is similar to that of the encryption function except for
the following points: e_out
- As the keys have to be read in reverse order, they
must be calculated prior to applying any input, Figure 5. Block Diagram of Round Module (decryption)
therefore they are stored in a stack-like buffer.
This buffer contains InvMix-Column block that is To test the system, a test bench is used. The test bench
used before storing the keys in the stack (for keys applies decryption input pulse to trigger the system,
1 to 9 only). then it checks the output plaintext if valid or not.
- The controller generates a new signal: Another test bench is used to continuously apply
inputs (read from file) to the system by applying
encrypt pulse each 13 clocks. It also generates the
reset and clock signals. Note that the keys are
calculated once in the beginning of operation. To
change the keys, a reset signal must be asserted to
enable the load stack state to perform once again. The
simulation output of test vectors are given in
Appendix A.

5. Synthesis Results
To ensure that our modifications give a better results
in terms of area and speed than the original one [9],
we compare the two encryption codes (original and
modified). The comparison considered two criteria:
chip speed and area utilization. The design was
implemented on an ALTERA EP20K300EBC652
device. It has to be noted that in [9], no decryption
algorithm was proposed. Both designs were
Figure 4: Block Diagram of decryption Module synthesized using Leonardo Spectrum tool and
simulated using ModelSim tool. As shown in Table 1,
write_key_reg which is used to enable the key an increase in speed about 25% was achieved in our
schedule - which is the same as the one used in the design and a reduction in area about 11% was

12
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

achieved in our design. On the other hand, since we The last step is to compare our decryption design with
use look-up tables to perform Mix-Column other design approaches. In [10] a design of
transformation, the new encryption design needs decryption module based on Altera FPGA is
more memory (as shown in Table 1), but this increase proposed. As shown in Table 3, our design
is not bad as it utilized the memory resources inside outperforms the design in [10] by a 84.21% reduction
the FPGA efficiently. For the sake of comparing the in area and 97.12% increase in speed with a price of
design with another Altera based designs, the design increased memory utilization.
in [10] is including in the table. The comparison
shows that the proposed design has a higher Table 3. Comparison Between the Altera Based Designs of
throughput compared to the design in [10]. the Decryption Module
Resource Used Available Utilization
Table 1. Comparison between the Altera Based Designs of
the Encryption Module IOs 387 408 94.85%
LCs 1494 16640 8.98%
Our design
Resource Used Available Utilization Memory Bits 169984 212992 79.81%
Speed 72.9 MHz
Ios 387 408 94.85%
Original IOs 387 408 94.85%
design [9] LCs 897 11520 7.79%
Memory Bits 40960 147456 27.78% Piotr [10] LCs 2885 11520 25.04%
Speed 81.2 MHz Memory Bits 40960 147456 27.78%
Ios 387 408 94.85% Speed 40.69 MHz
Modified
LCs 797 11520 6.92%
proposed
Design
Memory Bits 114688 147456 77.78% Note that the implementation in [10] needs 21 clock
Speed 99.1 MHz cycles to give a key compared to 13 clock cycles in
Ios 387 408 94.85% our design. The FPGAs used are EP20K300EBC652
LCs 1032 11520 8.96%
Piotr [10] in our design and EPF10K250AGC599-1 in [10].
Memory Bits 40960 147456 27.78%
Speed 44 MHz
We have to indicate that the new trends to implement
the AES employ VLSI (ASIC) and reconfigurable
Then, we compare our design with different designs.
architectures to improve the system efficiency by
A good comparison of the different designs
means of speed, power and size. Using such
implemented in xilinix FPGA chips could be found in
techniques to implement encryptors may achieve
[10]. To compare our work with those in [10], we
speeds up to 17.8 Gbps and more than ten times
implemented our design in xilinix XC2V2000 family
power efficient compared to field programmable gate
which has sufficient memory for our design. The
arrays implementations. Therefore, our modified
maximum core frequency was 80.5 MHz. Since each
algorithm could achieve higher throughput using such
round was finished in one clock cycle, plus two clock
techniques.
cycles for registering the inputs, 13 clock cycles were
needed in a 128-bit key design. As a result, the
throughput of the Rijndael core was 793.3 Mbit/sec 6. Conclusions
which could be improved to 937.6 Mbit/sec if the two In this paper we approved a modified implementation
registering cycles are performed in parallel. of Rijndael AES encryption standard based on the fact
Throughput calculated by other researches is listed that any FPGA includes built in memory block;
below in Table 2. therefore we store all the results of the fixed
operations within the memory modules. The
Table 2 Comparison of 128-bit Rijndael Encryption modification gives an 11% reduction in area and 25%
Implementations increase in speed (Throughput) compared with the
Design Device
Area Throughput original design. Our design gives the highest
(CLB) (Mbit/sec) throughput and area utilization over all the Iterative
Gaj [11] IL XCV1000BG560-6 2902 331.5
Looping based FPGA implementations. The
Dandalis [12] IL XCV1000 5673 353.0
Tong [13] IL XCV1000HQ240-6 702 755.1
decryption algorithm is implemented and gives better
Our design IL XC2V2000BF957-6 402 793.3 results than the design in [10].
Elbirt [14] P XCV1000BG560-4 10992 1937.9
McLoone[15] P XCV3200EBG560-8 7576 3239.0
McLoone[15] P XCV812EBG560-8 2222 6956.0

[KEY]: IL = Iterative Looping P = Pipelining


Table 2 shows that our design outperforms all designs
based on the iterative loops in terms of area and
throughput. While the pipelined approach gives much
higher throughput, it needs much more area than the
iterative loop approaches.

13
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

7. References Programmable Technology (FPT), Hong Kong,


[1] Daemen J., and Rijmen V., “AES proposal: pp. 102-109, 2002
Rijndael-The Rijndael Block Cipher”, A [14] A.J. Elbert, E. Yip, B. Chetwynd, C. Paar: An
Technical Report (Version 2) Presented to the FPGA Implementation and Performance
National Institute of Standards and Technology Evaluation of the AES Block Cipher Candidate
(NIST), 1999. Algorithm Finalists, IEEE Transactions on VLSI,
[2] Daemen J., and Rijmen V. "The Design of August 2001, vol. 9, no. 4, pp. 545-557.
Rijndael: AES-the Advanced Encryption [15] M. McLoone, J.V McCanny: High Performance
Standard". Springer-Verlag., 2002 Single-Chip FPGA Rijndael Algorithm
[3] Cristian Chit¸ua, Manfred Glesner, "An FPGA Implementations, CHES 2001, pp. 65-76.
implementation of the AES-Rijndael in [16] “Announcing the Advanced Encryption Standard
OCB/ECB modes of operation", (AES)” Federal Information Processing
Microelectronics Journal 36, pp139–146, 2004. Standards Publication 197, November 26, 2001.
[4] Máire McLoone , John V. McCanny, "Single-
Chip FPGA Implementation of the Advanced Appendix A: Simulation Results using
Encryption Standard Algorithm", G. Brebner and Test Vectors
R. Woods (Eds.): FPL 2001, LNCS 2147, pp. In [16], there are several test vectors for Nb = 4 and
152-161, 2001. Nk = 4, 6 and 8. The test vectors for the case where
[5] Viktor Fischer and Miloˇs Drutarovsky, "Two Nb = 4 and Nk = 4 are given below:
Methods of Rijndael Implementation in Plaintext: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd
Reconfigurable Hardware", LNCS 2162, pp. ee ff
77–92, 2001. Key: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c
[6] Kenneth Stevens and Otmane Ait Mohamed, 0d 0e 0f
"Single-chip FPGA Implementation of a Ciphertext: 69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4
Pipelined, Memory-Based AES Rijndael c5 5a
Encryption Design", IEEE 2005. In Figures 6 and 7, the simulation outputs of the
[7] G. Rouvroy, F. Standaert, J. Quisquater and J. abovementioned test vectors of the encryption and
Legat, "Compact and Efficient decryption algorithms are given. The two figures
Encryption/Decryption Module for FPGA show that the outputs of both the encryption and
Implementation of the AES Rijndael VeryWell decryption functions are as stated in [9].
Suited for Small Embedded Applications",
Proceedings of the International Conference on
Information Technology: Coding and
Computing (ITCC’04), IEEE 2004.
[8] M. Liberatori and J. Bonadero, " AES-128
Cipher. Minimum Area, Low Cost FPGA
Implementation", Latin America Applied
Research, 37:71-77 , 2007
[9] http://islab.oregonstate.edu/koc/ece575/03Projec
t/Megarajan-Park.
[10] Piotr Mroczkowski, “Implementation of the
block cipher Rijndael using Altera FPGA”,
Public Comments on AES Candidate Algorithms
- Round 2, 2000.
[11] K. Gaj, P. Chodowiec: Comparison of the
Hardware Performance of the AES Candidates
using Reconfigurable Hardware: The Third
Advanced Encryption Standard Candidate
Conference, April 13-14, 2000, New York,
USA.
[12] A. Dandalis, V. K. Prasanna, J. D. P. Rolim: A
Comparative Study of Performance of AES
Candidates Using FPGAs: The Third Advanced
Encryption Standard Candidate Conference,
April 13-14, 2000, New York, USA.
[13] Dennis Ka Yau Tong, Pui Sze Lo, Kin Hong
Lee, Philip H.W. Leong, “A System Level
Implementation of Rijndael on a Memory-slot
based FPGA Card”, Proceedings of the 2002
IEEE International Conference on Field

14
ICGST-PDCS Journal, Volume 9, Issue 1, October 2009

Biographies:
Mohamed Bakr Abdelhalim Dr. A. Tobal is an Associate
received his BSc, MSc and PhD Prof. at the Electronics
degrees in Electronics Research Institute, Cairo,
Engineering from Cairo Egypt. He received his B.
University in 1999, 2003 and Sc., M. Sc. And Ph. D. from
2008 respectively. He was a Faculty of Engineering, Cairo
researcher at the Department of University in 1990, 1994 and
Electrical and Communications 1999 respectively.
Engineering, Cairo University. His fields of research include embedded systems
He was also a teaching and lab implementation, digital signal processing,
assistant at the Electronics Engineering Department, Biological Neural Network, pattern recognition and
American University in Cairo. Currently he is an Artificial Intelligence.
assistant professor at the College of Computing and
Information Technology - Arab Academy for Dr. Farouk is an Assistant
Science, Technology and Maritime Transport. Prof. He joined the Electronics
His research interests are FPGA-based design, Research Institute, Egypt, in
System-level design and description languages, CAD 1993. His fields of research
tools, and Soft computing techniques. are signal processing, image
compression, video
Dr. Heba K. Aslan is an processing, video
Associate Professor at the compression, video indexing
Electronics Research Institute, and retrieval, video on
Cairo- Egypt. She received her demand, pattern recognition and machine vision.
B. Sc., M. Sc. And Ph. D. from Dr. Farouk received his Ph.D. at 2001 from
Faculty of Engineering, Cairo Electronics & Communications Dept., Faculty of
University in 1990, 1994 and Engineering, Cairo Univ. and his M.Sc. at 1996
1998 respectively. Her research from Electronics & Communications Dept.,
interests include: Key Distribution Protocols, Faculty of Engineering, Cairo Univ.
Authentication Protocols, Logical Analysis of
Protocols and Intrusion Detection Protocols.

Figure 6. Simulation Output of the Encryption Function

Figure 7. Simulation Output of the Decryption Function

15

You might also like