o
    *ήc3M                     @   s  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZAmBZB d dlCmDZD d dlEmFZFmGZG d dlHmIZI dd	 ZJd
d ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUd d! ZVd"d# ZWd$d% ZXd&d' ZYd(d) ZZd*d+ Z[d,d- Z\d.d/ Z]d0d1 Z^d2d3 Z_d4d5 Z`d6d7 Zad8d9 Zbd:d; Zcd<d= Zdd>d? Zed@dA ZfdBdC ZgdDdE ZhdFdG ZidHdI ZjdJdK ZkdLdM ZldNdO ZmdPdQ ZndRdS ZodTdU ZpdVdW ZqdXdY ZrdZd[ Zsd\d] Ztd^d_ Zud`da Zvdbdc Zwddde Zxdfdg Zydhdi Zzdjdk Z{dldm Z|dnS )o    symbols);
cycle_listencipher_shiftencipher_affineencipher_substitutioncheck_and_joinencipher_vigeneredecipher_vigenereencipher_hilldecipher_hillencipher_bifid5encipher_bifid6bifid5_squarebifid6_squarebifid5bifid6decipher_bifid5decipher_bifid6encipher_kid_rsadecipher_kid_rsakid_rsa_private_keykid_rsa_public_keydecipher_rsarsa_private_keyrsa_public_keyencipher_rsalfsr_connection_polynomiallfsr_autocorrelationlfsr_sequenceencode_morsedecode_morseelgamal_private_keyelgamal_public_keyencipher_elgamaldecipher_elgamaldh_private_keydh_public_keydh_shared_keydecipher_shiftdecipher_affineencipher_bifiddecipher_bifidbifid_square
padded_keyuniqdecipher_gmencipher_gmgm_public_keygm_private_keyencipher_bgdecipher_bgbg_private_keybg_public_keyencipher_rot13decipher_rot13encipher_atbashdecipher_atbashNonInvertibleCipherWarningencipher_railfencedecipher_railfence)Matrix)isprimeis_primitive_root)FF)raiseswarns)	randrangec                   C   s:   t dddks	J t dddksJ t dddksJ d S )Nhello world   hlowrdel ol   horel ollwd   hwe olordll)r=    rM   rM   E/tmp/pip-target-vg8gfxp4/lib/python/sympy/crypto/tests/test_crypto.pytest_encipher_railfence      rO   c                   C   s:   t dddks	J t dddksJ t dddksJ d S )NrH   rG   rF   rJ   rI   rL   rK   )r>   rM   rM   rM   rN   test_decipher_railfence    rP   rQ   c                   C   sF   t ddg dksJ t ddg dksJ t ddg dks!J d S )NrI   rK   )rI   r      rG   rR   )rR   rG   rI   r   )r   rM   rM   rM   rN   test_cycle_list&      rT   c                   C   sL   t dddks	J t dddksJ t dddksJ tdddks$J d S )NABCr   rR   BCDrS   ZAB)r   r)   rM   rM   rM   rN   test_encipher_shift,      rY   c                   C   D   t ddksJ t ddksJ tddksJ tddks J d S )NrV   NOP)r8   r9   rM   rM   rM   rN   test_encipher_rot132      r]   c                   C   s   t dddks	J t dddksJ t dddksJ t dddd	d
ks&J t dddd	dks1J t dddks:J tdddksCJ d S )NrV   )rR   r   )rR   rR   rW   )rS   r   AZY)rS   rR   ABCDr   BAD1231234214)rI      QTW)r   r*   rM   rM   rM   rN   test_encipher_affine9   s   rg   c                   C   r[   )NrV   ZYX)r:   r;   rM   rM   rM   rN   test_encipher_atbashB   r^   ri   c                   C   s,   t ddddks
J t ddddksJ d S )NrV   BACrb   1243rc   124)r   rM   rM   rM   rN   test_encipher_substitutionH   s   rm   c                   C   s`   t ddksJ t tddksJ t d dksJ t dddddks'J ttdd  d S )	Nabcaaabczab caT)filterc                   S   
   t ddS )Nabrp   )r   rM   rM   rM   rN   <lambda>R      
 z%test_check_and_join.<locals>.<lambda>)r   r/   splitrC   
ValueErrorrM   rM   rM   rN   test_check_and_joinM   s
   rx   c                   C   sn   t dddks	J t dddddksJ t dddddksJ t dddddks*J t d	dddd	ks5J d S )
NrV   ACEr`   r   ACAABACCACA)r	   rM   rM   rM   rN   test_encipher_vigenereU   
   r   c                   C   sn   t dddks	J t dddddksJ t dddddksJ t dddddks*J t dddddks5J d S )	NrV   AAAr`   r   r{   AACAAr~   )r
   rM   rM   rM   rN   test_decipher_vigenere]   r   r   c                  C   s   t ddg d} td| dksJ t ddg d} td| dks"J td| dddks-J t ddg d} td| dddks@J td| ddd	ksKJ td
| dksTJ td
| dddks_J d S )NrG   rR   rG   rI      r`   CFIVrR   r   r   rR   r   CBABr{   CBABACFGCZ)padCFYV)r?   r   r~   rM   rM   rN   test_encipher_hille   s   r   c                  C   s   t ddg d} td| dksJ t ddg d} td| dks"J td| dddks-J t ddg d} td| dddks@J td| ddd	ksKJ td
| dksTJ d S )NrG   r   r   r`   r   r   r   r   r{   CFAABAA)r?   r   r   rM   rM   rN   test_decipher_hillt   s   r   c                   C   L   t dddks	J t dddksJ t dddksJ t ddd	ks$J d S )
Nr{   CDCOrs   cCHa bcbrj   )r   rM   rM   rM   rN   test_encipher_bifid5   rZ   r   c                     0   t   fdd} tdd| }td|ksJ d S )Nc                       t  d|  |  S )Nr   r   ijr   rM   rN   rt          z$test_bifid5_square.<locals>.<lambda>r    )r   r?   r   fMrM   r   rN   test_bifid5_square      r   c                   C   L   t dddks	J t dddksJ t dddksJ t dddks$J d S )	Nr{   r   r   chr   b acr   rV   )r   rM   rM   rM   rN   test_decipher_bifid5   rZ   r   c                   C   r   )
Nr{   r   CPrs   r   CIr   r   rj   )r   rM   rM   rM   rN   test_encipher_bifid6   rZ   r   c                   C   r   )	Nr{   r   r   cir   r   r   rV   )r   rM   rM   rM   rN   test_decipher_bifid6   rZ   r   c                     r   )Nc                    r   )N   r   r   r   rM   rN   rt      r   z$test_bifid6_square.<locals>.<lambda>r   r   )r   r?   r   r   rM   r   rN   test_bifid6_square   r   r   c                   C   s~   t ddddks
J t ddddksJ tt t ddddks#J t dddd	u s-J W d    d S 1 s8w   Y  d S )
NrG   rI   rR   r   rR   r      rI   rK   rR      F)r   rD   r<   rM   rM   rM   rN   test_rsa_public_key   s   
"r   c                   C   s   t ddddks
J t ddddksJ t dddd	ksJ tt t dddd
ks-J t ddddu s7J W d    d S 1 sBw   Y  d S )NrG   rI   rR   r   r   r         )i  i  r   r   F)r   rD   r<   rM   rM   rM   rN   test_rsa_private_key   s   
"r   c                  C   s\   t d} t d}t d}t d}t| ||| | |fksJ t| ||| | |fks,J d S )NN101565610013301240713207239558950144682174355406589305284428666903702505233009M8946871918875454889354556059559484138123760030531435214292421331206929398400365537ښ8936505818327042395303988587447591295947962354408444794561435666999402846577625762582824202269399672579058991442587406384754958587400493169361356902030209)intr   r   )pqedrM   rM   rN   test_rsa_large_key   s    r   c                  C   s   t ddd} td| dksJ t ddd} td| dksJ tt t ddd} td| dks2J W d    d S 1 s=w   Y  d S NrG   rI   rR   r   r   )r   r   rD   r<   )pukrM   rM   rN   test_encipher_rsa      
"r   c                  C   s   t ddd} td| dksJ t ddd} td| dksJ tt t ddd} td| dks2J W d    d S 1 s=w   Y  d S r   )r   r   rD   r<   )prkrM   rM   rN   test_decipher_rsa   r   r   c            	      C   s0  t ddddddd} tddddddd}| dksJ |dks J d	}td| d
 | }|dks1J t||d
 d }||ks@J t ddddd}tddddd}t ddddd}tddddd}|dksfJ |dkslJ |dksrJ |dksxJ d}tt|||}|dksJ tt|||}||ksJ d S )NrG   rI   r            )Nu  r   )r   i7  
   r   iF  5   )   +   /   a   )C r   )r   i| )r   r   )r   i! i!0  i )r   r   r   r   )	r   r   msg	encrypted	decryptedpuk1prk1puk2prk2rM   rM   rN   !test_mutltiprime_rsa_full_example   s,   r   c               	   C   s   t d} t d}t d}t d}t d}d}t| |||||}t| |||||}d}t||}	t||| ||||g}
|	|
ks@J t|	|t|	|| ||||gksRJ d S )N5  1017715760715424506802386150369308212090648714372506228340650154082258226204046999838297167140821364638180697194879500245557654451869628933464638414194270088003412574686002240499862604719225724816301446884172547691863941572670973607781363296129091102564212329778330286774412060493092203547960143766983251016934  287523423530951328722901815266072758861827932416608050778508017568951279775428697295227355312818186183057683628973866874525034028199691128870676414118458442900035778874482624765513861643279666963168221883983361990023065887039028941004761868238495951032394105272796054421482858161493686670831148028528049768935  1769822925986882577687950073635018683885096193595631013437826189771862186717463067541369694816245225291921138038800171125596073154495219811570843701878876506240610330660224585129424118411874789378997231527716008508616411987953604187533538484482056602874796176717264080533196198920520008508839943433788827178494  689254284385854310292691822335026110270917550646437423835156236432131058289689339552936707494280835318713879442274571841964528291231865157212604266903677599180789896916456120289112752835985022658896697303316882068252200747139776074151787380158310303642905853691505028197438273435520981970955205508653601594394  69035483433453632820551311892368908779778144568711455301541094314870476423226953576968609257479231896350331830698238209105217117290910679774888326149322416241405010692044244589681980660015448444826108008217972129130625571421904893252804729877353352739420480574842850202181462656251626522910618936534699566291i  i  )r   r   r   r   r   )r   r   rstr   r   r   	plaintextciphertext_1ciphertext_2rM   rM   rN   test_rsa_crt_extreme  s2   
r   c               
   C   s   d\} }d}t | ||dd}t| ||dd}t|d D ]$}t||}t||}z||ks/J W q ty@   td|||w d S )N)=   r      
Carmichael)totientr   RThe RSA is not correctly decrypted (Original : {}, Encrypted : {}, Decrypted : {})r   r   ranger   r   AssertionErrorformat)r   r   r   r   r   r   r   r   rM   rM   rN   test_rsa_exhaustive6  s    


r   c            	   
   C   s   g d} d}| |g }t |ddi}t|ddi}|d }t|D ]$}t||}t||}z||ks4J W q! tyE   td|||w d S )N)rI   r   r   r   r   r   r   r   r   r   )	primesr   argsr   r   nr   r   r   rM   rM   rN   test_rsa_multiprime_exhanstiveI  s$   



r   c            
   
   C   s   ddl m}  g d}d}||g }t|ddi}t|ddi}|d }t|D ],}| ||dkr1q't||}t||}	z|	|ksBJ W q' tyS   td|||	w d S )	Nr   )igcd)r   r   r   r   
multipowerTrR   r   )	sympy.core.numbersr   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   rM   rM   rN   test_rsa_multipower_exhanstive^  s*   



r   c                   C   F   t dddddksJ t dddddksJ t dddddks!J d S )NrR   rG   r   rG   r   rI   r   rG   )r   rM   rM   rM   rN   test_kid_rsa_public_keyw  rU   r  c                   C   r   )NrR   rG   r   rI   r   r   rK   )r   rM   rM   rM   rN   test_kid_rsa_private_key}  rU   r  c                   C   s:   t dddks	J t dddksJ t dddksJ d S )NrR   r   rG   r   rI   r  )r   rM   rM   rM   rN   test_encipher_kid_rsa  rP   r  c                   C   s:   t dddks	J t dddksJ t dddksJ d S )NrG   r  rR   rI   r   r  )r   rM   rM   rM   rN   test_decipher_kid_rsa  rP   r  c                   C   s   t ddksJ t ddksJ t ddksJ t ddks J t ddks(J t dd	d
dks2J t ddd
dks<J t ddksDJ t ddksLJ t ddksTJ d S )NrV   z.-|-...|-.-.zSMS z...|--|...||zSMS
r    z||`)sepz``z````z!@#$%^&*()_+z/-.-.--|.--.-.|...-..-|-.--.|-.--.-|..--.-|.-.-.12345z.----|..---|...--|....-|.....67890z-....|--...|---..|----.|-----)r    rM   rM   rM   rN   test_encode_morse  s   r  c                   C   s2   t ddksJ t ddksJ ttdd  d S )Nz
-.-|.|-.--KEYz.-.|..-|-.||RUNc                   S      t dS )Nz	.....----)r!   rM   rM   rM   rN   rt         z#test_decode_morse.<locals>.<lambda>)r!   rC   KeyErrorrM   rM   rM   rN   test_decode_morse  s   r  c                  C   s  t tdd  t tdd  td} t| dg| dgd| d| dgks(J t| dg| dgd| d| dgks>J td} t| dg| dgd| d| dgksXJ t| dg| dgd| d| dgksnJ t| dg| dgd| d| dgksJ d S )Nc                   S   s   t ddgdS NrR   r   rM   rM   rM   rN   rt         z$test_lfsr_sequence.<locals>.<lambda>c                   S   s   t dgddS r  r  rM   rM   rM   rN   rt     r  rG   rR   r   rI   )rC   	TypeErrorrB   r   )FrM   rM   rN   test_lfsr_sequence  s   ,,,,0r  c                  C   sf   t tdd  td} t| d| dg| d| dgd}t|dddks'J t|dddks1J d S )Nc                   S      t dddS )NrR   rG   rI   )r   rM   rM   rM   rN   rt         z+test_lfsr_autocorrelation.<locals>.<lambda>rG   rR   r   r   rS   )rC   r  rB   r   r   )r  r   rM   rM   rN   test_lfsr_autocorrelation  s
   $r  c                  C   s   t d} td}t| d| dg| d| dgd}t||d d ks&J t| d| dg| d| dgd}t||d | d ksFJ d S )NrG   xrR   r   r   )rB   r   r   r   )r  r  r   rM   rM   rN   test_lfsr_connection_polynomial  s   $$ r  c                  C   B   t dd\} }}t| sJ t|| sJ tt| dksJ d S Nd   digitf   )r"   r@   rA   lenbin)rp   r   _rM   rM   rN   test_elgamal_private_key     r(  c                     sb   t dt} | d   d tt d | ksJ tt fdd ttfdd d S )Nr   r   rR   c                      s
   t  S )Nr$   rM   PdkrM   rN   rt     ru   ztest_elgamal.<locals>.<lambda>c                      s
   t d S )NrS   r*  rM   )r-  rM   rN   rt     ru   )r"   r#   r%   r$   rC   rw   )ekrM   r+  rN   test_elgamal  s    r/  c                  C   r  r   )r&   r@   rA   r%  r&  )r   gr'  rM   rM   rN   test_dh_private_key  r)  r1  c                  C   sT   t dd\} }}t| ||f\}}}| |ksJ ||ksJ |t||| ks(J d S )Nr!  r"  )r&   r'   pow)p1g1rp   p2g2garM   rM   rN   test_dh_public_key  s
   r8  c                  C   sX   t dd} t| \}}}td|}t|||f|}|t|||ks#J ttdd  d S )Nr!  r"  rG   c                   S   rr   )N)i     i5  i  )r(   rM   rM   rM   rN   rt     ru   z$test_dh_shared_key.<locals>.<lambda>)r&   r'   rE   r(   r2  rC   rw   )r   r   r'  r7  r   skrM   rM   rN   test_dh_shared_key  s   

