AES 암호화 알고리즘의 주요 단계
1..1AES 알고리즘에 대한 전반적인 설명
L 은 상태를 x 로 초기화하고, AddRoundKey 연산을 수행하고, RoundKey 를 상태와 다르게 또는 연산하는 일반 텍스트 x 를 제공합니다.
L 앞의 Nr- 1 바퀴의 각 바퀴에 대해 S 박스 쌍은 대체 작업에 사용되며 이를 하위바이트라고 합니다. 을 눌러 섹션을 인쇄할 수도 있습니다 State, ShiftRows 를 교체합니다. 을 눌러 섹션을 인쇄할 수도 있습니다 State, MixColumns; 에 대한 작업을 다시 해보겠습니다. 그런 다음 AddRoundKey 작업을 수행합니다.
L SubBytes, ShiftRows, AddRoundKey 작업을 차례로 수행합니다.
L 상태를 암호문 y 로 정의합니다.
1.2 의사 코드
암호 (바이트 입력 [4*Nb], 바이트 출력 [4*Nb], 단어 w[Nb*(Nr+ 1)])
시작
바이트 상태 [4, Nb]
상태 = 입력
Addroundkey (상태, w[0, Nb- 1])
Round = 1 의 경우 1 에서 Nr- 1 까지
하위 바이트 (상태)
ShiftRows (주)
혼합 열 (상태)
Addroundkey (상태, w[round*Nb, (round+ 1)*Nb- 1])
마무리
하위 바이트 (상태)
ShiftRows (주)
Addroundkey (상태, w[Nr*Nb, (Nr+ 1)*Nb- 1])
Out = 상태
끝
2 키 확장 () 구현
2. 1 요구 사항
암호화 과정에서 128 bit 의 키를 9 라운드로 확장한 다음 초기 및 마지막 두 라운드 후에 1 1 바퀴의 키를 구성합니다. 각 라운드 키는 네 단어로 구성됩니다. 각 단어는 4 바이트로 구성되어 있습니다.
2.2 알고리즘 설계
입력: byte[] key, byte[] w //key 는 키이고 w 는 확장 키입니다.
출력: byte[] w // 확장 키 길이는 4 * 4 * 1 1 입니다.
운반:
1) 단어를 저장할 4 바이트 1 차원 배열을 만듭니다. Byte [] temp;
2) 키 [0. 15] 를 w [0.15] 로 보냅니다. //이미 W 에게 네 글자를 부여했다.
3) I 의 경우 = 4 ~ 43
//다음은 한 번에 한 단어 (32 비트) 를 처리합니다
Temp = w [I-1];
If (I = 0 mod 4) // 한 단어를 처리한 다음.
J = 1 ~ 4 // 단어의 4 바이트 처리
이 루프에서 temp 배열 인덱스를 가져오는 순서는 1, 2,3,0//rotword 작업입니다.
단어의 첫 번째 바이트인 경우 Rcon 상수 rcon (I/4) 을 취합니다.
Temp [j] = sbox (temp [(j+1)/4] rcon 상수.
마무리
Temp = subword (rotword (temp)) ⊓rcon [I/4]
만약 ... 끝날거야
W [I] = w [I-4] ⊓temp;
마무리
4) 출력 w
3 다항식 곱셈 모드 GF(28) 연산
3. 1 요구 사항
유한 필드 GF(28) 의 2 바이트와 다항식을 곱합니다. 모듈러스 환원 불가능한 다항식 m(x)=x8+x4+x3+x+ 1.
3.2 알고리즘 설계
입력: 바이트 a, 바이트 b
출력: 바이트 r
수학의 기초:
GF(28) 유한 필드의 특성: 두 요소의 추가는 비트 패턴에 따라 2 바이트의 추가와 일치합니다. 곱셈은 결합법을 만족시킨다.
다항식의 aixi (I ∨ 0-7) 중 하나를 고려하여 다항식에 선형 x 를 곱합니다.
B (x) = b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+B0,
얻다
B7x8+b6x7+b5x6+b4x5+b3x4+b2x3+b 1 x2+b0x (공식1).
결과 모드 m(x) 은 x*b(x) 를 얻기 위해 보충됩니다.
B7 = 0 이면 공식 1 은 x*b(x) 입니다.
B7 이 0 이 아닌 경우 방정식 1 에서 m(x) 을 빼야 x*b(x) 가 됩니다. 약칭 다항식에 x 를 곱합니다.
이로써 aixi 에 b(x) 를 곱하면 I 배를 곱할 수 있다는 결론을 내릴 수 있다. X 의 곱셈 (16 진수는 0x02 로 표시) 은 바이트를 한 자리 왼쪽으로 이동한 다음 0x 1b 의 비트 모듈 2 에 추가하여 수행할 수 있습니다. 이 작업은 일시적으로 xtime () 으로 기록됩니다. Xtime () 을 반복해서 적용하면 x 의 높은 곱셈을 수행할 수 있습니다. 중간 결과를 더하면 xtime () 을 사용하여 모든 곱셈을 수행할 수 있습니다. 예를 들면 다음과 같습니다.
57 * 13 = Fe, 그 이유는 다음과 같습니다.
57 * 02 = xtime(57) = AE
57 * 04 = xtime(ae) = 47
57 * 08 = xtime(47) = 8e
57 * 10 = xtime(8e) = 07
그래서
57 *13 = 57 * (01⊔ 02 ⊒10)
= 57⊕ ae⊕ 07
= 철
4 세대 Sbox
4. 1 요구 사항
1 바이트 byte 를 유한 필드 GF(28) 의 다항식으로 간주하고 모듈 m(x) 에 대한 곱셈 역수를 계산한 다음 GF(2) 에 대한 부등각 변환을 수행합니다.
4.2 알고리즘 설계
입력: 바이트 a
출력: 바이트 [] S
수학 논리:
유한 필드 GF(28) 특성에 따라. A (28-1) Ͱ1mod m (x) 의 a 를 갖는 생성기 (원본이기도 함) a 입니다. 또는 a255 Ͱ1mod m (x). 또한 A 가 1 에서 28- 1 까지의 제곱은 유한 도메인 GF(28) 를 구성합니다.
곱셈에 의한 b * b-1Ͱ1의 특성. 곱셈의 역수를 구하면 다음과 같이 단순화할 수 있다
X = am, y 를 x 의 곱셈역이라고 설정하면 y = a255-m 입니다.
운반:
바이트 s [255], 바이트 l [255], 바이트 e [255] 의 세 가지 배열을 설정합니다.
원어를 a = 0x03 으로 설정하고,
A 의 0, 1, 2 ... 255 제곱 모듈 m(x) 을 각각 배열 L 로 보냅니다. A 의 연산은 앞의 다항식 곱셈을 나타냅니다. 다음은 의사 코드입니다.
I = 0 ~ 255 인 경우
L[i] = ai (공식 2)
마무리
곱셈역지수를 쉽게 계산할 수 있도록 배열 E 는 ai 의 거듭제곱 지수 I 를 저장합니다. 방정식 2 의 ai 값을 배열 e 의 아래 첨자로 설정하고 배열 L 의 ai 의 아래 첨자 I 는 배열 e 의 해당 값입니다 ... 공식 2 의 각 항목에는 E[ai] = I 가 있습니다.
위의 두 배열 L, E 에서 GF(28) 필드의 임의 바이트의 곱셈 역수를 얻을 수 있습니다.
바이트 c 가 ai 에 의해 생성되도록 합니다. 여기서 a 는 GF(28) 도메인의 생성자입니다. C 의 곱셈 역연산을 찾으려면 A255-i 만 찾으면 됩니다 ... 배열 e 에서 생성기 a 의 거듭제곱 지수 I 는 c 를 통해 찾을 수 있습니다 .. C- 1 의 거듭제곱 지수는 255-i 입니다. c-1=;
각 바이트의 경우 위의 내용에 따라 곱셈 역효과를 얻고 아핀 변환을 통해 배열 S 를 얻습니다. Sbox 입니다