
암호화 공격 및 유틸리티의 Python 구현.
암호화 공격 및 유틸리티의 Python 구현입니다.
다음 명령어로 SageMath Python 버전을 확인할 수 있습니다:``` $ sage -python --version Python 3.9.0
SageMath Python 버전이 3.9.0보다 오래된 경우 일부 스크립트의 일부 기능이 작동하지 않을 수 있습니다.
## 사용법
단위 테스트는 `test` 디렉터리에 있으며, `unittest` 모듈이나 `pytest`를 사용하여 실행할 수 있습니다. 오래 걸리지 않으며, 시스템에 따라 몇 분 정도 걸릴 수 있습니다.
특정 공격을 실행하려면 코드를 실행하기 전에 해당 파일에 코드를 추가해야 합니다.
### 예제
예를 들어, Boneh-Durfee 공격을 사용해 RSA를 공격하고자 하며, 다음 매개변수는 [test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py)에서 가져온 것입니다:```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
다음 코드를 boneh_durfee.py 파일의 맨 아래에 추가합니다:```python import logging
logging.basicConfig(level=logging.DEBUG)
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249 e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511 p_bits = 512 delta = 0.26
p, q = attack(N, e, p_bits, delta=delta, m=3) assert p * q == N print(f"Found {p = } and {q = }")
그런 다음 Sage를 사용하여 해당 파일을 그냥 실행하면 됩니다. 어디에서 실행하든 상관없습니다. Python 경로는 자동으로 설정됩니다(다른 Python 파일에서 공격을 호출할 수도 있지만, 그러면 Python 경로를 직접 수정해야 합니다):```commandline
[crypto-attacks]$ sage -python attacks/rsa/boneh_durfee.py
INFO:root:Trying m = 3, t = 1...
DEBUG:root:Generating shifts...
DEBUG:root:Creating a lattice with 11 shifts (order = 'invlex', sort_shifts_reverse = False, sort_monomials_reverse = False)...
DEBUG:root:Reducing a 11 x 11 lattice...
DEBUG:root:Reconstructing polynomials (divide_original = True, modulus_bound = False, divide_gcd = True)...
DEBUG:root:Polynomial at row 8 is constant, ignoring...
DEBUG:root:Reconstructed polynomial has gcd 1312232632720549890113031660369306919929075823824696839212183146130434668203517349691252841557097914064120078389640402109017308806168467714230057403815071456395553717020189622129706447677967264344568789118172311850383406340547579993263937406518074980025897726255316031512238322022839331135299265704052474541497687419350763703993630899191179705015113329644753599872380152055902238937889027950089072598069861391599563222633064848996619752054685734260976071760984100109990150069201501748622288840900421607423175114026653242500476408861976142751384898489130281755466581359057847077651502734556259387442296763474369957121 with polynomial at 8, dividing...
DEBUG:root:Reconstructed 10 polynomials
DEBUG:root:Computing pairwise gcds to find trivial roots...
DEBUG:root:Using Groebner basis method to find roots...
DEBUG:root:Sequence length: 10, Groebner basis length: 1
DEBUG:root:Sequence length: 9, Groebner basis length: 1
DEBUG:root:Sequence length: 8, Groebner basis length: 1
DEBUG:root:Sequence length: 7, Groebner basis length: 2
DEBUG:root:Found Groebner basis with length 2, trying to find roots...
Found p = 7866790440964395011005623971351568677139336343167390105188826934257986271072664643571727955882500173182140478082778193338086048035817634545367411924942763 and q = 11227048386374621771175649743442169526805922745751610531569607663416378302561807690656370394330458335919244239976798600743588701676542461805061598571009923
출력 로그에 표시된 m 및 t 매개변수는 특별히 주의를 기울일 필요가 있습니다. 이 매개변수들은 격자 기반(작은 근) 알고리즘에서 격자 크기를 조정하는 데 사용됩니다. 개념적으로 m(때로는 k라고도 함)과 t는 격자에 사용되는 "시프트"의 수를 나타내며, 이는 대략 행 수와 같거나 비례합니다. 따라서 m과 t를 늘리면 격자의 크기가 커지고, 이는 격자 축소(현재 LLL 사용)를 수행하는 데 필요한 시간도 증가시킵니다. 반면에 m과 t가 너무 낮으면 격자 축소가 적절한 벡터를 생성하지 못할 수 있어 축소에 소요된 시간이 낭비될 수 있습니다. 따라서 이는 일종의 트레이드오프입니다.
현재 프로젝트 버전에서는 m이 항상 사용자에 의해 제공되어야 합니다(기본값은 1로 설정됨). t는 경우에 따라 공격에 사용된 특정 작은 근 방법에 기반하여 계산될 수 있습니다. 그러나 여전히 사용자가 조정할 수 있습니다. 일반적으로 이러한 종류의 매개변수를 사용하는 두 가지 방법이 있습니다:
m = 1에서 시작하여 답을 찾을 때까지 반복하는 루프를 구현합니다(아래 예제 참조). 이는 간단한 접근 방식이지만, 너무 작은 격자로 무의미한 계산에 시간을 낭비할 위험이 있습니다.```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1* 사용하려는 공격의 디버그 버전을 구현하고(결과를 알고 있는 상태에서) 좋은 격자 벡터를 생성하는 `m` 값을 결정하세요. 그런 다음 올바른 `m` 값으로 공격 메서드를 직접 호출하세요.
## 구현된 공격
### 근사 공통 약수
* [x] [다변수 다항식 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [직교 기반 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [동시 디오판토스 근사 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [비트 플리핑 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [IV 복구 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [패딩 오라클 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)
### CBC + CBC-MAC
* [x] [키 재사용 공격 (encrypt-and-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/eam_key_reuse.py)
* [x] [키 재사용 공격 (encrypt-then-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/etm_key_reuse.py)
* [x] [키 재사용 공격 (MAC-then-encrypt)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/mte_key_reuse.py)
### CBC-MAC
* [x] [길이 확장 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_mac/length_extension.py)
### CTR
* [x] [비트 플리핑 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ctr/bit_flipping.py)
* [x] [CRIME 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ctr/crime.py)
* [x] [구분자 오라클 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ctr/separator_oracle.py)
### ECB
* [x] [평문 복구 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecb/plaintext_recovery.py)
* [x] [평문 복구 공격 (더 어려운 변형)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecb/plaintext_recovery_harder.py)
* [x] [평문 복구 공격 (가장 어려운 변형)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecb/plaintext_recovery_hardest.py)
### 타원 곡선 암호
* [x] [ECDSA nonce 재사용 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/ecdsa_nonce_reuse.py)
* [x] [Frey-Ruck 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/frey_ruck_attack.py) [^ecc_frey_ruck_attack]
* [x] [MOV 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/mov_attack.py) [^ecc_mov_attack]
* [x] [매개변수 복구](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/parameter_recovery.py)
* [x] [특이 곡선 공격](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/singular_curve.py)
* [x] [Smart 공격 (확장체 위의 곡선)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/smart_attack.py) [^ecc_smart_attack1] [^ecc_smart_attack2]