r;  c                   C   s2   t dddks	J ttdd  ttdd  d S )Nr   rs   bac                   S   rr   )Nrs   acer.   rM   rM   rM   rN   rt     ru   z!test_padded_key.<locals>.<lambda>c                   S   rr   )Nrs   abbar>  rM   rM   rM   rN   rt     ru   )r.   rC   rw   rM   rM   rM   rN   test_padded_key  s   r@  c                   C   s~   t tdd  tddddksJ t tdd  tddddks"J t tdd  td	td
ks3J tdtdks=J d S )Nc                   S   r  )Nrn   r   abcde)r+   rM   rM   rM   rN   rt     r  ztest_bifid.<locals>.<lambda>rn   r   abcdbdbc                   S   r  )NrC  r   rA  )r,   rM   rM   rM   rN   rt     r  c                   S   r  )NrA  )r-   rM   rM   rM   rN   rt     r  BBACDEFGHIKLMNOPQRSTUVWXYZB0$B0ACDEFGHIJKLMNOPQRSTUVWXYZ123456789)rC   rw   r+   r   r   rM   rM   rM   rN   
test_bifid  s   rH  c            
      C   sn   g d} g d}g d}t | |D ]#\}}t||}|D ]}t||}t||}t||}	|	|ks3J qqd S )N)                                             )Y   r   e   g   k   m   q      rI  rJ  rK  rL  rM  rN  r   )r   iW  i  i9     iS( i    i  i  i+ i  iH  )zipr3   r2   r1   r0   
