+
    .S‘jà  ã                   ó0  € ^ RI t ^ RIt^ RIt^ RItR tR tR tR tR tR t	R t
R	 tR
 tR tR tR t]R8X  d[   ]! ^4      w  ttt]! R]4       ]! R]4       ]! R]4       Rt]! R]4       ]! ]]]4      t]! R]4       ]! ]]]4      t]! R]4       R# R# )é    Nc                 óª   € \        V 4      p\        W1V4      p\        P                  ! \	        V4      P                  4       4      P                  4       pV# ©N)Útext_to_numberÚencryptÚbase64Ú	b64encodeÚstrÚencodeÚdecode)Ú	plaintextÚexponentÚmodulusÚnumberÚ	encryptedÚencodeds   &&&   ÚJL:/Gymer/teach/teaching/docs/other/cryptanalysis/4-libs/6-rsa/files/rsa.pyÚencrypt_textr      sC   € Ü˜IÓ&€FÜ˜¨'Ó2€IÜ×Òœs 9›~×4Ñ4Ó6Ó7×>Ñ>Ó@€Gà€Nó    c                 ó@   € W8”  d   \        R 4      h\        WV4      pV# ©zError: Message too long!©Ú	ExceptionÚpow)Úmessager   r   r   s   &&& r   r   r      ó&   € ØÔÜÐ2Ó3Ð3ä�G wÓ/€IàÐr   c                 ón   € \        \        P                  ! V 4      4      p\        W1V4      p\	        V4      # r   )Úintr   Ú	b64decodeÚdecryptÚnumber_to_text)Ú
ciphertextr   r   r   Ú	decrypteds   &&&  r   Údecrypt_textr#      s.   € Ü”×!Ò! *Ó-Ó.€FÜ˜¨'Ó2€Iä˜)Ó$Ð$r   c                 ó@   € W8”  d   \        R 4      h\        WV4      pV# r   r   )r   r   r   r"   s   &&& r   r   r      r   r   c                 ón  € \        V 4      p\        V 4      pW,          pV^,
          V^,
          ,          pTp\        WE4      '       g   \        P                  ! ^V4      pK*  \        P
                  ^ ,          ^8X  d+   \        P
                  ^,          ^8”  d   \        VRV4      pM\        WT4      pWVV3# )é   éÿÿÿÿ)Úgenerate_primeÚis_coprime_toÚrandomÚ	randrangeÚsysÚversion_infor   Úmodinv)Ú
num_digitsÚpÚqÚnÚphi_nÚeÚds   &      r   Úgenerate_keypairr6   (   s™   € Ü�zÓ"€AÜ�zÓ"€AØ	�€AØ��U�q˜1•uÕ€Eà€AÜ˜E×%Ò%Ü×Ò˜Q Ó&Šô ×Ñ˜Õ˜aÔ¤C×$4Ñ$4°QÕ$7¸!Ô$;Ü��2�uÓ‰ä�1Óˆà�ˆ7€Nr   c                 ó4   € \         P                  ! W4      ^8H  # )r&   )ÚmathÚgcd)ÚaÚbs   &&r   r)   r)   ;   s   € Ü�8Š8�A‹>˜QÑÐr   c                 óÄ   € \         P                  ! ^
V ^,
          ,          ^
V ,          4      pV^,          ^ 8X  d
   V^,           p\        V4      '       g   V^,           pK  V# )é
   )r*   r+   Úis_prime)r/   Úrs   & r   r(   r(   ?   sL   € Ü×Ò˜˜j¨1�nÕ-¨r°:­~Ó>€AØˆ1…u�„zØ��Eˆä�q�kŠkØ��EŠà€Hr   c                 óÈ   € V ^8”  d[   V ^,          ^ 8X  d   R# \        ^\        \        P                  ! V 4      4      ^,           ^4       F  pW,          ^ 8X  g   K   R# 	  R# R# )r&   FT)Úranger   r8   Úsqrt)r2   Úis   & r   r>   r>   J   sP   € Øˆ1„uØˆq�5�AŒ:Ùä�qœ#œdŸiši¨›lÓ+¨aÕ/°Ö3ˆAØ�u˜ŽzÚñ 4ñ ár   c                 óN   € ^ pV  F  pVR,          \        V4      ,           pK  	  V# )r   éè  )Úord)Útextr   Úcs   &  r   r   r   X   s*   € Ø€FãˆØ˜•œs 1›vÕ%Šñ ð €Mr   c                 ód   € R pV ^ 8”  d'   V R,          p\        V4      V,           pV R,          p K-  V# )Ú rE   )Úchr)r   rG   Ú	remainders   &  r   r    r    a   s3   € Ø€Dà
�1Œ*Ø˜T•Mˆ	Ü�9‹~ Õ$ˆØ˜4•Šà€Kr   c                 ót   € V ^ 8X  d   V^ ^3# \        W,          V 4      w  r#pW$W,          V,          ,
          V3# )r   )Úegcd)r:   r;   ÚgÚyÚxs   &&   r   rN   rN   m   s<   € ØˆA„vØ�1�aˆyÐä�q•u˜a“.‰ˆˆaØ˜� !•|Õ# QÐ'Ð'r   c                 óR   € \        W4      w  r#pV^8w  d   \        R4      hW1,          # )r&   zmodular inverse does not exist)rN   r   )r:   ÚmrO   rQ   rP   s   &&   r   r.   r.   u   s)   € Ü�1‹j�G€Aˆ!ØˆA„vÜÐ8Ó9Ð9à�uˆr   Ú__main__ze =zd =zn =z
HALLO WELTzplaintext =zciphertext =zdecrypted =)r8   r*   r   r,   r   r   r#   r   r6   r)   r(   r>   r   r    rN   r.   Ú__name__Úpublic_exponentÚprivate_exponentr   Úprintr   r!   r"   © r   r   Ú<module>rZ      sÍ   ðÛ Û Û Û 
òòò%òòò&òòòòò(òð ˆzÔÙ1AÀ"Ó1EÑ.€OÐ% wÙ	ˆ%�Ô!Ù	ˆ%Ð!Ô"Ù	ˆ%�Ôà€IÙ	ˆ-˜Ô#Ù˜i¨¸'ÓB€JÙ	ˆ.˜*Ô%Ù˜ZÐ)9¸7ÓC€IÙ	ˆ-˜Ö#ñ r   