|
@@ -1,22 +1,36 @@
|
|
\chapter{Mathematical prequisites \label{chap:preq}}
|
|
\chapter{Mathematical prequisites \label{chap:preq}}
|
|
|
|
|
|
-This chapter formalizes the notation used in the rest of the thesis, and
|
|
|
|
-moreover attempts to discuss and study the elementary functions on which the
|
|
|
|
-project has been grounded. For example, the $\ll$ and $\gg$ are respectively
|
|
|
|
-used with the meaning of left and right binary shift, as usual in the computer
|
|
|
|
-science field; meanwhile, the $\dsqrt$ function will be defined in section
|
|
|
|
-\ref{sec:preq:sqrt}, with the acceptation of discrete square root.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-%% XXX. where to put these?
|
|
|
|
|
|
+In this chapter we formalize the notation used in the rest of the thesis, and
|
|
|
|
+furthermore attempt to discuss and study the elementary functions on which the
|
|
|
|
+project has been grounded.
|
|
|
|
+\\
|
|
|
|
+The $\ll$ and $\gg$ are respectively used with the meaning of left and right
|
|
|
|
+bitwise shift, as usual in computer science.
|
|
|
|
+\\
|
|
|
|
+The $\dsqrt$ function will be defined in section \ref{sec:preq:sqrt}, with the
|
|
|
|
+acceptation of discrete square root.
|
|
|
|
+\\
|
|
The logarithmic $\log$ function is assumed to be in base two, i.e. $\log_2$.
|
|
The logarithmic $\log$ function is assumed to be in base two, i.e. $\log_2$.
|
|
-
|
|
|
|
|
|
+\\
|
|
The $\idiv$ symbol is the integer division over $\naturalN$, i.e.
|
|
The $\idiv$ symbol is the integer division over $\naturalN$, i.e.
|
|
$a \idiv b = \floor{\frac{a}{b}}$.
|
|
$a \idiv b = \floor{\frac{a}{b}}$.
|
|
|
|
|
|
|
|
+\section{Algorithmic Complexity Notation}
|
|
|
|
+The notation used to describe asymptotic complexity follows the $O$-notation,
|
|
|
|
+abused under the conventions and limits of MIT's Introduction to Algorithms.
|
|
|
|
+
|
|
|
|
+Let \bigO{g} be the asymptotic upper bound of g:
|
|
|
|
+$$
|
|
|
|
+\bigO{g(n)} = \{ f(n) : \exists n_0, c \in \naturalN \mid 0 \leq f(n) \leq cg(n)
|
|
|
|
+\ \forall n > n_0 \}
|
|
|
|
+$$
|
|
|
|
+
|
|
|
|
+With $f(n) = \bigO{g(n)}$ we actually mean
|
|
|
|
+$f(n) \in \bigO{g(n)}$.
|
|
|
|
+
|
|
\section{Euclid's Greatest Common Divisor}
|
|
\section{Euclid's Greatest Common Divisor}
|
|
|
|
|
|
-Being the greatest common divisor a foundamental algebraic operation in the ssl
|
|
|
|
|
|
+Being the greatest common divisor a foundamental algebraic operation in the TLS
|
|
protocol, \openssl implemented it with the following signature:
|
|
protocol, \openssl implemented it with the following signature:
|
|
|
|
|
|
\begin{minted}[fontsize=\small]{c}
|
|
\begin{minted}[fontsize=\small]{c}
|
|
@@ -25,20 +39,20 @@ protocol, \openssl implemented it with the following signature:
|
|
|
|
|
|
The computation proceeds under the well-known Euclidean algorithm, specifically
|
|
The computation proceeds under the well-known Euclidean algorithm, specifically
|
|
the binary variant developed by Josef Stein in 1961 \cite{AOCPv2}. This variant
|
|
the binary variant developed by Josef Stein in 1961 \cite{AOCPv2}. This variant
|
|
-exploits some interesting properties of $gcd(a, b)$
|
|
|
|
|
|
+exploits some interesting properties of $gcd(a, b)$:
|
|
\begin{itemize}
|
|
\begin{itemize}
|
|
\setlength{\itemsep}{1pt}
|
|
\setlength{\itemsep}{1pt}
|
|
\setlength{\parskip}{0pt}
|
|
\setlength{\parskip}{0pt}
|
|
\setlength{\parsep}{0pt}
|
|
\setlength{\parsep}{0pt}
|
|
- \item if $a,\ b$ are even, then $gcd(a, b) = 2gcd(a/2, b/2)$
|
|
|
|
- \item if $a$ is even and $b$ is odd, then $gcd(a, b) = gcd(a/2, b)$
|
|
|
|
- \item $gcd(a, b) = gcd(a-b, b)$, as in the standard Euclid's algorithm
|
|
|
|
- \item the sum of two odd numbers is always even
|
|
|
|
|
|
+ \item if $a,\ b$ are even, then $gcd(a, b) = 2gcd(a/2, b/2)$;
|
|
|
|
+ \item if $a$ is even and $b$ is odd, then $gcd(a, b) = gcd(a/2, b)$;
|
|
|
|
+ \item $gcd(a, b) = gcd(a-b, b)$, as in the standard Euclid algorithm;
|
|
|
|
+ \item the sum of two odd numbers is always even.
|
|
\end{itemize}
|
|
\end{itemize}
|
|
|
|
|
|
% Donald Knuth, TAOCP, "a binary method", p. 388 VOL 2
|
|
% Donald Knuth, TAOCP, "a binary method", p. 388 VOL 2
|
|
-Both \cite{AOCPv2} and \cite{MITalg} analyze the running time for the algorithm,
|
|
|
|
-even if \cite{MITalg}'s demonstration is fairly simpler and proceeds %elegantly
|
|
|
|
|
|
+Both \cite{AOCPv2} and \cite{MITalg} analyze the running time of the
|
|
|
|
+algorithm; \cite{MITalg}'s proof is fairly simpler and proceeds %elegantly
|
|
by induction.
|
|
by induction.
|
|
Anyway, both show that algorithm ~\ref{alg:gcd} belongs to the class
|
|
Anyway, both show that algorithm ~\ref{alg:gcd} belongs to the class
|
|
\bigO{\log b}.
|
|
\bigO{\log b}.
|
|
@@ -74,84 +88,39 @@ Anyway, both show that algorithm ~\ref{alg:gcd} belongs to the class
|
|
Unfortunately, there is yet no known parallel solution that significantly improves
|
|
Unfortunately, there is yet no known parallel solution that significantly improves
|
|
Euclid's \textsc{gcd}.
|
|
Euclid's \textsc{gcd}.
|
|
|
|
|
|
-\section{RSA Cipher \label{sec:preq:rsa}}
|
|
|
|
-
|
|
|
|
-The RSA cryptosystem, invented by Ron Rivesst, Adi Shamir, and Len Adleman
|
|
|
|
-~\cite{rsa}, was first published in August 1977's issue of
|
|
|
|
-\emph{Scientific American}. In its basic version, this \emph{asymmetric} cipher
|
|
|
|
-works as follows:
|
|
|
|
-\begin{itemize}
|
|
|
|
- \item choose a pair $\angular{p, q}$ of \emph{random} \emph{prime} numbers;
|
|
|
|
- let $N$ be the product of the two, $N=pq$, and call it ``Public Modulus''
|
|
|
|
- \item choose a pair $\angular{e, d}$ of \emph{random} numbers, both in
|
|
|
|
- $\integerZ^*_{\varphi(N)}$, such that one is the multiplicative inverse of the
|
|
|
|
- other, $ed \equiv 1 \pmod{\varphi(N)}$ and $\varphi(N)$ is Euler's totient
|
|
|
|
- function;
|
|
|
|
-\end{itemize}
|
|
|
|
-Now, call $\angular{N, e}$ \emph{public key}, and $\angular{N, d}$
|
|
|
|
-\emph{private key}, and let the encryption function $E(m)$ be the $e$-th power of
|
|
|
|
-the message $m$:
|
|
|
|
-\begin{align}
|
|
|
|
- \label{eq:rsa:encrypt}
|
|
|
|
- E(m) = m^e \pmod{N}
|
|
|
|
-\end{align}
|
|
|
|
-while the decryption function $D(c)$ is the $d$-th power of the ciphertext $c$:
|
|
|
|
-\begin{align}
|
|
|
|
- \label{eq:rsa:decrypt}
|
|
|
|
- D(c) = c^d \equiv E(m)^d \equiv m^{ed} \equiv m \pmod{N}
|
|
|
|
-\end{align}
|
|
|
|
-that, due to Fermat's little theorem, is the inverse of $E$.
|
|
|
|
-
|
|
|
|
-\paragraph{}
|
|
|
|
-%% less unless <https://www.youtube.com/watch?v=XnbnuY7Kxhc>
|
|
|
|
-From now on, unless otherwise specified, the variable $N=pq$ will always refer
|
|
|
|
-to the public modulus of a generis RSA keypair, with $p, q\ .\ p > q$ being the
|
|
|
|
-two primes factorizing it. Again, $e, d$ will respectively refer to the public
|
|
|
|
-exponent and the private exponent.
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-\section{Algorithmic Complexity Notation}
|
|
|
|
-The notation used to describe asymptotic complexity follows the $O$-notation,
|
|
|
|
-abused under the conventions and limits of MIT's Introduction to Algorithms.
|
|
|
|
-
|
|
|
|
-Let \bigO{g} be the asymptotic upper bound of g:`
|
|
|
|
-$$
|
|
|
|
-O(g(n)) = \{ f(n) : \exists n_0, c \in \naturalN \mid 0 \leq f(n) \leq cg(n)
|
|
|
|
-\ \forall n > n_0 \}
|
|
|
|
-$$
|
|
|
|
-
|
|
|
|
-With the writing $f(n) = O(g(n))$ we will actually interpret
|
|
|
|
-$f(n) \in O(g(n))$.
|
|
|
|
|
|
|
|
\section{Square Root \label{sec:preq:sqrt}}
|
|
\section{Square Root \label{sec:preq:sqrt}}
|
|
|
|
|
|
-Computing the square root has been another foundamental requirement of the
|
|
|
|
-project, though not satisfied by \openssl. Apparently,
|
|
|
|
|
|
+Computing the square root is another important building block of the project,
|
|
|
|
+though not available in \openssl\!.
|
|
|
|
+Apparently,
|
|
% \openssl is a great pile of crap, as phk states
|
|
% \openssl is a great pile of crap, as phk states
|
|
-\openssl does only provide the discrete quare root implementation using the
|
|
|
|
-Tonelli/Shanks algorithm, which specifically solves $x$ in $x^2 = a \pmod{p}$,
|
|
|
|
-with $p \in \naturalPrime$.
|
|
|
|
|
|
+\openssl does only provide the discrete square root implementation using the
|
|
|
|
+Tonelli/Shanks algorithm, which specifically solves in $x$ the equation
|
|
|
|
+$x^2 = a \pmod{p}$, with $p \in \naturalPrime$:
|
|
|
|
|
|
\begin{minted}{c}
|
|
\begin{minted}{c}
|
|
BIGNUM* BN_mod_sqrt(BIGNUM* x, const BIGNUM* a, const BIGNUM* p,
|
|
BIGNUM* BN_mod_sqrt(BIGNUM* x, const BIGNUM* a, const BIGNUM* p,
|
|
const BN_CTX* ctx);
|
|
const BN_CTX* ctx);
|
|
\end{minted}
|
|
\end{minted}
|
|
|
|
|
|
-Instead, we are interested in finding the square root in $\naturalN$, hence we
|
|
|
|
-did come out with our specific implementation, first using Bombelli's algorithm
|
|
|
|
-described in ~\ref{par:preq:sqrt:bombelli},
|
|
|
|
-and later with Dijkstra one discussed in ~\ref{par:preq:sqrt:dijkstra}.
|
|
|
|
|
|
+Instead, we are interested in finding the the pair
|
|
|
|
+$\angular{x, r} \in \naturalN^2 \mid x^2 + r = n$, that is, the integer part of
|
|
|
|
+the square root of a natural number and its rest.
|
|
|
|
+Hence, we did come out with our specific implementation, first using Bombelli's
|
|
|
|
+algorithm, and later with the one of Dijkstra. Both are going to be discussed
|
|
|
|
+below.
|
|
|
|
|
|
-Unless otherwise specified, in the later pages we will use $\sqrt{n}$ with the
|
|
|
|
-usual meaning ``the half power of $n$'', while with $x, r = \dsqrt{n}$ we will
|
|
|
|
-intend the pair $\angular{x, r} \in \naturalN^2 \mid x^2 + r = n$.
|
|
|
|
|
|
+Unless otherwise specified, in the later pages we use $\sqrt{n}$ with the
|
|
|
|
+usual meaning ``the half power of $n$'', while with $x, r = \dsqrt{n}$ we mean
|
|
|
|
+the pair just defined.
|
|
|
|
|
|
\paragraph{Bombelli's Algorithm \label{par:preq:sqrt:bombelli}} dates back to
|
|
\paragraph{Bombelli's Algorithm \label{par:preq:sqrt:bombelli}} dates back to
|
|
the XVI century, and approaches the problem of finding the square root by using
|
|
the XVI century, and approaches the problem of finding the square root by using
|
|
continued fractions. Unfortunately, we weren't able to fully assert the
|
|
continued fractions. Unfortunately, we weren't able to fully assert the
|
|
correctness of the algorithm, since the original document
|
|
correctness of the algorithm, since the original document
|
|
-~\cite{bombelli:algebra} is definitely unreadable and presents a difficult,
|
|
|
|
-inconvenient notation. Though, for completeness' sake, we report in table
|
|
|
|
|
|
+~\cite{bombelli:algebra} presents a difficult, inconvenient notation. Though,
|
|
|
|
+for completeness' sake, we report in table
|
|
~\ref{alg:sqrt:bombelli} the pseudocode adopted and tested for its correctness.
|
|
~\ref{alg:sqrt:bombelli} the pseudocode adopted and tested for its correctness.
|
|
|
|
|
|
\begin{algorithm}[H]
|
|
\begin{algorithm}[H]
|
|
@@ -179,6 +148,9 @@ inconvenient notation. Though, for completeness' sake, we report in table
|
|
\State $r \gets r - y$
|
|
\State $r \gets r - y$
|
|
\State $x \gets 10x + d - 1$
|
|
\State $x \gets 10x + d - 1$
|
|
\EndFor
|
|
\EndFor
|
|
|
|
+
|
|
|
|
+ \State \Return $x, r$
|
|
|
|
+
|
|
\EndProcedure
|
|
\EndProcedure
|
|
\end{algorithmic}
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
\end{algorithm}
|
|
@@ -190,23 +162,24 @@ multiplications. This means that the complexity of this solutions belongs to
|
|
\cite{Dijkstra:adop}, \S 8, p.61. There, Dijkstra presents an elightning
|
|
\cite{Dijkstra:adop}, \S 8, p.61. There, Dijkstra presents an elightning
|
|
process for the computation of the square root, making only use of binary shift
|
|
process for the computation of the square root, making only use of binary shift
|
|
and algebraic additions.
|
|
and algebraic additions.
|
|
-Specifically, the problem attempts to find, given a natual $n$, the $a$ that
|
|
|
|
-establishes:
|
|
|
|
|
|
+Specifically, the problem attempts to find, given a natual $n$, the integer $a$
|
|
|
|
+that establishes:
|
|
\begin{align}
|
|
\begin{align}
|
|
\label{eq:preq:dijkstra_problem}
|
|
\label{eq:preq:dijkstra_problem}
|
|
a^2 \leq n \: \land \: (a+1)^2 > n
|
|
a^2 \leq n \: \land \: (a+1)^2 > n
|
|
\end{align}
|
|
\end{align}
|
|
|
|
|
|
-Take now the pair $\angular{a=0, b=n+1}$, and think about the problem as dicotomic
|
|
|
|
-search: we want to diminuish the dinstance between the upper bound $b$ and the
|
|
|
|
-lower bound $a$ while holding the guard \ref{eq:preq:dijkstra_problem}:
|
|
|
|
|
|
+Take now the pair $\angular{a=0, b=n+1}$, and consider the inverval
|
|
|
|
+$[a, b[$. We would like to reduce the distance between the upper bound $b$ and
|
|
|
|
+the lower bound $a$, while holding the guard \ref{eq:preq:dijkstra_problem}:
|
|
|
|
|
|
\begin{align*}
|
|
\begin{align*}
|
|
a^2 \leq n \: \land \: b > n
|
|
a^2 \leq n \: \land \: b > n
|
|
\end{align*}
|
|
\end{align*}
|
|
|
|
|
|
%% XXX. I am not so sure about this, pure fantasy.
|
|
%% XXX. I am not so sure about this, pure fantasy.
|
|
-The speed of convergence is determined by the choice of dinstance $d$, which is optimal when
|
|
|
|
|
|
+The speed of convergence is determined by the choice of the distance $d$, which
|
|
|
|
+analougously to the dicotomic search problem, is optimal when
|
|
$d = (b-a) \idiv 2$.
|
|
$d = (b-a) \idiv 2$.
|
|
|
|
|
|
\begin{algorithm}[H]
|
|
\begin{algorithm}[H]
|
|
@@ -229,14 +202,13 @@ $d = (b-a) \idiv 2$.
|
|
% heh, there's not much to explain here, that's almost the same in Dijkstra's
|
|
% heh, there's not much to explain here, that's almost the same in Dijkstra's
|
|
% book, excluding the inspirative familiar portrait that led to the insight of
|
|
% book, excluding the inspirative familiar portrait that led to the insight of
|
|
% this change of varaibles.
|
|
% this change of varaibles.
|
|
-Now optimization proceeds by abstration: the variables $a, b$ are sobstituded
|
|
|
|
-introducing:
|
|
|
|
|
|
+Now optimization proceeds with the following change of variables:
|
|
$c = b-a$,
|
|
$c = b-a$,
|
|
$p = ac$,
|
|
$p = ac$,
|
|
$q = c^2$,
|
|
$q = c^2$,
|
|
-$r = n-a^2$
|
|
|
|
-and finally $h$ as local optimization. For any further details and
|
|
|
|
-explainations, the reference is still \cite{Dijkstra:adop}.
|
|
|
|
|
|
+$r = n-a^2$;
|
|
|
|
+For any further details and explainations, the reference is still
|
|
|
|
+\cite{Dijkstra:adop}.
|
|
|
|
|
|
\begin{algorithm}[H]
|
|
\begin{algorithm}[H]
|
|
\caption{Square Root: final version}
|
|
\caption{Square Root: final version}
|
|
@@ -255,10 +227,10 @@ explainations, the reference is still \cite{Dijkstra:adop}.
|
|
\end{algorithmic}
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
\end{algorithm}
|
|
|
|
|
|
-A fair approxidmation of the magnitude of the Dijkstra algorithm can be studied
|
|
|
|
-by looking at the pseudocode in ~\ref{alg:sqrt:dijkstra_naif}. Exactely as with
|
|
|
|
|
|
+A fair approximation of the magnitude of the Dijkstra algorithm can be studied
|
|
|
|
+by looking at the pseudocode in ~\ref{alg:sqrt:dijkstra_naif}. Exactly as in
|
|
the dicotomic search case, we split the interval $[a, b]$ in half on each step,
|
|
the dicotomic search case, we split the interval $[a, b]$ in half on each step,
|
|
-and choose wether to take the leftmost or the rightmost part. This results in
|
|
|
|
|
|
+and choose whether to take the leftmost or the rightmost part. This results in
|
|
$log(n+1)$ steps. During each iteration, instead, as we have seen in
|
|
$log(n+1)$ steps. During each iteration, instead, as we have seen in
|
|
~\ref{alg:sqrt:dijkstra} we just apply summations and binary shifts, which are
|
|
~\ref{alg:sqrt:dijkstra} we just apply summations and binary shifts, which are
|
|
upper bounded by \bigO{\log{n}/2}. Thus, the order of magnitude belongs to
|
|
upper bounded by \bigO{\log{n}/2}. Thus, the order of magnitude belongs to
|
|
@@ -266,8 +238,46 @@ upper bounded by \bigO{\log{n}/2}. Thus, the order of magnitude belongs to
|
|
|
|
|
|
\paragraph{}
|
|
\paragraph{}
|
|
Even if both algorithms presented have \emph{asymptotically} the same
|
|
Even if both algorithms presented have \emph{asymptotically} the same
|
|
-complexity, we believe that adopting Dijkstra's one has lead to a pragmatic,
|
|
|
|
-substantial performance improvement.
|
|
|
|
|
|
+complexity, we believe that adopting the one of Dijkstra has lead to a
|
|
|
|
+pragmatic, substantial performance improvement.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+\section{RSA Cipher \label{sec:preq:rsa}}
|
|
|
|
+
|
|
|
|
+The RSA cryptosystem, invented by Ron Rivest, Adi Shamir, and Len Adleman
|
|
|
|
+~\cite{rsa}, was first published in August 1977's issue of
|
|
|
|
+\emph{Scientific American}. In its basic version, this \emph{asymmetric} cipher
|
|
|
|
+works as follows:
|
|
|
|
+\begin{itemize}
|
|
|
|
+ \item choose a pair $\angular{p, q}$ of \emph{random} \emph{prime} numbers;
|
|
|
|
+ let $N$ be the product of the two, $N=pq$, and call it \emph{public modulus};
|
|
|
|
+ \item choose a pair $\angular{e, d}$ of \emph{random} numbers, both in
|
|
|
|
+ $\integerZ^*_{\varphi(N)}$, such that one is the multiplicative inverse of the
|
|
|
|
+ other, $ed \equiv 1 \pmod{\varphi(N)}$ and $\varphi(N)$ is Euler's totient
|
|
|
|
+ function;
|
|
|
|
+\end{itemize}
|
|
|
|
+Now, call $\angular{N, e}$ \emph{public key}, and $\angular{N, d}$
|
|
|
|
+\emph{private key}, and let the encryption function $E(m)$ be the $e$-th power of
|
|
|
|
+the message $m$:
|
|
|
|
+\begin{align}
|
|
|
|
+ \label{eq:rsa:encrypt}
|
|
|
|
+ E(m) = m^e \pmod{N}
|
|
|
|
+\end{align}
|
|
|
|
+while the decryption function $D(c)$ is the $d$-th power of the ciphertext $c$:
|
|
|
|
+\begin{align}
|
|
|
|
+ \label{eq:rsa:decrypt}
|
|
|
|
+ D(c) = c^d \equiv E(m)^d \equiv m^{ed} \equiv m \pmod{N}
|
|
|
|
+\end{align}
|
|
|
|
+that, due to Fermat's little theorem, is the inverse of $E$.
|
|
|
|
+
|
|
|
|
+\paragraph{}
|
|
|
|
+%% less unless <https://www.youtube.com/watch?v=XnbnuY7Kxhc>
|
|
|
|
+From now on, unless otherwise specified, the variable $N=pq$ will always refer
|
|
|
|
+to the public modulus of a generic RSA keypair, with
|
|
|
|
+$p, q$ being the two primes factorizing it, such that $p > q$.
|
|
|
|
+ Again, $e, d$ will respectively refer to the public
|
|
|
|
+exponent and the private exponent.
|
|
|
|
+
|
|
%%% Local Variables:
|
|
%%% Local Variables:
|
|
%%% mode: latex
|
|
%%% mode: latex
|
|
%%% TeX-master: "question_authority"
|
|
%%% TeX-master: "question_authority"
|