psqsmessagesr   r   prir   pubencdecrM   rM   rN   test_encipher_decipher_gm  s   



rj  c                   C   .   t tdd  t tdd  t tdd  d S )Nc                   S   rr   )Nr   r   r2   rM   rM   rM   rN   rt     ru   z%test_gm_private_key.<locals>.<lambda>c                   S   
   t ddS )Nr   rl  rM   rM   rM   rN   rt     ru   c                   S   rr   )Nr   r   rl  rM   rM   rM   rN   rt     ru   )rC   rw   r2   rM   rM   rM   rN   test_gm_private_key     rn  c                   C   s>   dt ddd ksJ dt ddd ksJ ttdd	  d S )
NiC  r      rR   r   rI   r   c                   S   rr   )Nr   rp  rl  rM   rM   rM   rN   rt     ru   z$test_gm_public_key.<locals>.<lambda>)r2   rC   rw   rM   rM   rM   rN   test_gm_public_key  s   rq  c            
      C   sr   g d} g d }}g d}t | |D ]#\}}t||}|D ]}t||}t||}t||}	|	|ks5J qqd S )N)C   r   G   rZ  r   r   r[  r   O   rp  S   r   ;   r^     )r   rs  rZ  r   r   r[  r   rt  rp  ru  r   rv  r^  rw  rr  )r   iH  iW     r_  i  i  r`  i[  i  i  ij     )ra  r6   r7   r4   r5   rb  rM   rM   rN   test_encipher_decipher_bg  s   



rz  c                   C   rk  )Nc                   S   rr   )Nr   re   r6   rM   rM   rM   rN   rt   *  ru   z%test_bg_private_key.<locals>.<lambda>c                   S   rm  )Nr   r{  rM   rM   rM   rN   rt   +  ru   c                   S   rr   Nr   r   r{  rM   rM   rM   rN   rt   ,  ru   )rC   rw   r6   rM   rM   rM   rN   test_bg_private_key)  ro  r}  c                   C   s6   dt ddks	J dt ddksJ ttdd  d S )	Ni  rr  rt  i  r   rw  c                   S   rr   r|  r{  rM   rM   rM   rN   rt   2  ru   z$test_bg_public_key.<locals>.<lambda>)r7   rC   rw   rM   rM   rM   rN   test_bg_public_key/  s   r~  N)}
sympy.corer   sympy.crypto.cryptor   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   sympy.matricesr?   sympy.ntheoryr@   rA   sympy.polys.domainsrB   sympy.testing.pytestrC   rD   sympy.core.randomrE   rO   rQ   rT   rY   r]   rg   ri   rm   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r(  r/  r1  r8  r;  r@  rH  rj  rn  rq  rz  r}  r~  rM   rM   rM   rN   <module>   st    		
!2			