%compile with pdflatex
\documentclass[12pt]{article}
\parindent=.25in

\setlength{\oddsidemargin}{0pt}
\setlength{\textwidth}{440pt}
\setlength{\topmargin}{0in}

\usepackage{lmodern}
\usepackage{xspace}
\usepackage[protrusion=true,expansion=true]{microtype}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{latexsym}
\usepackage[center]{subfigure}
\usepackage{epsfig}
\usepackage{hyperref}

% Inline bibliographies
\usepackage{filecontents}
% Algorithm environment
\usepackage{algorithmicx,algpseudocode,  algorithm}
% Diagrams and figures in TikZ
\usepackage{tikz}

\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}

\usetikzlibrary{arrows}
\newcommand{\marginrk}[1]{\marginpar{\tiny#1}}

\newtheorem{theorem}{Teorema}
\newtheorem{lemma}[theorem]{Lema}
\newtheorem{fact}[theorem]{Hecho}
\newtheorem{definition}[theorem]{Definición}
\newtheorem{corollary}[theorem]{Corolario}
\newtheorem{proposition}[theorem]{Proposición}
%\newtheorem{claim}[theorem]{Claim}
\newtheorem{conjecture}[theorem]{Conjectura}
\newtheorem{observation}[theorem]{Observación}
\newtheorem{assumption}[theorem]{Supuesto}
\newtheorem{example}[theorem]{Ejemplo}

\newcommand{\gen}{\mathsf{Gen}}
\newcommand{\enc}{\mathsf{Enc}}
\newcommand{\dec}{\mathsf{Dec}}

\newcommand{\la}{\langle}
\newcommand{\ra}{\rangle}
\newcommand{\calA}{\mathcal{A}}
\newcommand{\calB}{\mathcal{B}}
\newcommand{\calC}{\mathcal{C}}
\newcommand{\calD}{\mathcal{D}}
\newcommand{\calE}{\mathcal{E}}
\newcommand{\calF}{\mathcal{F}}
\newcommand{\calG}{\mathcal{G}}
\newcommand{\calH}{\mathcal{H}}
\newcommand{\calI}{\mathcal{I}}
\newcommand{\calJ}{\mathcal{J}}
\newcommand{\calK}{\mathcal{K}}
\newcommand{\calL}{\mathcal{L}}
\newcommand{\calM}{\mathcal{M}}
\newcommand{\calN}{\mathcal{N}}
\newcommand{\calO}{\mathcal{O}}
\newcommand{\calP}{\mathcal{P}}
\newcommand{\calQ}{\mathcal{Q}}
\newcommand{\calR}{\mathcal{R}}
\newcommand{\calS}{\mathcal{S}}
\newcommand{\calT}{\mathcal{T}}
\newcommand{\calU}{\mathcal{U}}
\newcommand{\calV}{\mathcal{V}}
\newcommand{\calW}{\mathcal{W}}
\newcommand{\calX}{\mathcal{X}}
\newcommand{\calY}{\mathcal{Y}}
\newcommand{\calZ}{\mathcal{Z}}

\newcommand{\ZZ}{\mathbb{Z}}
\newcommand{\NN}{\mathbb{N}}
\newcommand{\RR}{\mathbb{R}}
\newcommand{\QQ}{\mathbb{Q}}

\newcommand{\sign}{\mathrm{sign}}
\newcommand{\poly}{\mathrm{poly}}
\newcommand{\size}{\mathrm{size}}
\newcommand{\depth}{\mathrm{depth}} 
\newcommand{\Exp}{\mathsf{Exp}} 


\newcommand{\experiment}[4]{
{\begin{figure}[tbp]
\begin{center}
\fbox{
\small
\hbox{
\begin{minipage}{.90\columnwidth}
{\bf #1}
\bigskip

#4

\end{minipage}
}
}
%\if\full
\vspace{-3pt}
\caption{\label{#3}#2}%\fi
\end{center}
\end{figure}
%\vspace{-10pt}
} }

%% New stuff
% Shortcuts
\newcommand{\eps}{\ensuremath{\epsilon}\xspace}
\newcommand{\negl}{\ensuremath{\mathsf{negl}}\xspace}
\newcommand{\Adv}{\ensuremath{\mathcal{A}}\xspace} % Adversarial algorithm A
\newcommand{\eqdef}{\stackrel{\rm def}{=}}
\newcommand{\accept}{\textsf{ACEPTO}\xspace}
\newcommand{\fail}{\textsf{FALLA}\xspace}
\newcommand{\reject}{\textsf{RECHAZO}\xspace} 
% Complexity
\newcommand{\littleO}[1]{{o\!\left({#1}\right)}}
\newcommand{\bigO}[1]{{O\!\left({#1}\right)}}
\newcommand{\bigTheta}[1]{{\Theta\!\left({#1}\right)}}
\newcommand{\bigOmega}[1]{{\Omega\!\left({#1}\right)}}
\newcommand{\tildeO}[1]{\tilde{O}\!\left({#1}\right)}
\newcommand{\tildeTheta}[1]{\operatorname{\tilde{\Theta}}\!\left({#1}\right)}

\pagestyle{headings}    % Go for customized headings

\newcommand{\handout}[5]{
   \noindent
   \begin{center}
   \framebox{
      \vbox{
    \parbox[t]{4in} {\bf #1 } \vspace{3mm}  {\hfill \bf #2 }
       \vspace{2mm}
       \hbox to 6.00in { {\Large \hfill #5  \hfill} }
       \vspace{1mm}
       \hbox to 6.00in { {\it #3 \hfill #4} }
      }
   }
   \end{center}
   \vspace*{1mm}
}

% compact lists, and handy shortcuts for items
\usepackage[shortlabels]{enumitem}

\begin{document}

\handout{Criptografía y Seguridad Computacional}{2016-01}
{Profesor: Fernando Krell}
{Notas: Geraldine Monsalve}{Clase 3: 16/03/2016}

\thispagestyle{plain}

\section*{Notación}
\begin{itemize}
\item PPT: Un algoritmo PPT es un algoritmo que corre en tiempo polinomial en el largo del input y que puede tomar decisiones aleatorias. PPT es en inglés {\em Probabilistic Polinomial Time}.
\item PRG: Sigla para describir un generador pseudo-aleatorio. En inglés {\em Pseudo-Random Generators}.
\item PRF: Sigla para describir una función pseudo-aleatoria. En inglés {\em Pseudo-Random Function}.
\item $U_n$: Distribución uniforme sobre \textit{strings} de $n$ bits ($\{0,1\}^n$).
\item $x\sim \calS$: Elemento $x$ es escogido de acuerdo a la distribución $\calS$.
\item $\calF_n^m$: Conjunto de todas las funciones de $\{0,1\}^n$ a $\{0,1\}^m$.
\item $\exists,~\exists!$, $\nexists$ y $\forall$: Existe al menos uno, existe un único, no existe y para todo.
\item $\negl(\cdot)$: Función negligible (asintóticamente menor al inverso de cualquier polinomio),
\end{itemize}


\section{Pseudoaleatoriedad}
Así como la indistinguibilidad computacional de cifrados es una relajación computacional de la seguridad perfecta de esquemas, la pseudoaleatoriedad lo es de la aleatoriedad. Informalmente podemos decir que la pseudoaleatoriedad hace referencia a una distribución sobre strings de un cierto largo, tal que es {\em computacionalmente} indistinguible a la distribución uniforme sobre strings del mismo largo. Formalizaremos esta noción con la definición de un generador pseudoaleatorio.
\begin{definition}
Sea $\ell(\cdot)$ un polinomio y $G$ un algoritmo de tiempo polinomial determinístico, tal que sobre cada input uniformemente aleatorio $s \in {\lbrace0,1\rbrace}^n$ entrega un string de largo $\ell(n)$. Diremos que $G$ es un $\textbf{generador pseudoaleatorio}$ si se cumple:
\begin{enumerate}
    \item Expansión: Para cada $n$, se cumple $l(n)>n$.
    \item Pseudoaleatoriedad: Para todo algoritmo PPT (probabilistic polinomial-time) distinguidor $\calD$, existe una función negligible $\mathsf{negl}(\cdot)$, tal que:
    \[|\Pr[D(r)=1]-\Pr[D(G(s))=1]|\leq \negl(n)\]
    con $r\in{\lbrace0,1\rbrace}^{\ell(n)}$, $s\in{\lbrace0,1\rbrace}^{n}$ elegidos uniformemente.
\end{enumerate}
\end{definition}

\begin{example} 
Sea $G:{\lbrace0,1\rbrace}^{n}\rightarrow{\lbrace0,1\rbrace}^{n+1}$, tal que $G(x)=x||{\mathbin{\bigoplus}}_{i=0}^{n}(x_i)$. ¿Es $G$ un generador pseudoaleatorio?\\
Consideremos el distinguidor $D(y)$ que toma un string de largo $n+1$:
\begin{enumerate}
    \item Calcula $b = {\mathbin{\bigoplus}}_{i=0}^{n-1}(y_i)$
    \item Entrega como output 1 si $b = y_{n}$ y 0 en el caso contrario.
\end{enumerate}
Si le entregamos un string aleatorio $y$ a D, $P[D(r)=1]=\frac{1}{2}$. Por otro lado, si le entregamos un string $y$ generado por $G$, $P[D(G(x))]=1$, ya que por construcción de $G$ siempre se cumplirá la condición ${\mathbin{\bigoplus}}_{i=0}^{n-2}(y_i)= y_{n-1}$. Luego:
\begin{center}
$|P[D(r)=1]-P[D(G(s))=1]|=\frac{1}{2} \gg \mathsf{negl}(n)$
\end{center}
Concluimos entonces que $G$ no es un generador pseudoaleatorio.
\end{example}

Consideremos la cantidad de strings que pueden ser generados por $G$. Un generador pseudoaleatorio  $G:{\lbrace0,1\rbrace}^{n}\rightarrow{\lbrace0,1\rbrace}^{\textit{l}(n)}$, puede generar $2^{n}$ elementos diferentes, mientras que ${\lbrace0,1\rbrace}^{n}$ tiene $2^{\textit{l}(n)}$ elementos. Luego $\Pr[x\in G()]=\frac{2^n}{2^{\ell(n)}}$.
\\
En el caso particular $\ell(x)=2x$, tendremos que $P[x\in G()]=\frac{1}{2^n}$.\\

¿Cómo construir generadores? Lamentablemente, no está demostrado que existan. Sin embargo, la comunidad científica está bastante convencida de su existencia. En particular, si se demuestra la existencia de funciones unidireccionales (funciones fáciles de computar, pero difíciles de invertir), entonces se asegura la existencia de estos generadores. La multiplicación de números primos es un candidato fuerte a ser una función unidireccional.
En la práctica se utilizan algoritmos heurísticos para implementar generadores pseudoaleatorios (RC4 es uno de ellos).

\section{Construcción basada en generadores pseudo-aleatorios}
Sea $G$ un generador pseudoaleatorio con factor de expansión $\ell(n)$. Construiremos un esquema de cifrado de llave privada $\Pi=(\gen,\enc,\dec)$ para mensajes de largo $\ell(n)$ como: 
\begin{itemize}
\item $\gen: \mathsf{input}: 1^n,~\mathsf{output}:~k\sim U_n$ (Uniforme en $n$ bits)

\item $\enc:
 \mathsf{input}: k\in{\lbrace0,1\rbrace}^n, m\in{\lbrace0,1\rbrace}^{\ell(n)},~ \mathsf{output}: c:=G(k)\mathbin{\oplus}m$

\item $\dec: \mathsf{input}: k\in{\lbrace0,1\rbrace}^n, c\in{\lbrace0,1\rbrace}^{\ell(n)},~\mathsf{output}: m:=G(k)\mathbin{\oplus}c$

\end{itemize}

\begin{theorem}
Si $G$ es un generador pseudoaleatorio, entonces la construcción anterior es un esquema de encriptación de llave privada con cifrados computacionalmente indistinguibles.
\end{theorem}
\begin{proof} Suponemos que la construcción no tiene cifrados indistinguibles, esto es, existe un adversario $\calA$, y un polinomio $p(\cdot)$ tales que
\[
\Pr[\Exp^{\texttt{ind}}_{\Pi,A}(n)= \text{``}\calA\text{ gana''}]\geq\frac{1}{p(n)}
\]
$\calA$ puede distinguir entre $G(k)\mathbin{\oplus}m_0$ y $G(k)\mathbin{\oplus}m_1$ con una probabilidad mayor a cualquier función negligible. Consideremos el siguiente distinguidor $\calD$:

\begin{enumerate}
    \item $m_0, m_1\gets\calA(1^n)$.
    \item $b\stackrel{\$}{\gets}\lbrace0,1\rbrace$
    \item $b'\leftarrow\calA(y\mathbin{\oplus}m_b)$
    \item output 1 si $b=b'$ y 0 en otro caso.
\end{enumerate}

Analizamos ahora cómo se comporta  $\calD$ en el caso que $y$ es $G(k)$ para $k\sim U_n$, y en el caso que $y\sim U_{\ell(n)}$
\begin{itemize}

\item CASO 1: $y=G(k)$. Tendremos que 
\[\Pr[D(y)=1]=\Pr[\Exp^{\texttt{ind}}_{\Pi,A}(n)=1] = 1/2 + \frac{1}{p(n)}\]

\item CASO 2: $y\sim U_{\ell(n)}$. Entonces tenemos que $P[D(y)=1]=\frac{1}{2}$. Ya que $y\oplus m_b$ es uniforme y por lo tanto no revela nada sobre $m_b$.

\end{itemize}

Concluimos entonces que $\calD$ distingue con ventaja  $\frac{1}{p(n)}$, lo cual es una contradicción. Por lo tanto el adversario $\calA$ no puede existir y el esquema tiene cifrados computacionalmente indistinguibles.
\end{proof}

\section{Ataques de textos plano elegidos (CPA)}
Consideremos una nueva versión del experimiento de indistinguibilidad. En este nuevo experimento consideramos adversarios que tienen cierta influencia sobre cuales mensajes serán cifrados. Modelamos seguridad en este escenario dándole al adversario  $\calA$ el poder para obtener cifrados correspondientes a textos planos de su elección. Formalmente, $\calA$ tiene acceso a $\enc_k$ como un oráculo o caja negra, lo que espresamos como $\calA^{\enc_k(\cdot)}$.\\

\experiment{\large \underline{$\Exp^{\texttt{ind}}_{\Pi,\calA}(\lambda)$}:}
{Experimento $\Exp^{\texttt{ind-CPA}}_{\Pi,\calA}(\lambda)$}
{fig:expCPA}
{
1. $k\leftarrow \gen(1^{\lambda})$\\
2. $m_0,m_1\leftarrow {\calA(1^{\lambda}}^{\enc_k()})$\\
3. $b \stackrel{\$}{\gets} \{0,1\}$\\
4. $b'\gets {\calA(\enc_k(m_b))}^{\enc_k()}$\\
{\bf output} ``$\calA$ gana'' sii $b' = b$
}
\begin{definition}
Un esquema de encriptación de llave privada $\Pi$ tiene cifrados indistinguibles bajo ataques de texto plano escogido si para todo adversario PPT $\calA$ existe una función negligible $\negl$, tal que:
\[
\Pr[\Exp^{\texttt{ind-CPA}}_{\Pi,\calA}(\lambda)=\text{``A gana'' }]\leq \frac{1}{2}+\negl(\lambda)
\]

\end{definition}

\section{Funciones aleatorias y pseudoaleatorias}
Consideremos el conjunto $\calF_n^m$ de todas las funciones $f:{\lbrace0,1\rbrace}^n\rightarrow{\lbrace0,1\rbrace}^m$. Para describir completamente cada una de ellas necesitamos $2^{n}m$ bits. Luego, tenemos $2^{2^{n}m}$ funciones distintas.\\
Consideremos ahora las funciones $F:{\lbrace0,1\rbrace}^{\lambda}\times{\lbrace0,1\rbrace}^n\rightarrow{\lbrace0,1\rbrace}^m$. Cada llave $k\in{\lbrace0,1\rbrace}^{\lambda}$ define una función, por lo tanto $2^n$ funciones $F_k$ distintas.\\
Diremos que $F$ es pseudoaleatoria si:
\begin{enumerate}
    \item {\bf Eficiencia}. Existe un algoritmo que dado una llave $k$, compute $F(k,x)$ en tiempo polinomial.
    \item {\bf Pseudo-aleatoriedad} Para todo PPT $\calD$, existe una función negligible $negl$, tal que:
    \[
    |\Pr[\calD^{F_k(\cdot)}(1^\lambda)=1]-P[\calD^{f(\cdot)}(1^\lambda)=1]|\leq \negl(\lambda)
    \]
    Donde $f$ es elegida uniformemente en $\calF_n^m$ y $k\sim U_{\lambda}$. 
    El algoritmo distinguidor $\calD$ tiene acceso a un oráculo que puede ser $f$ o $F_k$.
\end{enumerate}

\begin{example}
Sea $F$ una función con llave tal que $F_k(x):=k\oplus x$. ¿Es $F$ una función pseudo-aleatoria?.
No. Un algoritmo distinguidor con oráculo $O(\cdot)$ puede consultar $y_1 = O(x_1), y_2 = O(x_2)$,
para $x_1\neq x_2$. Si $y_1\oplus y_2 = x_1\oplus x_2$ output 1, en otro caso output 0.
Si $O(\cdot)$ es $F_k(\cdot)$, entonces $y_1\oplus y_2 = x_1\oplus x_2$ siempre. En cambio si
$O(\cdot)$ es una función aleatoria, entonces $y_1$ e $y_2$ son independientes de los inputs $x_1$ y $x_2$. Por lo tanto,  $y_1\oplus y_2 = x_1\oplus x_2$ con probabilidad negligible.
\end{example}

\begin{example}
Sea $F:\{0.1\}^n\times \{0,1\}^n\rightarrow \{0,1\}^n$ una función pseudo-aleatoria.
¿Es necesariamente $F':\{0.1\}^n\times \{0,1\}^n\rightarrow \{0,1\}^n$, definida como $F_k'(x) = F_x(k)$,
una función pseudo-aleatoria? No. Puede que exista una llave especifica (por ejemplo $k = 0^n$) para la cual la función $F_k$ no luzca para nada aleatoria. Por ejemplo  $F_0(x) = 0$ para todo input $x$. Sin embargo, la función $F$ sigue siendo pseudo-aleatoria, ya que la llave $0^n$ es elegida con probabilidad negligible $2^{-n}$.
Por lo tanto, un algoritmo distinguidor puede consultar su oráculo con input $0^n$. Si el oráculo es 
$F_k'$, el resultado sería $F_{0^n}(k) = 0^n$.
\end{example}

Es importante notar que la existencia de funciones pseudoaleatorias, implica la existencia de generadores pseudoaleatorios. Se deja como ejercicio propuesto la demostración. $\textit{Hint}:$ Considerar el generador $G(k)=F_k(1)||F_k(2)||...||F_k(n)$.

\section {Construcción esquema CPA via funciones pseudo-aleatorias}
Sea $F$ una función pseudoaleatoria de $\{0,1\}^\lambda$ en $\{0,1\}^n$. Definimos un esquema de encriptación de llave privada para mensajes de largo $n$, como:
\begin{itemize}
\item $\gen$. $\mathsf{input}: 1^\lambda,~\mathsf{output}:~k\sim U_\lambda$ (Uniforme en $n$ bits)

\item $\enc$.
 $\mathsf{input}: k\in{\lbrace0,1\rbrace}^\lambda, m\in{\lbrace0,1\rbrace}^{n},$ elige $r\sim U_\lambda$, $~ \mathsf{output}: \langle r,F_k(r)\mathbin{\oplus}m\rangle$

\item $\dec$. $\mathsf{input}: k\in{\lbrace0,1\rbrace}^n, c=\langle r, s\rangle \in{\lbrace0,1\rbrace}^{n},~\mathsf{output}: m:=F_k(r)\mathbin{\oplus}s$

\end{itemize}

Intuitivamente, el esquema es seguro debido a que si $F$ es pseudo -aleatoria el valor de $s=m\oplus F_k(r)$ es indistinguible de unifome, aún sabiendo $r$. El \'unico problema ocurre cuando el mismo $r$ se usa para 2 mensajes $m_1$, $m_2$, en donde el adversario puede obtener $m_1\oplus m_2$. Sin embargo, $r$ es elegido uniformemente en $2^{\lambda}$ por lo que la probabilidad de que $r$ se repita es negligible en $\lambda$.

\begin{theorem}
Si $F$ es una función pseudoaleatoria, entonces la construcción anterior es un esquema de llave privada y tamaño fijo es CPA seguro. 
\end{theorem}

Recordemos que un esquema es CPA seguro, si tiene cifrados indistinguibles bajo ataques de texto planos elegidos. 

\begin{proof} Probaremos el teorema por contradicción. Supondremos que el esquema construido $\textbf{no}$ es CPA seguro y como consecuencia la función $F$ no es pseudoaleatoria, lo que representa una contradicción.
Si el esquema no es CPA seguro, entonces existe un adversario $\calA$
que ganada el experimento $\Exp^{\texttt{ind-cpa}}$ con probabilidad $1/2 + 1/\poly(\lambda)$. Recordemos que el adversario en este experimento tiene
acceso a un or\'aculo de encriptaci\'on $\enc_k(\cdot)$.
Demostraremos entonces que existe un algoritmo distinguidor $\calD$ con acceso a un or\'aculo $O(\cdot)$ que puede distinguir si $O()$ corresponde a una funci\'on 100\% aleatoria, o si corresponde a la función $F$ con llave aleatoria $k$.

La idea es que el distinguidor $\calD^{O()}$ use al adversario $\calA$ en una simulaci\'on del experimento $\Exp^{\texttt{ind-cpa}}$. Para ello, $\calD$ tiene que proveer a $\calA$ de un or\'aculo de encriptaci\'on. El or\'aculo es simulado por $\calD$ de la siguiente manera. 

$\enc'(m)$: con input $m$, elegimos $r\sim U_\lambda$ y devolvemos $\langle r, m\oplus O(r)\rangle$. 

Si $O()$ es en realidad $F_k$ entonces $\enc'$ es igual a $\enc_k$. En cambio si $O()$ es una función aleatoria entonces
$\enc'$ devuelve \textit{strings} aleatorios (asumiendo que $r$ no se repite). El algoritmo distinguidor ejecuta lo siguiente:

\begin{enumerate}
    \item $m_0,m_1\leftarrow {\calA(1^{n})^{\enc'()}}$
    \item $b \stackrel{\$}{\gets} \{0,1\}$
    \item $b'\gets {\calA(\langle r^*, O(r^*)\mathbin{\oplus}m_b\rangle)}^{\enc'()}$
    \item $\mathsf{output}=1$ si $b=b`$, $O$ en otro caso.
\end{enumerate}
Si $O()$ es $F_k()$, entonces $\calD$ simula exactamente $\Exp^{\texttt{ind-CPA}}_{\Pi,\calA}(n)$.
\begin{center}
$\Pr[D^{F_K()}(1^\lambda)=1]=\Pr[\Exp^{\texttt{ind-CPA}}_{\Pi,\calA}(\lambda)=1]$
\end{center}
El otro caso es que $O()$ es una función aleatoria $f()$. Sea $R$ el evento en el que el valor $r^*$, usado para cifrar $m_b$,  haya sido usado por $\enc'$ en alguna de sus invocaciones.
\begin{align}
\nonumber \Pr[\calD^{f(\cdot)}(1^\lambda)=1] = & \Pr[\calD^{f(\cdot)}(1^\lambda)=1 \wedge R] + \Pr[\calD^{f(\cdot)}(1^\lambda)=1 \wedge \neg R]\\
\nonumber \leq & \Pr[R]+\Pr[\calD^{f(\cdot)}(1^\lambda)=1 | \neg R]\Pr[\neg R]\\
\nonumber \leq & \frac{q(\lambda)}{2^\lambda}+\Pr[\calD^{f(\cdot)}(1^\lambda)=1 | \neg R]\\
\nonumber \leq & \negl(\lambda)+\frac{1}{2}
\end{align}

En donde  $q(\lambda)$ es la cantidad de llamadas al oráculo $\enc'()$ realizadas por $\calA$. Debido a que $\calA$ corre en tiempo polinomial, $q(\lambda)\leq \mathsf{TIME}(\calA)\leq \poly(\lambda)$.\\

\noindent Consideremos finalmente la expresión 
\[
|\Pr[\calD^{F_k()}(1^\lambda)=1]-\Pr[\calD^{f()}(1^\lambda)=1]|\leq \negl(\lambda)
\]
Donde $k\sim U$, $f$ uniforme en $\calF:$ conjunto de todas las funciones posibles.\\

\noindent Si $\Pi$ no es seguro $\Pr[\calD^{F_k()}(1^\lambda)=1]\geq\frac{1}{2}+\poly(\lambda)$, $\calD$ distingue con ventaja y luego
\[
\Pr[\calD^{F_k()}(1^\lambda)=1]-\Pr[\calD^{f()}(1^\lambda)=1]|=|(\frac{1}{2}+\poly(\lambda))-(\frac{1}{2}+\frac{q(\lambda)}{2^\lambda})|=\poly(\lambda)
\]
Y lo anterior implica que $F$ no es una función pseudoaleatoria, lo que es una contradicción.
\end{proof}
\end{document} 