M8(암호화기)
M8 (cipher)일반 | |
---|---|
디자이너 | 히타치 |
초판 | 1999 |
유래 | M6 |
암호 상세 | |
블록 크기 | 64비트 |
구조. | 파이스텔 네트워크 |
라운드 | 변수 |
암호학에서 M8은 1999년에 히타치가 설계한 블록 암호입니다.이는 Hitachi의 초기 M6 알고리즘을 수정한 것으로, 하드웨어 및 32비트 소프트웨어 구현 모두에서 보안과 고성능을 향상시키도록 설계되었습니다.M8은 1999년 3월에 히타치에 의해 ISO/IEC 9979-0020으로 [1]등록되었습니다.
M6와 마찬가지로 M8은 블록사이즈가 64비트인 Feistel 암호입니다.라운드 함수에는 32비트 회전, XOR 및 모듈러 추가를 포함할 수 있으므로 ARX 암호의 초기 예가 됩니다.
이 암호는 가변 라운드 수(임의의 양의 정수 N)를 특징으로 하며, 각 라운드는 라운드 고유의 "알고리즘 결정 키"에 의해 결정되는 구조를 가집니다.라운드를 키에 의존시키는 것은 암호 해독을 더욱 어렵게 하기 위한 것입니다(같은 설계 철학에 대해서는 FROG 참조).
암호 설명
라운드 카운트는 임의의 양의 정수 N으로 설정할 수 있지만 라운드 카운트를 10 이상 사용하는 것이 좋습니다.키는 64비트 데이터 키, 256비트 키 확장 키, N개의 24비트 알고리즘 결정 키 세트 및 N개의 96비트 알고리즘 확장 키 세트의 4개의 컴포넌트로 구성됩니다.
라운드 함수는 키 확장 및 암호화/복호화 모두에 사용됩니다.키 확장 프로세스는 64비트 데이터 키와 256비트 키 확장 키를 256비트 실행 키로 변환합니다.이 키는 R 0 L R, K 3(\의 4쌍으로 구성됩니다. ...,
이 암호는 전형적인 Feistel 암호 설계입니다.우선 64비트 입력 블록을 2개의 32비트 반으로 분할한다.각 라운드에서 왼쪽 절반은 키에 의존하는 변환을 거쳐 오른쪽 절반과 결합됩니다.마지막으로 절반만 교환됩니다.라운드 함수는 총 9개의 사용자 지정 가능한 연산과 3개의 비트 회전 시퀀스로 구성됩니다.
i는 라운드 번호입니다. 숫자는 입력(\L_{ 및 (\R_ \ \입니다 . 4, 4 { 는 실행 키의 단어입니다. << < \ style < <>는 왼쪽 비트 회전수를 나타냅니다. j\ 및 k \{k는 24비트 결정 키에 의해 다음과 같이 정의됩니다.
MSB LSB op1 op2 op3 op4 op5 op6 op7 op8 op9 S1 S2 S3
여기서 op1 ~ op9는 각각 1비트(0 = 덧셈 모드32 2, 1 = XOR)이고 S1 ~ S3은 각각 5비트입니다.
키 확장은 첫 번째 8개의 알고리즘 결정 키와 확장 키, 실행 키로서 키 확장 키를 사용하고 입력 블록으로서 데이터 키를 사용하는 8개의 암호 라운드는 8개의 암호 라운드로 구성됩니다., L2, 의 8개의 중간 은 키 0 0 의 8개의 로 사용됩니다. ...,
암호의 실장
다음은 Python에서의 암호 구현입니다.
# https://en.wikipedia.org/wiki/M8_(cipher) M = 0xffffffff 방어하다 더하다(x, y): 돌아가다 (x + y) & M 방어하다 xor(x, y): 돌아가다 x ^ y 방어하다 롤(x, s): 돌아가다 ((x << > s) (x >> (32 - s))) & M 방어하다 m8_라운드(L, R, 리, k, adk, 애크): """ 알고리즘의 1라운드 L, R: 입력 ri: 라운드 인덱스 k: 256비트 실행 키 adk: 24비트 알고리즘 결정 키 aeek: 96비트 알고리즘 확장 키 """ 동작 = [[더하다, xor][(adk >> (23 - i)) & 1] 위해서 i 에 범위(9)] S1 = (adk >> 10) & 0x1f S2 = (adk >> 5) & 0x1f S3 = (adk >> 0) & 0x1f A = (애크 >> 64) & M B = (애크 >> 32) & M C = (애크 >> 0) & M KR = (k >> (32 + 64 * (3 - 리 % 4))) & M KL = (k >> (0 + 64 * (3 - 리 % 4))) & M x = 동작[0](L, KL) y = 동작[2](동작[1](롤(x, S1), x), A) z = 동작[5](동작[4](동작[3](롤(y, S2), y), B), KR) 돌아가다 동작[8](동작[7](동작[6](롤(z, S3), z), C), R), L 방어하다 m8_키 확장(dk, 키, 점멸., 에크): """ 키 확장 dk: 64비트 데이터 키 kek: 256비트 키 확장 키 애드: 알고리즘 결정 키 AEK: 알고리즘 확장 키 """ L = (dk >> 32) & M R = (dk >> 0) & M k = 0 위해서 i 에 범위(8): L, R = m8_라운드(L, R, i, 키, 점멸.[i], 에크[i]) k = (L << > (32 * (7 - i))) 돌아가다 k 방어하다 m8_module(데이터., N, dk, 키, 점멸., 에크): """ M8로 한 블록을 암호화합니다. 데이터: 64비트 입력 블록 N: 라운드 수(>= 8이어야 함) dk: 64비트 데이터 키 kek: 256비트 키 확장 키 adks: N개의 24비트 알고리즘 결정 키 목록 eks: N 96비트 알고리즘 확장 키 목록 """ ek = m8_키 확장(dk, 키, 점멸., 에크) L = (데이터. >> 32) & M R = (데이터. >> 0) & M 위해서 i 에 범위(N): L, R = m8_라운드(L, R, i, ek, 점멸.[i], 에크[i]) 돌아가다 (L << > 32) R # ISO/IEC 9979/0020에서 공개된 테스트 벡터 결과 = m8_module( 0x0000_0000_0000_0001, 126, 0x0123_4567_89AB_CDEF, 0, [0x848B6D, 0x8489BB, 0x84B762, 0x84EDA2] * 32, [0x0000_0001_0000_000000_0000] * 126, ) 주장하다 결과 == 0xFE4B_1622_E446_36C0
테스트 벡터
ISO/IEC 9979-0020의 공개 버전에는 다음과 같은 테스트 데이터가 포함되어 있습니다.
- 라운드 번호: 126
- 키 확장 키: 0256(전체 제로의 벡터)
- 데이터 키: 0123 4567 89AB CDEF(16진수)
- 알고리즘 결정 키:
- 라운드 1, 5, 9, ...: 848B6D 16진수
- 라운드 2, 6, 10, ...: 8489BB 16진수
- 라운드 3, 7, 11, ...: 84B762 16진수
- 라운드 4, 8, 12, ...: 84EDA2 16진수
- 알고리즘 확장 키: 0000 0001 0000 0000 0000 모든 라운드의 16진수
- 보통 텍스트: 00000000000001 16진수
- 7라운드 후의 암호문: C5D6 FBAD 76AB A53B 16진수
- 14라운드 후 암호문: 6380 4805 68DB 1895 16진수
- 21라운드 후의 암호문: 2BFB 806E 1292 5B18 16진수
- 28라운드 후의 암호문:F610 6A41 88C5 8747 16진수
- 56라운드 후의 암호문: D3E1 66E9 C50A 10A2 16진수
- 126라운드 후의 최종 암호문: FE4B 1622 E446 36C0 16진수
암호 분석
암호의 키 의존적인 동작으로 인해 암호는 차동 암호 분석, 선형 암호 분석 및 mod n 암호 [2]분석 등 다양한 공격에 노출됩니다.
레퍼런스
- ^ "ISO/IEC9979-0020 Register Entry" (PDF). Professor Chris Mitchell, Information Security Group, Royal Holloway, University of London. ISO/IEC 9979 Register of Cryptographic Algorithms.
- ^ Toshio Tokita; Tsutomu Matsumoto. "On Applicability of Differential Cryptanalysis, Linear Cryptanalysis and Mod n Cryptanalysis to an Encryption Algorithm M8 (ISO9979-20)". Ipsj Journal. 42 (8).